仮想通貨取引Botを動かしています。通貨はBTC-FXです。ビットフライヤーで動作状況を確認するためや市場の状況を見るためにときどきログインをしますが、IDとパスワードを毎回打つのが面倒です。
Pythonでグラフを描くmatplotlibというすばらしいライブラリがあります。その派生で、金融に特化したグラフを描くmplfinanceというものがあると知りました。GitHubはこちらです。
mplfinanceは、ohlcvデータを与えるとグラフが簡単に描ける優れものです。私はBotでボリンジャーバンドを使っているので、mplfinanceでボリンジャーバンドが描くことができれば、ビットフライヤーにログインする回数を減らせると思いプログラムを作ってみました。
インストールは
pip install mplfinance
とします。
mplfinanceのインポートは
import mplfinance as mpf
とします。
まず、直近のohlcvデータを取引所から取得します。私のBotはccxtというライブラリを使って作っていますが、ccxtはビットフライヤーからはohlcvデータをうまく取得できないため、ここは自作ライブラリを使っています。期間は1分足です。
df = ohlcv.get_ohlcv(exchange, pair, "60s", 1)
if df.empty:
print("ohlcv情報を取得できません。")
exit()
データフレームdfをprintするとこのようなデータです。Open, High, Low, Close, Volumeという列名にしておくと、mplfinanceに正しく値を渡せます。
Timestamp Open High Low Close Volume
0 2023-02-19 11:19:00 3311438.0 3311778.0 3311185.0 3311778.0 0.768227
1 2023-02-19 11:20:00 3311469.0 3312618.0 3311345.0 3312618.0 0.611852
2 2023-02-19 11:21:00 3312648.0 3313630.0 3312645.0 3313630.0 0.851840
3 2023-02-19 11:22:00 3313290.0 3313795.0 3313104.0 3313440.0 0.492988
4 2023-02-19 11:23:00 3313693.0 3313693.0 3313349.0 3313693.0 0.816953
5 2023-02-19 11:24:00 3313693.0 3313865.0 3312894.0 3312894.0 2.106768
6 2023-02-19 11:25:00 3312894.0 3312971.0 3312073.0 3312073.0 1.993450
7 2023-02-19 11:26:00 3312009.0 3312268.0 3311023.0 3311499.0 1.020999
8 2023-02-19 11:27:00 3311479.0 3312000.0 3309600.0 3310229.0 3.881758
9 2023-02-19 11:28:00 3309780.0 3310575.0 3309575.0 3309946.0 2.828693
このデータが日付の昇順に並んでいることが保証されていないのであれば、
# 日付の古い順に並び替え
df.sort_index(inplace=True)
として並び換えます。
データの期間を設定します。ここでは180期間(180分)とします。
# 最新180期間のデータとする。
df = df.tail(180)
ボリンジャーバンドを取得します。まず、取得関数です。取得期間はデフォルトで20としています。小なり記号(<)は半角に直してください。
def get_bollingerband(df, n=20):
if n < 10:
return None
df = df.fillna(method="ffill")
df["mean"] = df["Close"].rolling(window=n).mean()
df["std"] = df["Close"].rolling(window=n).std()
df["lower3"] = df["mean"] - (df["std"] * 3)
df["lower2"] = df["mean"] - (df["std"] * 2)
df["lower1"] = df["mean"] - (df["std"] * 1)
df["upper1"] = df["mean"] + (df["std"] * 1)
df["upper2"] = df["mean"] + (df["std"] * 2)
df["upper3"] = df["mean"] + (df["std"] * 3)
return df
取得関数の呼び出しです。
# ボリンジャーバンドを取得する。
df = get_bollingerband(df)
mplfinanceでは、日付列はDatetimeIndex型とする必要があります。私のライブラリでは日付列はDatetimeIndex型とならないので、変換します。
# Timestamp列をDatetimeIndex型にする。
df["Timestamp"] = pd.to_datetime(df["Timestamp"])
df.set_index("Timestamp", inplace=True)
ここまでで、準備ができました。
次は、取得したボリンジャーバンドをグラフへの追加情報とします。lower3は-3σ、meanは移動平均、upper3は+3σです。線の種類を変える場合は、ここにlinestyle='dotted'(点線)などと追加指定します。
# 追加情報として、ボリンジャーバンドの線を加える。
add = mpf.make_addplot(
df[['lower3', 'mean', 'upper3']], # ボリンジャーバンドの移動平均と±3σ
alpha=0.5 # 透過度
)
上で作った追加情報も使ってチャートをプロットします。各パラメタの意味はコメントを見てください。
# ローソク足チャートをプロットする。
fig, axes = mpf.plot(
df, # データフレーム
type='candle', # グラフ種類
addplot=add, # make_addplotによる追加情報
title='bitFlyer Bollinger Band', # グラフのタイトル
figscale=1.3, # 図の大きさの倍率を指定、デフォルトは1
figratio=(16,9), # グラフの縦横比
panel_ratios=(8,2), # パネルの縦比
volume=True, # Volumeを表示する
datetime_format='%Y/%m/%d %H:%M', # 日付表示の書式
returnfig=False # 凡例の表示(しない)
)
fig.show()
凡例(legend)を表示したかったのですが、どうしてもうまく行きませんでした。ネットに凡例の例がいくつも載っていますが、どの方法を選んでもだめでした。plot()時にreturnfig=Trueとすると、図が描けずにプログラムが終わってしまいます。
プロットしたグラフはこのようになりました。
グラフを追加して、出来高の下に別のグラフを出すこともできました。
やってみて思ったのは...
・やっぱり凡例を出したい。
・価格が3.31(1e6)と対数表示となってしまうので、3310000のように普通に表示したい。
・追加グラフのY軸ラベルを表示できない。
というところ。matplotlibの細かい設定をすればできるのかもしれません。
今日の損益、今月の損益の取得は、直接はビットフライヤーはAPIを提供していません。かわりに約定履歴は取得できるので、それが使えそうです。この人のブログが参考になりそう。すごいなぁ。
以上