🔭

Upcoming pybotters 2.0

に公開

この記事は「仮想通貨botter Advent Calendar 2025」の 13 日目の記事です。

https://qiita.com/advent-calendar/2025/botter

TL;DR

こんにちは、botter の皆さん! 暗号通貨 botter 向け OSS ライブラリ pybotters をメンテしているまちゅけんです。 現在、次期バージョンである pybotters 2.0 の開発をしています 🔥🔥

この記事では pybotters 2.0 のコンセプトや新機能、また 1.x 系から何が変わるのか? と言う事をご紹介させて頂きます。 主要点としては以下の通りです:

  1. より使いやすい Unified Client
  2. 完全な静的型付け、データモデル
  3. 同期処理と非同期に対応
  4. テスト可能なモックサーバー
  5. PerpDEX への対応

pybotters (1.x) とは?

まずそもそも pybotters とは何か? と言う点について簡単に説明します。 pybotters は Python 製のオープンソースライブラリ で、暗号通貨取引所の API を簡単に利用できるようにする ことを目的としています。

2025 年末時点のバージョン 1.x 系では、主要な国内・グローバルの取引所 (CEX) に対応 しており PerpDEX も Hyperliquid に対応 しています。 対応取引所では REST API や WebSocket API を通じて、注文の発注や残高の取得、マーケットデータの購読などが可能です。

また asyncio による非同期処理が機能の主軸となっている事も特徴です。 百聞は一見に如かずだと思いますので、サンプルコードをご覧ください。 これは Hyperliquid の REST API にて注文を発注する コードです:

1.x
import asyncio

import pybotters

async def main() -> None:
    apis = {"hyperliquid": ["YOUR_PRIVATE_KEY"]}
    base_url = "https://api.hyperliquid.xyz"
    async with pybotters.Client(apis=apis, base_url=base_url) as client:
        r = await client.fetch(
            "POST",
            "/exchange",
            data={
                "action": {
                    "type": "order",
                    "orders": [{"a": 1, "b": True, "p": "3300", "s": "0.1", "r": False, "t": {"limit": {"tif": "Gtc"}}}],
                    "grouping": "na",
                },
            },
        )
        print(r.data)

if __name__ == "__main__":
    asyncio.run(main())

さらに WebSocket API と DataStore クラスを利用することで、リアルタイムの板情報を取得 することも可能です:

1.x
import asyncio

import pybotters

async def main():
    async with pybotters.Client() as client:
        store = pybotters.HyperliquidDataStore()
        await client.ws_connect(
            "wss://api.hyperliquid.xyz/ws",
            send_json={
                "method": "subscribe",
                "subscription": {"type": "l2Book", "coin": "ETH"},
            },
            hdlr_json=store.onmessage,
        )
        while True:
            orderbook = store.l2_book.sorted(limit=2)
            print(orderbook)
            await store.l2_book.wait()

if __name__ == "__main__":
    asyncio.run(main())

現状の pybotters 1.x 系を詳しく知りたい方はリポジトリやドキュメントをご覧ください:

https://github.com/pybotters/pybotters

https://pybotters.readthedocs.io/ja/stable/

なぜ pybotters 2.0 なのか?

私は pybotters 1.x 系を HTTP layer のライブラリとして設計 してきました。

上記の 1.x 系サンプルコードを見て分かるように、pybotters.Client では REST API エンドポイントの URL やパラメーターを直接構築する必要 があります。 またレスポンスのデータも 生の JSON データとして返される ため、レスポンスデータの構造を理解し、必要な情報を手動で抽出する 必要があります。 例えば ...

1.x
# 🌨️ リクエストの URL やパラメーター、本当にあってる?
r = await client.fetch("POST", "/info", data={"type": "meta"})

# 🌨️ レスポンスのデータ構造、本当にあってる?
print(r.data["data"])

これは柔軟性が高い反面、取引所ごとに API の仕様を理解し、適切なリクエストを手動で組み立てる必要がある というデメリットもあります。 ひとつ間違えれば KeyError: 'data' のような Traceback を見ることになるでしょう 😇

また他の点としては 同期処理に対応していない こともあります。 非同期処理の async defawait といった構文が必須となっています。 非同期処理は高いパフォーマンスを発揮しますが、Python 初学者や小規模なスクリプトでは扱いづらい場合もあります。

