CCXTを使ってOrderbook情報をDepthChartとして"オシャレに"描画する


はじめに

皆さん、bitmexのdepthchartのデザイン、すこし見づらいと感じませんか?

(まあOrderbookも見づらいのですが)

image.png

オシャレな折れ線グラフでDepthchartが見れたらすごい便利だと思ったので、CCXTライブラリとPythonを用いて制作しました。


環境

Jupyter NoteBook,Python,matplotlib,pandas


depthchart.ipynb

%matplotlib inline

import pandas as pd
import numpy as np
import ccxt
from time import sleep
import matplotlib.pyplot as plt

mex = ccxt.bitmex()
mex.apiKey = "ここにapikeyを入力"
mex.secret = "ここにsecretを入力"

def depthchart(tf):
while True:
#エラーが出た場合の対処
try:
orderbook = mex.fetch_order_book("BTC/USD")
break
except ccxt.BaseError as e:
print("BitmexとのAPI通信にてエラーが発生しました。\nメッセージ内容は右記の通りです。:" + str(e))
print("再試行します")
sleep(10)
#データ加工処理
old_bids = pd.DataFrame(orderbook["bids"])
bids = old_bids.rename(columns = {0 : "price",1 : "amount"})
bids["depth"] = bids["amount"].cumsum()
#累積和を計算 累積和とは数学的に言うとその項までの和。この場合はその時点での列の合計です。
old_asks = pd.DataFrame(orderbook["asks"])
asks = old_asks.rename(columns = {0 : "price", 1 : "amount"})
asks = asks.iloc[::-1]
depi = pd.DataFrame({"depth" : asks["amount"]})
depi = depi.iloc[::-1]
asks["depth"] = depi["depth"].cumsum()
#めっちゃデータをこねくり回している。もっと綺麗にできると思うので要改善。

print("-----------------------------------\n" +
"asks data is here ↓")
print(asks)
print("-----------------------------------\n" +
"bids data is here↓")
print(bids)

depth = pd.concat([asks, bids])

median = bids["price"][0]
print("----------------------------------")
print("以下depthデーター ")
print(depth)

max = depth["depth"].max()

plt.xlabel("asks price bids ", fontsize=10, fontname='DejaVu Sans')
plt.ylabel("amount",fontsize = 10,fontname = "DejaVu Sans")
plt.title("orderbook", fontsize=25, fontname='DejaVu Sans')
plt.vlines(median, 0, max, linestyle='solid', linewidth=0.5,color = "black",alpha = 100)
plt.hlines(0,asks["price"][24],bids["price"][24],linestyle = "solid",linewidth = 0.5,color = "black",alpha = 100)
if tf == True:
plt.fill_between((asks["price"]),asks["depth"],color = "green",alpha =0.47)
plt.fill_between((bids["price"]),bids["depth"],color = "red",alpha = 0.47)
plt.fill_between((asks["price"]),asks["amount"],color = "white",alpha = 0.5)
plt.fill_between((bids["price"]),bids["amount"],color = "white",alpha = 0.5)

plt.plot(depth["price"],depth["depth"],marker = "o",markeredgewidth = 0)
#デフスチャートを出力する

elif tf == False:
#でふすじゃないの出力する
plt.plot(depth["price"],depth["amount"],marker = "o", markeredgewidth=0)

depthchart(True)


出力:

image.png


つくるとき詰まったところ


列のその行時点での合計を求めたかった

いろいろ試行錯誤した結果、cumsum()でできることがわかった

↓こんな感じ

image.png


グラフのしたを塗りつぶしたかった

plt.fill_between()で解決


おわりに

このDepthChart出力プログラムを使えば、今話題のMMbotのアルゴリズムにあると言われている、板の中央値から一定の注文数量の外側に注文を置く。といったことも可能になってくるかも。

DepthChartやOrderbookの制作に困っている人の助けになれば幸いです。

以上


参考にさせていただいたサイト

http://blog.mwsoft.jp/article/106251445.html

https://pythondatascience.plavox.info/matplotlib/%E6%8A%98%E3%82%8C%E7%B7%9A%E3%82%B0%E3%83%A9%E3%83%95

https://mkacky.wordpress.com/