Pythonのmplfinanceパッケージでローソク足のチャートを作る方法を紹介します。mplfinanceは多分一番簡単にローソク足が作れるだけでなく、インジゲーターなどのチャートも追記可能です。
はじめに
インストール
mplfinanceは標準パッケージではありません。インストールが必要です。
pip install mplfinance
インポート
インポートは公式サイトに従って、別名にしています。
import mplfinance as mpf
JupyterなどのNotebookを使う場合のおまじない
%matplotlib inlineというおまじないを読み込ませることにより画像が表示されるようになります。
%matplotlib inline import mplfinance as mpf
データのサンプル
データのレイアウトは以下のようになっています。基本的にOANDA JAPANからダウンロードしたデータにmacdとボリンジャーバンドを追加したのみです。

参考サイト
公式サイト

GitHub
基本(ローソク足を作成)
ローソク足だけであれば、以下だけで表示できます。
mpf.plot(データフレーム, type='タイプ', figratio=(X軸,Y軸))
- データフレーム:
- 値のカラム名は次のようにします。先頭文字が大文字になっていますので注意してください。
Open、High、Low、Close、Volume(使う場合のみ) - 日時はDatetimeIndexである必要があります。
- 値のカラム名は次のようにします。先頭文字が大文字になっていますので注意してください。
- type(タイプ)
- candle:ローソク足
- ohlc:変な足(デフォルト)
- line:線グラフ
- その他(renko、pnfがありますが意味不明です。
- figratio(X軸,Y軸)
- 初期値は不明ですが少し小さいので指定したほうがいいと思います。
mpf.plot(df, type='candle', figratio=(10,5))

*見た目がイマイチ?デザインの変更は最後に説明していますよ。
チャート画像をファイルで保存
savefig='パスとファイル名'を指定するだけです。
mpf.plot(df, type='candle', figratio=(10,5), savefig='filename.png')
出来高を表示
volume=Trueを追記するだけです。(データにVolumeの列が必要です。
mpf.plot(df, type='candle', volume=True, figratio=(10,5))

垂直(または水平)の補助線を表示
縦(または横)の補助線を1本引く
vlines=X軸のindexとして縦線を入れる箇所のX軸のインデックスを指定します。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
vlines='2019-01-01 23:15:00+00:00',
savefig='filename.png'
)
縦(または横)の補助線を複数本引く
vlines=[X軸のindex1, X軸のindex2]のようにリスト型で縦線を入れるX軸のインデックスを指定します。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
vlines=['2019-01-01 23:15:00+00:00', '2019-01-01 23:25:00+00:00'],
savefig='filename.png'
)
補助線に色を指定する
vlines=dict(vlines=X軸のindex,colors='色')とvlinesとcolorsを辞書型でまとめて指定します。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
vlines=dict(vlines='2019-01-01 23:15:00+00:00',colors='r'),
savefig='filename.png'
)
複数本の補助線で個別に色を指定する場合は以下のようにリスト型で指定します。
vlines=dict(vlines=[X軸のindex1, X軸のindex2],colors=['色1', '色2'])
個別でなく同じ色の場合はcolors='色'と指定します。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。

補助線のスタイルを指定する
linestyle='線の記号'と指定します。
複数本の補助線に個別にスタイルを指定することはできません。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
vlines=dict(vlines=['2019-01-01 23:15:00+00:00', '2019-01-01 23:25:00+00:00'],colors=['r', 'g'],linestyle='-.'),
savefig='filename.png'
)

補助線の線の太さを指定する
linewidths=太さ1と指定します。
複数本の補助線に個別に太さを指定する場合はlinewidths=[太さ1, 太さ2]とリスト形式で指定します。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
vlines=dict(vlines=['2019-01-01 23:15:00+00:00', '2019-01-01 23:25:00+00:00'],colors=['r', 'g'],linewidths=[1, 3]),
savefig='filename.png'
)

補助線の色の濃さ(アルファ)を指定する
alpha=濃さを指定します。
複数本の補助線に個別にスタイルを指定することはできません。
横線の場合はvlinesをhlinesとしてY軸の値を指定します。