私はこれらの痛点 (Pain Points) を解決するために pybotters 2.0 では設計を根本的に見直す事にしました。 ここからは pybotters 2.0 で導入される改善点や新機能について説明していきます。

Unified Client

ccxt Unified API のような統合的なクライアントクラスを提供します 🔥🔥

2.0; Unified Client の create_order で発注するイメージ
# 同期版
with pybotters.UnifiedExchange() as exchange:
    with exchange.hyperliquid(auth=...) as hyperliquid:
        hyperliquid.create_order(
            symbol=Symbol("ETH", "USDC", SymbolType.PERPETUAL),
            type=OrderType.MARKET,
            side=OrderSide.BUY,
            amount=Decimal("0.1"),
        )

# 非同期版
async with pybotters.AsyncUnifiedExchange() as exchange:
    async with exchange.hyperliquid(auth=...) as hyperliquid:
        await hyperliquid.create_order(
            symbol=Symbol("ETH", "USDC", SymbolType.PERPETUAL),
            type=OrderType.MARKET,
            side=OrderSide.BUY,
            amount=Decimal("0.1"),
        )

create_order メソッドのような、馴染みのある統一的なメソッドで API をサクッと呼び出すことができます。 リクエストの URL やパラメーターを手動で組み立てる必要はありません。 さらに本家 ccxt とは次の部分が異なります:

  1. context manager (with / async with) で適切なリソース管理が行われる。 (WebSocket 接続など)
  2. Enum 型の OrderTypeOrderSide, また Symbol のようなクラスを使って安全にパラメーターを指定できる。
  3. Decimal のような適切な数値型を採用している。 float 型は金額の計算には不向きです。

これにより 取引所ごとの API 仕様を気にせず、直感的に API を利用できるようになります 🚀 同じ戦略を様々な取引所にデプロイしたり、取引所間のアービトラージに役に立つでしょう。

Specific Client

取引所固有の API を呼び出せる Specific Client も提供されます 🔥🔥

2.0; Specific Client で Hyperliquid の価格を取得するイメージ
info = pybotters.exchange.hyperliquid.InfoEndpoint()
# 同期版
with pybotters.HTTPClient() as client:
    r = client.request(info.all_mids())
# 非同期版
async with pybotters.AsyncHTTPClient() as client:
    r = await client.request(info.all_mids())

例えば Unified Client にないような 取引所固有の API エンドポイント はこちらで呼び出すことができます。

静的型付け、データモデル

完全な静的型付けを導入し、データモデルを提供します 🔥🔥

これによって上の方であった「🌨️ レスポンスのデータ構造、本当にあってる?」のような悩みを解決できます。

Hyperliquid の銘柄一覧のイメージ
# 1.x 系
r = await client.fetch("POST", "/info", data={"type": "meta"})
print(r.data["universe"][0]["name"])  # IDE の自動補完が効かない (間違えやすい)

# 2.0
r = await client.request(info.meta())
print(r.content.universe[0].name)  # ドットアクセスの上で IDE の自動補完が効く!

1.x 系で補完が効かないのは型情報がない生の JSON (typing.Any) を扱っているためです。 2.0 ではレスポンスデータがデータモデル (msgspec モデル) として提供されるため、IDE の自動補完が効くようになります

さらにこれらは人間だけではなく AI による Agentic Coding でも非常に有用です

型情報がない場合、AI は正確な API の仕様を把握するのは困難です。 そうなるとリクエストやレスポンスの書き方が分からず、ハルシネーションを起こします。 これは コンテキストエンジニアリング と呼ばれる文脈です。 しかしライブラリがデータモデルとして型情報を提供していることで、AI は正確な API の仕様を理解しやすくなります。 これにより AI によるコード生成の精度が向上 します 🚀

同期処理と非同期処理

ここまでのサンプルコードから分かるように、同期処理と非同期処理の両方に対応します 🔥🔥

ニーズに合わせて好きな方を選択できます。 小規模なスクリプトなど同期処理が適していますし、WebSocket API での並行性が必要な場合は非同期処理を選択できます。

テスト可能なモックサーバー

取引所 API のモックサーバーを提供します 🔥🔥

