見出し画像

【39日目】チャートを表示する準備【Django】

今日の画像のイメージは「準備」です。
画面作ったり、色々してきましたが、そろそろトレードする人っぽくチャートを描こうと思います。と思ったのですが下準備が大変そうなので、2日に分けることにしました。

0.Matplotlib vs plotly

チャートを表示すにはMatplotlibとplotlyのどちらかが良いのか判断が必要だったので、まずはそこを決めます。

Matplotlibが最も一般的だと思いますが、plotlyの方がいっぱい動かせて良さそうな感じです。
技術としては、どちらでもできそうです。
一方でいろんな業者が提供しているチャートは色々動かすことができます。

なので、自分もまずはplotlyでやってみようと思います。
その後、うまかなかったらMatplotlibで挑戦してみたいと思います。

1.plotlyのダウンロード

今回のplotlyは、conda install plotlyでインストールできるようです。

conda install plotly

2.表示するデータの取得

まず取得するデータは、データベースから引き抜いてきます。
時系列に新しいものから表示するのが基本だと思いますので、データベースから引き抜いてきます。

postする時の情報を基に、それにあったデータをとってくるのでpostの時に、チャートを表示することにします。
とってくるデータはまずは、ローソク足を描くのに必要な始値、終値、高値、安値とします。
また、とりあえず100件とってくることにします。

参考にした記事は、以下のもの。

実際に書いたコードは以下の通り。

   def post(self,request):
       choice_symbol = request.POST["choice_symbol"]
       choice_timeframe = request.POST["choice_timeframe"] 
       data = Rate.objects.all().values("open_rate", "high_rate", "low_rate", "close_rate")[:100]
       self.params['msg']="条件:"+ choice_symbol +", "+ choice_timeframe
       self.params['form'] = ChartForm(request.POST)
       self.params['data'] = data
       return render(request,'chart/index.html', self.params)

3.データをどう変換するか決める

取得したデータをplotlyでチャートの形に変形します。
まず取得したデータを見てみたところ、データは辞書型っぽい感じになっています。

一方、Plotlyに渡すべきデータはpnadasなどのデータのようです。

なんだかpandasではデータを時系列にできるらしいし、その方が都合良さそう。

4.データをpandasの形式に変換する

うまいやり方ができなかったので、愚直に一つずつ空のリストに代入していきます。

timestamp = []
open_rate = []
high_rate = []
low_rate = []
close_rate = []
for i in data:
    timestamp.append(i["timestamp"])
    open_rate.append(i["open_rate"])
    high_rate.append(i["high_rate"])
    low_rate.append(i["low_rate"])
    close_rate.append(i["close_rate"])

5.データを時系列のデータに変換する

データを時系列の形に変換します。

data_jisyo = {'open_rate':open_rate,"high_rate":high_rate,"low_rate":low_rate,"close_rate":close_rate}
df = pd.DataFrame(data_jisyo,index = timestamp).resample(choice_timeframe)

6.データの時系列の頻度を指定する

頻度の指定の仕方は以下の記事に載っていました。
それにしたがった記述にforms.pyを変更します。

from django import forms

class ChartForm(forms.Form):
   symbol = [
       ("XBTUSD","XBTUSD"),
       ("XBTJPY","XBTJPY")
       ]
   choice_symbol = forms.ChoiceField(label='symbol',choices=symbol)
   timeframe = [
       ("1T","1分足"),
       ("5T","5分足"),
       ("10T","10分足"),
       ("15T","15分足"),
       ("30T","30分足"),
       ("1H","1時間足"),
       ("4H","4時間足"),
       ("1D","日足"),
       ("1W","週足")
       ]
   choice_timeframe = forms.ChoiceField(label='timeframe',choices=timeframe)

7.データをOHLCのデータに変換する

元々OHLCのデータを使っている場合にpandasに用意されているOHLCを使うと(OHLCのそれぞれに対してOHLCを計算しに行くので)かなり変なことになりました。

agg()というメソッドを使うのが正解らしいです。

agg_jisyo = {'open_rate': 'first','high_rate': 'max','low_rate': 'min','close_rate': 'last'}
df = pd.DataFrame(data_jisyo,index = timestamp).resample(choice_timeframe).agg(agg_jisyo) 

すごいいっぱい進んだ。驚異的。

あなたによって僕は生かされている。 私もあなたを生かせられますように。