斜線の補助線を表示
alines=pointsを追加します。
pointsには以下のようにX軸のインデックスとY軸の値を指定してリスト型でまとめます。
points = [(X軸のインデックス1,Y軸の値1),(X軸のインデックス2,Y軸の値2)]
線のスタイルや色、太さ、濃さは縦線と同じで辞書型にまとめて指定します。alines=dict(alines=points,linestyle='-.')など
dates = ['2019-01-01 23:15:00+00:00','2019-01-01 23:25:00+00:00','2019-01-01 23:35:00+00:00']
points = [
(dates[0],df[df.index == dates[0]].Close[0]),
(dates[1],df[df.index == dates[1]].Close[0]),
(dates[2],df[df.index == dates[2]].Close[0]),
]
print(points)
mpf.plot(
df,
type='candle',
volume=True,
figratio=(10,5),
alines=points,
savefig='filename.png'
)
移動平均線など別のチャートを表示
移動平均線
mav=(5, 25)と期間を指定して追記するだけです。1個以上指定することができますが、いくつまでOKかは不明です。4つは大丈夫でした。
mpf.plot(df, type='candle', volume=True, mav=(5, 25), figratio=(10,5))

ボリンジャーバンドなど他のカラムにあるデータを表示
一つの場合
apd = mpf.make_addplot(df['カラム名'])でデータを作成する。
addplot=apdを追加するだけです。
apd = mpf.make_addplot(df['bb_width']) mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5))

複数の場合
基本的には一つの場合と同じですが、予め挿入する列をデータフレームにまとめておく必要があります。
tcdf = df[['bb_up','bb_mid','bb_low']] # DataFrame with two columns apd = mpf.make_addplot(tcdf) mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5))

出来高にMacdなどの別のチャートを表示
一つの場合
別チャートを表示される場合と同じですが、panel='lower'と表示させる位置を指定します。
apd = mpf.make_addplot((df['macd']),panel='lower') mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5))

複数の場合
リスト型でまとめるだけでOKです。
apd = [
mpf.make_addplot((df['macd']),panel='lower'),
mpf.make_addplot((df['signal']),panel='lower')
]
mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5))
ラベルの表示
軸のラベル
ylabel='name'で軸のラベルを指定することができます。
apd = [
mpf.make_addplot( df_temp[['upc','lpc']]),
mpf.make_addplot(df_temp['aroon_up'],panel='lower',color='c', ylabel='aroon'),
mpf.make_addplot(df_temp['roc'],panel='lower',color='m', ylabel='roc')
]
mpf.plot(df_temp, addplot=apd, type='candle', figratio=(10,5))
ラインなどの凡例ラベル
私が調べた限り、標準の機能ではなさそうでした。
またグラフ内に文字を書き込むことも出来なさそうなので、自前で凡例を作成することもできないです。
チャート内に目印を表示
準備
事前に印を入れるデータを作成しました。
df.loc[df.index == "2019-01-01 23:12:00+00:00", "signal1"] = df[df.index == "2019-01-01 23:12:00+00:00"].High + 0.005 df.loc[df.index == "2019-01-01 23:28:00+00:00", "signal2"] = df[df.index == "2019-01-01 23:28:00+00:00"].Low - 0.005
チャートの作成
一つの場合
基本的には別チャートを表示させるのと同じです。データの列がnanは表示されないだけです。あとは見栄えの調整をしているだけですね。
apd = mpf.make_addplot(df['signal1'],scatter=True,markersize=100,marker='v') mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5),

複数の場合
こちらも出来高の別チャートなどと同じで、リストにまとめているだけです。
apd = [
mpf.make_addplot(df['signal1'],scatter=True,markersize=100,marker='v'),
mpf.make_addplot(df['signal2'],scatter=True,markersize=100,marker='^')
]
mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5),
デザインを変更
デザインの変更というより総集編という感じですね。
mpf.make_addplotで各種グラフのデザインを変更できます。
linestyle='線種'で線の種類を変更できます。dashdotとdottedしかわかりませんでした。color='色'で線の色を変更できます。指定方法は、色の頭文字と、16進コードでも可能です。
色の頭文字は以下です。- b: blue
- g: green
- r: red
- c: cyan
- m: magenta
- y: yellow
- k: black
- w: white
mpf.plotのstyle='starsandstripes'で全体のデザインを変更できます。
スタイルの種類は以下を参照してください。
でも海外なのでローソク足の青と赤の意味が逆なんですよね。。。クラッシくの白と黒は意味は同じですが。
tcdf = df[['bb_up','bb_mid','bb_low']]
apd = [
mpf.make_addplot(tcdf,linestyle='dashdot'),
mpf.make_addplot(df['signal1'],scatter=True,markersize=100,marker='v',color='c'),
mpf.make_addplot(df['signal2'],scatter=True,markersize=100,marker='^',color='m'),
mpf.make_addplot((df['macd']),panel='lower',color='g',linestyle='dotted'),
mpf.make_addplot((df['signal']),panel='lower',color='#e41a1c',linestyle='dotted')
]
mpf.plot(df, addplot=apd, type='candle', volume=True, figratio=(10,5), style='starsandstripes',
savefig='candlestick_mpf_mav.png')

コメント