昨年の Advent Calendar 記事でも触れましたが、トレード bot のテストは重要 です。 bot はお金を扱うソフトウェアであり、取引所 API の障害やネットワークの問題など様々な要因で正常に動作しない可能性があります。 バグがあれば資金を失う可能性があります。

https://zenn.dev/mtkn1/articles/testing-for-botters

モックサーバーでは 取引所 API の状態をシミュレート できます。 これにより 実際の取引所 API を呼び出すことなく、bot の動作をテスト できます。 例えば以下のようなユースケースが考えられます:

  1. 注文が執行されるシナリオのテスト: 「実弾テスト」であれば市場の価格が取引戦略の執行条件を満たすまで待つ必要がありますが、モックサーバーでは即座に注文が執行されるようにシミュレートできます。
  2. エラーハンドリングのテスト: ネットワーク障害や取引所のメンテナンスなど、様々なエラーシナリオをシミュレートできます。 これにより bot が適切にエラーを処理できるか、暴走しないかなどを確認できます。

そしてまた最も重要なのが、テストが可能になることで AI 駆動開発ワークフローが実現できることです。

先ほどの静的型付けとデータモデルの話で生成コードの精度が向上すると説明しましたが、モックサーバーによってさらに生成コードの動作検証が可能になります。 これにより AI エージェントによるコード生成とテストのサイクルを高速に回せる ようになります 🚀

PerpDEX への対応

前述のとおり、pybotters 2.0 では設計を完全にオーバーホールしてから作り直しています。 そのため取引所もまた最初から 1 つずつ対応していく必要があります。

まず 第一に Hyperliquid, そして他の主要な PerpDEX (Lighter など) ファーストで対応していく予定 です。 PerpDEX はますます重要になる分野であり、pybotters でも積極的にサポートしていきたいと考えています。 その後、国内 CEX、グローバル CEX へと再対応を広げていく予定です。

注意点・移行ガイド

既存の pybotters 1.x 系のユーザーの方には注意点があります

ご覧の通り pybotters 2.0 は後方互換性がありません。 その為、1.x 系を使った現状の bot を動作させ続ける為にはバージョン指定子を制限してください。 Python 環境を requirements.txtpyproject.toml でのバージョン管理をしている場合、以下のように指定してください:

requirements.txt
pybotters<2.0
pyproject.toml
[project]
dependencies = [
    "pybotters<2.0",
]

正式リリース後、 pybotters 2.0 への移行ガイドをドキュメントにて提供する予定 です。 現状は上記のように意図せず 2.0 にアップグレードしないように注意してください。

ロードマップ・フィードバック

pybotters 2.0 はまだ開発中です。 今回の記事ではとても野心的なコンセプトを紹介しましたが、今のところ内部設計を慎重にデザインして実装を進めています。

まずは Hyperliquid のみをサポートしたアルファ版を 2026 年初頭にリリースする予定です。 その後、他の PerpDEX や主要な国内・グローバル CEX へと対応を広げていきます。 詳細なロードマップは以下の通りです 🔭

期間 マイルストーン
2026 年初頭 Hyperliquid サポートのアルファ版リリース
2026 年 Q1 - Q2 他の PerpDEX サポート (Lighter など)
2026 年 Q2 - Q3 主要な国内 CEX サポート (Bitbank, Coincheck など)
2026 年 Q3 - Q4 主要なグローバル CEX サポート (Binance, Bybit など)

フィードバックも歓迎しています! pybotters 2.0 に関するご意見やご要望がありましたら、 Discord コミュニティや X でお気軽にお知らせください 🙏

https://discord.com/invite/CxuWSX9U69

https://twitter.com/MtkN1XBt

https://github.com/pybotters/pybotters

また今回の Advent Calendar は弊ライブラリの PR 気味な内容となってしまい申し訳ございません。 botter の我々にとって有用なライブラリとなるよう努めてまいりますので、引き続きよろしくお願いいたします 🙇‍♂️ よろしければ昨年までの技術系記事もご覧ください:

https://zenn.dev/mtkn1/articles/testing-for-botters

https://zenn.dev/mtkn1/books/deployment-for-botter

https://zenn.dev/mtkn1/articles/bigquery-subscription

https://zenn.dev/mtkn1/articles/a455bb8732e52e

https://zenn.dev/mtkn1/articles/c61e77c1d221aa

GitHubで編集を提案

Discussion