OANDA API 解説編 第5回 ろうそく足をグラフにしてみる (plotlyとmplfinance)
OANDA APIで取得したろうそく足をpandasのDataFrameに変換する方法ができたので、今回はそれをチャート化してみました。
はじめに
ろうそく足をチャートにする際に、まず初めにサンプル事例が多い方がいいと思いいろいろ調べてみるとmatplotlib.financeを使った事例が多かったので、これで作ってみようかと思いましたが、な、なんとすでに廃版らしい。
This module is deprecated in 2.0 and has been moved to a module called mpl_finance.
finance matplotlib.finance
の一文字が・・・("deprecated" =廃止予定≒非推奨≒使えないことはないけど的な)。そしてmpl-financeに移行するとあります。 で今度はmpl-financeをインストールしようかと思いまた調べてみると、
This package is DEPRECATED, replaced by https://github.com/matplotlib/mplfinance
GitHub - matplotlib/mpl-finance: This package is DEPRECATED, replaced by https://github.com/matplotlib/mplfinance
これまた"DEPRICATED"の文字が・・・😰 ですが今度はmplfinanceがあたらしいバージョンとの事で、どうやらこれが最新版らしい。 (今日(2020年8月11日)時点では、バージョン: v0.12.7a0 リリース日:2020年8月9日との事)
mplfinanceのサイトはここから github.com
2020年半ばまでにmpl-financeをリプレースするとあります。
更にmplfinance以外のろうそくチャートを表示させるパッケージはないかと調べたところ、plotlyとBokehが使えそうな感じでした。
私のPCのPython環境はAnacondaで設定しましたのが、これらの3つすべてcondaでインストールする事もできました。
というわけですので、この3つについていろいろ試した結果を書きたいと思いグラフの書き方について調べ始めました。
と言いつつ途中で面倒くさくなってしまいましたので、今回はplotlyとmplfinanceの2つに絞ります。
plotlyでろうそく足チャート
参考にしたマニュアルは英語版になりますがplotlyの公式サイト内にあるろうそく足チャートの事例と引数の説明があるページです。
ろうそく足チャートの事例は、
引数の説明は、
plotly.graph_objects: low-level interface to figures, traces and layout — 4.9.0 documentation
https://plotly.com/python-api-reference/plotly.graph_objects.html
(パラメータで何を指定すればよいかわからない時に調べるには検索しずらいマニュアルではあります🙄)
前回ろうそく足をpandasのDataFrameに変換しましたので、早速このデータを使ってチャートを描画したいと思います。 DataFrameには以下のようなデータが格納されています。
complete volume time mid_o mid_h mid_l mid_c instrument granularity time_JST 0 True 176 2020-08-11T23:45:00.000000000Z 106.501 106.514 106.498 106.498 USD_JPY M5 2020-08-12 08:45 JST 1 True 200 2020-08-11T23:50:00.000000000Z 106.498 106.536 106.495 106.521 USD_JPY M5 2020-08-12 08:50 JST 2 True 126 2020-08-11T23:55:00.000000000Z 106.520 106.527 106.494 106.494 USD_JPY M5 2020-08-12 08:55 JST 3 True 507 2020-08-12T00:00:00.000000000Z 106.492 106.520 106.457 106.515 USD_JPY M5 2020-08-12 09:00 JST 4 True 480 2020-08-12T00:05:00.000000000Z 106.513 106.564 106.508 106.544 USD_JPY M5 2020-08-12 09:05 JST 5 True 222 2020-08-12T00:10:00.000000000Z 106.543 106.568 106.538 106.560 USD_JPY M5 2020-08-12 09:10 JST 6 True 242 2020-08-12T00:15:00.000000000Z 106.559 106.588 106.552 106.580 USD_JPY M5 2020-08-12 09:15 JST 7 True 188 2020-08-12T00:20:00.000000000Z 106.578 106.582 106.563 106.565 USD_JPY M5 2020-08-12 09:20 JST 8 True 247 2020-08-12T00:25:00.000000000Z 106.566 106.616 106.555 106.612 USD_JPY M5 2020-08-12 09:25 JST 9 False 214 2020-08-12T00:30:00.000000000Z 106.614 106.654 106.608 106.636 USD_JPY M5 2020-08-12 09:30 JST
DataFrameの列名をPlotlyの関数に当てはめていけば、単純なグラフならあっという間に完成です。
#plotyモジュールの追加 import plotly.graph_objects as go #タイトル用の変数の取得 Pair = df.iat[0,7] Ashi = df.iat[0,8] #レイアウトの設定 layout = go.Layout( title="Candlestcik Chart : " + Pair + " " + Ashi, xaxis={"title": "Date-Time", }, yaxis={"title": "Price"}, xaxis_rangeslider_visible = False ) #チャートデータの設定 fig = go.Figure(data=[go.Candlestick(x=df['time'], open=df['mid_o'], high=df['mid_h'], low=df['mid_l'], close=df['mid_c'])], layout = layout ) #チャートの表示 fig.show()
DataFrameを生成後にこれを実行すると自動的にブラウザーが立ち上がり以下のようなろうそく足チャートが表示されます。
モジュールのインポートを含めてたった4行の命令を追加するだけでろうそく足のグラフが表示されましたね。
とりあえずデータの数が少なかったので、ろうそくというよりはちょうちんか駒のような形になってしまいましたので、次はろうそく足にみえるようにもっとデータ量増やして1,000にしてみます。
ろうそく足チャートらしくなりましたが、おやおやよく見ると途中で大きな隙間ができています。
調べてみると、日付の場合ではx軸がカレンダーとして土日もきちんと考慮しているようなので、データがないと間が飛んだようになってしまいます。
日足くらいならちょっと間があいたくらいで使えないことはないですが、短い足の場合はちょっとカッコ悪すぎです。
こういうのは気になるたちなのでどうにかならないか調べましたが、なかなか複雑そうで私の手には負えませんのであきらめようかと思ったいた所これを解決してくれるパラメータがあるのを発見しました。
xaxisのtypeというキーにcategoryという値をセットしてあげると一発解決です。
xaxis={"title": "Date-Time", "type" : "category", },
このようにパラメータを変更した後に実行すると、
見事に隙間が消えてなくなりました。(安心)
でも今度は時刻の表示が見づらくなってしまいました。どうやらcategoryにすると日付として認識してくれないようです。
違う方法としては時刻のフォーマットをY-M-DからY/M/Dのようにplotlyが日付として認識できないフォーマットに編集するだけでcategoryとして認識するので隙間が空かなくなるようです。
とりあえずはろうそくチャートらしくはなりました。
mplfianceでろうそく足チャート
前述の通りmplfinanceのサイトはここからです。(日本語訳はみつかりません。)
github.com
plotlyと同じDataFrameを使ってmplfincaneでろうそく足チャートを表示させます。
ただし、パラメータに指定できる値はplotlyに比較すると厳密なので、DataFrameを変更する必要があります。
まずはx軸に表示させる時刻ですが、DatetimeIndexでないと指定できません。
それと始値・高値・安値・終値が格納されている列名もそれぞれ正確に"Open"・ "High"・"Low"・ "Close"と指定してかつ属性もfloat型でないとエラーになります。
(私の使用しているmplfinanceのバージョンはv0.12.4a0ですので初めの一文字が大文字ではないといけないのですが、どうやらv0.12.6a3以降では小文字も認められるようになっているようです。
mplfinance/RELEASE_NOTES.md at master · matplotlib/mplfinance · GitHub
)
下の例ではDataFrameをmplfiinanceで使えるように新しいDataFrameにコピーした上で必要に応じて変更を加えた後にチャート表示を行っています。
#mplfiianceの追加 import mplfinance as mpf #DataFrameの時刻用の列をDateTimeインデックスに変換 x.df.set_index(pd.to_datetime(df['time']), inplace=True) #要素の属性をfloat型に変換 new_df = df[['mid_o', 'mid_h', 'mid_l', 'mid_c', 'volume' ]].astype(float) #列名を指定された名前に変更 new_df.columns = ['Open', 'High', 'Low', 'Close', 'Volume'] #チャートの表示 mpf.plot(new_df,type='candle')
変更したDataFrameは以下のような形になります。
Open High Low Close Volume time 2020-08-11 23:45:00+00:00 106.501 106.514 106.498 106.498 176.0 2020-08-11 23:50:00+00:00 106.498 106.536 106.495 106.521 200.0 2020-08-11 23:55:00+00:00 106.520 106.527 106.494 106.494 126.0 2020-08-12 00:00:00+00:00 106.492 106.520 106.457 106.515 507.0 2020-08-12 00:05:00+00:00 106.513 106.564 106.508 106.544 480.0 2020-08-12 00:10:00+00:00 106.543 106.568 106.538 106.560 222.0 2020-08-12 00:15:00+00:00 106.559 106.588 106.552 106.580 242.0 2020-08-12 00:20:00+00:00 106.578 106.582 106.563 106.565 188.0 2020-08-12 00:25:00+00:00 106.566 106.616 106.555 106.612 247.0 2020-08-12 00:30:00+00:00 106.614 106.654 106.608 106.636 214.0
これをチャートに表示させると、
plotlyと同様に簡単に表示されました。
ただし、初期値のままでグラフ表示させると白黒でなんとも味気ない感じです。
ろうそく足の数を増やしてみると、
黒一色でさらに見にくいです。
良い点としては、plotlyとは違い休日の扱いは初期値(show_nontrading=False)で間があかないようになっています。
また、styleというパラメータを使うとテンプレートが用意されていて細かい色や線の指定をする必要がありませんので、簡単にデザインが変更できてとても便利です。
(どれも色具合がちょっときつい感じがしますので個人的にはろうそく足用の色使いとしてはあまりなじめないのですが・・・)
mplfinance/styles.ipynb at master · matplotlib/mplfinance · GitHub
mplfinanceには出来高と移動平均線はパラメータで用意されていますので、簡単に追加できてしまします。
mpf.plot(new_df,type='candle')
の部分を
mpf.plot(new_df,type='candle', mav=(50,100), volume=True)
に置き換えます。
チャート上に移動平均線と取扱高が表示されています。
まとめ
plotlyとmplfianceのどちらも簡単にチャートが表示できることがわかりました。
あくまでも初心者レベルの基本的な機能の分だけの評価になってしまいますが、
両者を比べた感想としては、
- plotly
- 見た目がきれい
- カーソルを動かすと見たい情報がポップアップされる
- チャートの表示速度が遅い
- mplfinance
- 色がきつい・ひげが太い(気がする?)
- 基本的なチャートは簡単
- チャートの表示速度が速い
データ量が多い場合はmplfinance、そうでなければ見た目の良いplotlyを使いたい。
と言ったところでしょうか。