こんにちは、よだかです。
今回は、自作仮想通貨Botの開発にあたって、BybitのOrderBookデータをリアルタイムで取得する仕組みを構築したので、その開発記録を残しておきます。
使用したライブラリは、国内でも広く使われている pybotters
。
非同期処理を活用して、WebSocket経由での板データ取得をシンプルに実装しました。
✅ 環境情報
- Python 3.12.4(pyenv管理)
- pybotters 最新版(2025年4月時点)
- MacBook Air(ローカル実行)
- VSCode + virtualenv(Poetry不要)
✅ 開発手順とつまずき
🧩 最初の実装(誤りあり)
import pybotters store = pybotters.bybitDataStore() # ❌ 実行時にAttributeError
💥 エラー内容:
AttributeError: module 'pybotters' has no attribute 'bybitDataStore'. Did you mean: 'BybitDataStore'?
✅ 修正:クラス名は大文字が正解
store = pybotters.BybitDataStore()
✅ WebSocket接続とデータ取得の流れ
完成したコードはこちらです👇
import asyncio import pybotters async def main(): store = pybotters.BybitDataStore() async with pybotters.Client() as client: await client.ws_connect( "wss://stream.bybit.com/v5/public/linear", send_json=[{"op": "subscribe", "args": ["orderbook.50.BTCUSDT"]}], hdlr_json=store.onmessage ) await store.orderbook.wait() while True: asks, bids = store.orderbook.sorted().values() print("ASK:", asks[0], "BID:", bids[0]) await asyncio.sleep(1) asyncio.run(main())
✅ 解説ポイント:
BybitDataStore()
:pybottersでBybit用のデータストアを初期化ws_connect(...)
:WebSocketで接続し、orderbook.50.BTCUSDT
を購読await store.orderbook.wait()
:最初の板データが来るまで待機sorted().values()
:価格順に並んだask/bidリストを取得
✅ Ctrl+Cで止められる
実行中はターミナルで Ctrl + C
を押すことで安全に停止できます。
Botを常時運転したい場合は、監視処理やSlack通知などの追加実装も可能です。
✅ 今後の展望(ToDo)
- 複数通貨ペアへの対応(例:ETHUSDT)
- 板データの可視化(matplotlibやstreamlitなど)
- 売買シグナルとの統合(MM bot構築へ発展予定)
✅ まとめ
今回のポイントは以下の通り:
pybotters
+asyncio
でリアルタイム板情報取得は驚くほど簡単- クラス名のミスに注意(
bybitDataStore
→BybitDataStore
) store.orderbook.wait()
でデータ受信待機ができる- 実装はシンプルでも、トレードBotの基礎となる重要な仕組み
次は、これをベースにMM botの実装に進んでいく予定です。
また進捗があったら続報を書きます!
初心者用解説
~ pybotters × asyncioで取引所とつながる体験 ~
今回は、仮想通貨の自動売買Botを作るために、「Bybit(バイビット)」という取引所の板情報(OrderBook)をリアルタイムで取得する方法を試してみました。
ちょっと難しそうに聞こえるかもしれませんが、**「取引所の値動きを、プログラムから自動で見に行く仕組み」**だと思ってもらえたらOKです!
✅ 使った環境とツール
今回使ったのは以下のような構成です:
- Python 3.12.4:プログラミング言語。数字はバージョンです。
- pybotters:仮想通貨取引所とのやりとりを簡単にしてくれる便利ライブラリ。
- MacBook Air:自分のパソコン(OSはmacOS)。
- VSCode + virtualenv:コードを書くツールと、Python専用の仮想環境(安全な作業場)。
✅ まずはじめに:エラーからスタート(笑)
最初はこんな感じで書いたんです:
import pybotters store = pybotters.bybitDataStore() # ❌
すると、プログラムが怒りました。
💥 出てきたエラー
AttributeError: module 'pybotters' has no attribute 'bybitDataStore'. Did you mean: 'BybitDataStore'?
意訳:「
bybitDataStore
なんて関数はないよ。大文字のBybitDataStore
じゃないの?」
→ はい、その通りでした!😅
✅ 正しい書き方に修正
ということで、こう書き直します:
store = pybotters.BybitDataStore()
大文字と小文字が大事なんですね。Pythonではこの違い、意外とシビアです。
✅ 実際のコードと動き
じゃあ、実際に動くコードはどうなるの?ということで、これ👇です。
import asyncio import pybotters async def main(): store = pybotters.BybitDataStore() async with pybotters.Client() as client: await client.ws_connect( "wss://stream.bybit.com/v5/public/linear", send_json=[{"op": "subscribe", "args": ["orderbook.50.BTCUSDT"]}], hdlr_json=store.onmessage ) await store.orderbook.wait() while True: asks, bids = store.orderbook.sorted().values() print("ASK:", asks[0], "BID:", bids[0]) await asyncio.sleep(1) asyncio.run(main())
✅ このコード、何してるの?
ざっくり解説するとこうです:
行 | 意味 |
---|---|
BybitDataStore() | Bybitのデータ(板情報など)を保存する「倉庫」を準備します。 |
ws_connect(...) | 取引所とWebSocketでつながります(リアルタイム通信の道路みたいなもの)。 |
"orderbook.50.BTCUSDT" | 「BTCUSDT(ビットコインとドルの取引)の、50件分の板情報をください」と伝えてます。 |
store.orderbook.wait() | 最初のデータが届くまで待ちます。 |
asks, bids = ... | 板情報(買い注文と売り注文)を取り出して表示します。 |
✅ 動いてるプログラムを止めたいときは?
実行中はずっと動き続けるので、止めたいときはターミナルで Ctrl + C
を押すだけでOK!
✅ これからやりたいこと(ToDo)
ここからさらに発展させたいと思ってます:
- 複数の通貨ペアにも対応(例:ETHUSDTなど)
- 板情報の可視化(グラフにして見やすくしたい)
- 実際の売買判断と組み合わせ → 最終的にはMM(マーケットメイカー)Botを構築していく予定!
✅ まとめ
今回わかったことは…
pybotters
を使えば、Bybitの板データをリアルタイムで取得するのは簡単!asyncio
を使った非同期処理がとても便利- エラーも「学び」の宝庫。落ち着いて対処すればちゃんと動く!
次回は、このデータをもとに実際に注文を出すBotへと進化させていきます!