シストレどうですか

  Algorithmic Trading for Dummies

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以外のろうそくチャートを表示させるパッケージはないかと調べたところ、plotlyBokehが使えそうな感じでした。 私のPCのPython環境はAnacondaで設定しましたのが、これらの3つすべてcondaでインストールする事もできました。 というわけですので、この3つについていろいろ試した結果を書きたいと思いグラフの書き方について調べ始めました。 と言いつつ途中で面倒くさくなってしまいましたので、今回はplotlymplfinanceの2つに絞ります。



plotlyでろうそく足チャート


参考にしたマニュアルは英語版になりますがplotlyの公式サイト内にあるろうそく足チャートの事例と引数の説明があるページです。

ろうそく足チャートの事例は、

plotly.com

引数の説明は、

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を生成後にこれを実行すると自動的にブラウザーが立ち上がり以下のようなろうそく足チャートが表示されます。

f:id:jantzen:20200812094401p:plain
ろうそく足チャート 1 (USD/JPY 5分 10本)

モジュールのインポートを含めてたった4行の命令を追加するだけでろうそく足のグラフが表示されましたね。 とりあえずデータの数が少なかったので、ろうそくというよりはちょうちんか駒のような形になってしまいましたので、次はろうそく足にみえるようにもっとデータ量増やして1,000にしてみます。

f:id:jantzen:20200812094405p:plain
ろうそく足チャート 2 (USD/JPY 5分 1,000本)

ろうそく足チャートらしくなりましたが、おやおやよく見ると途中で大きな隙間ができています。
調べてみると、日付の場合ではx軸がカレンダーとして土日もきちんと考慮しているようなので、データがないと間が飛んだようになってしまいます。 日足くらいならちょっと間があいたくらいで使えないことはないですが、短い足の場合はちょっとカッコ悪すぎです。
こういうのは気になるたちなのでどうにかならないか調べましたが、なかなか複雑そうで私の手には負えませんのであきらめようかと思ったいた所これを解決してくれるパラメータがあるのを発見しました。
xaxisのtypeというキーにcategoryという値をセットしてあげると一発解決です。

xaxis={"title": "Date-Time",
            "type" : "category",
         },
    

このようにパラメータを変更した後に実行すると、

f:id:jantzen:20200812094409p:plain
ろうそく足チャート 3 (USD/JPY 5分 1,000本 間隔なし)

見事に隙間が消えてなくなりました。(安心)
でも今度は時刻の表示が見づらくなってしまいました。どうやらcategoryにすると日付として認識してくれないようです。
違う方法としては時刻のフォーマットをY-M-DからY/M/Dのようにplotlyが日付として認識できないフォーマットに編集するだけでcategoryとして認識するので隙間が空かなくなるようです。

community.plotly.com


とりあえずはろうそくチャートらしくはなりました。


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


これをチャートに表示させると、

f:id:jantzen:20200812094345p:plain
ろうそく足チャート 1 (USD/JPY 5分 10本)

plotlyと同様に簡単に表示されました。 ただし、初期値のままでグラフ表示させると白黒でなんとも味気ない感じです。
ろうそく足の数を増やしてみると、

f:id:jantzen:20200812094350p:plain
ろうそく足チャート 2 (USD/JPY 5分 1,000本)

黒一色でさらに見にくいです。
良い点としては、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)

に置き換えます。

f:id:jantzen:20200812094356p:plain
ろうそく足チャート 3 (USD/JPY 5分 1,000本 移動平均と取扱高)

チャート上に移動平均線と取扱高が表示されています。


まとめ


plotlyとmplfianceのどちらも簡単にチャートが表示できることがわかりました。 あくまでも初心者レベルの基本的な機能の分だけの評価になってしまいますが、 両者を比べた感想としては、

  • plotly
    • 見た目がきれい
    • カーソルを動かすと見たい情報がポップアップされる
    • チャートの表示速度が遅い
  • mplfinance
    • 色がきつい・ひげが太い(気がする?)
    • 基本的なチャートは簡単
    • チャートの表示速度が速い


データ量が多い場合はmplfinance、そうでなければ見た目の良いplotlyを使いたい。 と言ったところでしょうか。