noteのタイトル画像

[python] pybitflyer 板情報

目次
・pybitflyerで板情報取得
・見てるだけでも面白いもんだ

●pybitflyerで板情報取得

ちょっと前(今も?)までbot界隈を賑わせていたMMBotについて色々と調べていた。

読んでて、もっとも良くわかった記事は、

magimagi1223さんのnoteです。

私、最近の暑さと仕事でちょいと体調を崩しており、まとまったnote投下ができていませんでした。

新しいシステムを組むことになって、楽しくなって色々と深夜まで調査・研究していて、ちょいと無理してしまったようです。
(AWSか、Azureか、GCEか、、、迷ってます。サーバレス・アーキテクチャって楽しい。Dockerがまだうまく使えないので、もう少し時間が必要)

さて、今回のお題は「板情報」。

昔、「大きな板のちょっと手前に指値を投下する」という記事をどっかでみて、当時は全然わからないながらもBitMEXで板情報取得と売り買いの隙間(スプレッドっていうのですか?横文字をカタカナにする文化は止めてほしい)を見て、指値設定&値追従システムを組んだことはあります。
実際にはtestnet.bitmexでしか試しませんでしたけど。

それがMMBotの基本だということをmagimagi1223さんの記事をみて納得。

今回は勉強中のpythonで記述します。

#===============================================
# 外部モジュール
#===============================================
# bitflyer用のライブラリを読み込む
import pybitflyer
# time
import time

#===============================================
# 常数
#===============================================
# 対象とするペアを設定
# source = "BTC_JPY"
source = "FX_BTC_JPY"
# スリープ秒数
SLEEP_T = 1

#===============================================
# private api
#===============================================
# キー情報ファイルを読み込む
# import api_key
# api = pybitflyer.API(api_key=api_key.bitflyer_key, api_secret=api_key.bitflyer_secret)
#===============================================
# public api
#===============================================
api = pybitflyer.API()

# 対象を表示
print("=======================")
print("対象: " + source)

# boardデータ取得関数
def getBoard():
    board = api.board(product_code=source)
    # print(board)
    print("-- bids --")
    print(" price: " + str(board["bids"][0]["price"]) + ", size: " + str(board["bids"][0]["size"]))
    print(" price: " + str(board["bids"][1]["price"]) + ", size: " + str(board["bids"][1]["size"]))
    print(" price: " + str(board["bids"][2]["price"]) + ", size: " + str(board["bids"][2]["size"]))
    print(" price: " + str(board["bids"][3]["price"]) + ", size: " + str(board["bids"][3]["size"]))
    print(" price: " + str(board["bids"][4]["price"]) + ", size: " + str(board["bids"][4]["size"]))
    print("-- asks --")
    print(" price: " + str(board["asks"][0]["price"]) + ", size: " + str(board["asks"][0]["size"]))
    print(" price: " + str(board["asks"][1]["price"]) + ", size: " + str(board["asks"][1]["size"]))
    print(" price: " + str(board["asks"][2]["price"]) + ", size: " + str(board["asks"][2]["size"]))
    print(" price: " + str(board["asks"][3]["price"]) + ", size: " + str(board["asks"][3]["size"]))
    print(" price: " + str(board["asks"][4]["price"]) + ", size: " + str(board["asks"][4]["size"]))
    print("")

# おまじない
if __name__ == '__main__':
    # 1秒待ってのループ処理
    while True:
        try:
            getBoard()
        except Exception as e:
            print("exception: ", e.args)
        # sleep
        time.sleep(SLEEP_T)

print文のところが雑なのはご勘弁を。

●見てるだけでも面白いもんだ

実行結果は

-- bids --
 price: 873145.0, size: 0.1
 price: 873140.0, size: 0.05
 price: 873122.0, size: 0.11
 price: 873121.0, size: 0.05
 price: 873120.0, size: 0.148
-- asks --
 price: 873151.0, size: 0.3244083
 price: 873174.0, size: 0.08
 price: 873232.0, size: 0.018
 price: 873233.0, size: 0.01
 price: 873235.0, size: 0.15

-- bids --
 price: 873146.0, size: 0.5
 price: 873145.0, size: 0.1
 price: 873140.0, size: 0.05
 price: 873135.0, size: 0.3
 price: 873122.0, size: 0.11
-- asks --
 price: 873233.0, size: 0.008
 price: 873235.0, size: 0.15
 price: 873236.0, size: 0.77140723
 price: 873243.0, size: 0.01
 price: 873253.0, size: 0.05

をずっと出力するだけのもの。

bidsの出力は逆向きの方がよかったですね。
その辺は各位で書き換えてみてください。

サイズの累積も右側に出力すれば良かったかとも思ってます。
その方が、こちらの売り買いしたいサイズがどこまでスリップするかがわかりますものね。

では、今日はこの辺で。


ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。