【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)
すごいいっぱい進んだ。驚異的。
あなたによって僕は生かされている。 私もあなたを生かせられますように。