クリプト

mplfinanceでボリンジャーバンド

handa's icon'
  • handa
  • 2023/02/22 03:22

仮想通貨取引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とすると、図が描けずにプログラムが終わってしまいます。

プロットしたグラフはこのようになりました。

Content image
ボリンジャーバンドを付与したロウソク足チャート

グラフを追加して、出来高の下に別のグラフを出すこともできました。

Content image
ADXのグラフを追加した

 

 

やってみて思ったのは...

・やっぱり凡例を出したい。

・価格が3.31(1e6)と対数表示となってしまうので、3310000のように普通に表示したい。

・追加グラフのY軸ラベルを表示できない。

というところ。matplotlibの細かい設定をすればできるのかもしれません。

 

今日の損益、今月の損益の取得は、直接はビットフライヤーはAPIを提供していません。かわりに約定履歴は取得できるので、それが使えそうです。この人のブログが参考になりそう。すごいなぁ。

 

以上

 

Supporter profile iconSupporter profile iconSupporter profile iconSupporter profile iconSupporter profile icon
Article tip 5人がサポートしています
獲得ALIS: Article like 38.90 ALIS Article tip 30.59 ALIS
handa's icon'
  • handa
  • @handa
コンピュータシステムの開発、子供向けプログラミング教室などを行っています。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

Like token Tip token
61.20 ALIS
Eye catch
クリプト

Eth2.0のステークによるDeFiへの影響を考える。

Like token Tip token
44.10 ALIS
Eye catch
クリプト

コインチェックに上場が決まったEnjin Coin(エンジンコイン)コインを解説

Like token Tip token
21.49 ALIS
Eye catch
クリプト

【初心者向け】$MCHCの基本情報と獲得方法

Like token Tip token
32.32 ALIS
Eye catch
クリプト

【第8回】あの仮想通貨はいま「テレグラム-TON/Gram」

Like token Tip token
69.90 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
クリプト

Uniswap(ユニスワップ)で$ALISのイールドファーミング(流動性提供)してみた

Like token Tip token
59.99 ALIS
Eye catch
クリプト

クリプトスペルズで入手したMCHCを引き出す方法

Like token Tip token
196.20 ALIS
Eye catch
クリプト

2021年1月以降バイナンスに上場した銘柄を140文字以内でざっくりレビュー(Twitter向け情報まとめ)

Like token Tip token
38.10 ALIS
Eye catch
クリプト

UNISWAPでALISをETHに交換してみた

Like token Tip token
40.40 ALIS
Eye catch
クリプト

Uniswap v3を完全に理解した

Like token Tip token
18.92 ALIS
Eye catch
クリプト

NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

Like token Tip token
121.79 ALIS