Bot

開発記録#177(2025/4/14)「BybitのOrderBookをリアルタイム取得してみた|pybotters & asyncioで取引所と接続」

こんにちは、よだかです。

今回は、自作仮想通貨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 でリアルタイム板情報取得は驚くほど簡単
  • クラス名のミスに注意(bybitDataStoreBybitDataStore
  • 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へと進化させていきます!

-Bot