Polymarket Bot Tutorial · 32章中の3章
Polymarketボットのスタックを選びましょう: Python (py-clob-client 0.34.6)、Node.js (@polymarket/clob-client-v2 v1.0.6)、またはRust (公式SDKなし、ethers-rs上に構築)。長所、短所、レイテンシ、コードサンプル。
この章で扱う内容
言語選択は、多くのビルダーが考えるほど重要ではありません。Polymarketはすべての言語に同じRESTおよびWebSocketエンドポイントを公開しており、SDKの選択は主に、自分でどれだけ接着コードを書くかを左右します。PythonとNodeにはどちらも公式に保守されているSDKがあります。Rustにはありませんが、ホットパス用途なら十分実用的です。この章ではトレードオフを解説し、同じ「order bookを取得する」タスクを各言語で示して差分を明確にし、最後に、実運用のボットが最終的に落ち着くことが多い混在スタックのパターンを紹介します。
- 意思決定フレームワーク
- Python(デフォルトの選択]
- Node.js(フルスタック開発者向け)
- Rust(レイテンシ重視のホットパス)
- スタック別のセットアップコマンド
- コード骨子: 3言語でorder bookを取得する
- スタックを混ぜるべき場合(Python制御プレーン + Rustホットパス)
意思決定フレームワーク
3つの質問で、スタック選択の90%は決まります。
- すでに強い得意分野がありますか? 毎日Pythonを書くなら、ボットもPythonで書きましょう。毎日TypeScriptを書くなら、Nodeで書きましょう。以下に示すSDK品質の差は実在しますが、慣れない言語と格闘するコストのほうが大きいことがほとんどです。
- 戦略はレイテンシ重視ですか? 50ms未満での反応が優位性に直結するなら(5分足の暗号資産市場、ニュース時のマーケットメイクなど)、ホットパスはRustまたはGoの恩恵を受けます。ほとんどの戦略にはそこまで不要です。
- 複数の戦略を運用しますか? 単一のPythonプロセスでも、10〜20市場なら十分に管理できます。それ以上なら、非同期Nodeか、プロセス分割したPythonのほうがスケールしやすいです。
初めてのボットに対する率直なデフォルトはPythonです。測定した制約がそれを強制する場合にだけ、他へ切り替えましょう。
Python(デフォルトの選択]
Pythonがデフォルトなのは、SDKが最も完成度が高く、反復のループが最速だからです。2026年5月時点のpy-clob-client 0.34.6は、重要なCLOB v2エンドポイントをすべてカバーしています。マーケット注文と指値注文、FOK/FAK/GTCバリアント、order bookの読み取り、残高/allowanceの読み取り、そしてweb3.py経由の直接チェーン操作です。
長所: 成熟したSDK、pandasでのデータ分析が容易、大きなコミュニティ、オンチェーン読み取り用のweb3.py。短所: JavaScriptに比べるとasyncの使い勝手がいまひとつ、GILによりマルチコアの速度向上が制限される(I/O中心のボットではほとんど問題にならない)、コールドコンテナでの起動が遅い。
おすすめ対象: ビルダーの80%。特に、バックテスト、統計分析、または実行と並行したデータ処理を行う戦略を持つ人。
Node.js(フルスタック開発者向け)
Node.jsは2番目にサポートが充実したスタックです。@polymarket/clob-client-v2 1.0.6は、TypeScriptの型付きでPython SDKと同じエンドポイントをカバーします。asyncはネイティブで高速、WebSocketの扱いも優れています。
長所: 最良のasync体験、ネイティブなTypeScript型、HTTP + WS向けの大きなエコシステム、Webダッシュボードと同じNodeランタイムで簡単にデプロイできる。短所: 大きなトークンIDでは数値精度のためBigIntか文字列処理が必要(ERC-1155 IDは256ビット)、pandas相当のデータツールは弱い。
おすすめ対象: すでにJavaScriptスタックを保守していて、1つのランタイムにまとめたいビルダー。さらに、ボットと並行してダッシュボードを作る人にも向いています。ボット本体とNext.jsダッシュボードで型を共有すると、ある種のバグが消えます。
Rust(レイテンシ重視のホットパス)
Rustには公式のPolymarket SDKはありません。V2のRESTおよびWebSocket APIに対して、reqwest(HTTP)、tokio-tungstenite(WebSocket)、署名用にethers-rsまたはalloyを使って直接実装します。Pythonなら30分で済むところが、セットアップにだいたい2日かかります。
長所: JSサブプロセスなしでネイティブにEIP-712署名できる、注文生成がサブミリ秒、負荷時のメモリプロファイルが決定的、GC停止がない。短所: SDKがないため、Pythonユーザーが無料で得ているもの(clobToken IDのパース、レスポンススキーマ検証、salt/nonce管理)を自前実装する必要がある。レイテンシ面の勝ち幅は、チューニングしたPythonに対して20〜100ms程度で、サブ秒戦略でしか意味を持ちません。
おすすめ対象: マーケットメイクボットのホットパス、またはニュース裁定ボットの発注レッグ。ボット全体をRustにすることは、ほとんどありません。
スタック別のセットアップコマンド
mainnetに対して署名済み注文を出せる状態までの最小コマンド(単一のCLOB v2エンドポイント)。
Python:
python -m venv venv && source venv/bin/activate
pip install py-clob-client==0.34.6 web3 python-dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Node:
npm init -y
npm install @polymarket/[email protected] ethers dotenv
# Set POLYGON_RPC, PRIVATE_KEY, POLY_FUNDER in .env
Rust:
cargo new --bin pmt
cd pmt
cargo add tokio reqwest serde serde_json ethers alloy tungstenite tokio-tungstenite
# Hand-write signer + endpoint client; no SDK shortcut.
初回注文までの時間: Pythonは約10分、Nodeは約15分、Rustは約4〜8時間。
コード骨子: 3言語でorder bookを取得する
同じタスク、つまりPolymarketトークンのorder bookを取得する処理を各スタックで示します。3つとも同じCLOB v2 RESTエンドポイントにアクセスします。
Python (py-clob-client):
from py_clob_client.client import ClobClient
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("<token_id>")
print(book.bids[:3], book.asks[:3])
Node (@polymarket/clob-client-v2):
import { ClobClient } from "@polymarket/clob-client-v2";
const c = new ClobClient({ host: "https://clob.polymarket.com", chain: 137 });
const book = await c.getOrderBook("<token_id>");
console.log(book.bids.slice(0,3), book.asks.slice(0,3));
Rust (direct HTTP):
let url = format!("https://clob.polymarket.com/book?token_id={}", token);
let book: serde_json::Value = reqwest::get(&url).await?.json().await?;
println!("{:?} {:?}", &book["bids"][..3], &book["asks"][..3]);
3つともレスポンス形状は同じです。Rustのコストは読み取り経路ではなく、署名、注文生成、エラーハンドリングなど他の部分にあります。
スタックを混ぜるべき場合(Python制御プレーン + Rustホットパス)
多くの実運用ボットが収束するパターンは、意思決定を伴うすべてをPythonに任せ、ミリ秒単位の実行レッグをRustに任せる構成です。
アーキテクチャ: Pythonプロセスが市場状態を読み、戦略ロジックを実行し、小さなコマンドファイル(例: {"action":"buy","token":"...","size":10,"price":0.45})をUnixソケットに書き込みます。Rustデーモンがそのソケットを監視し、注文に署名してCLOBに送信します。Pythonプロセスは遅くても便利でよく、Rustデーモンは高速で最小限です。
受け渡しが重要です。署名済み注文のステップを分離することで、Python側のクラッシュ予算を守りつつ、レイテンシを犠牲にせずに済みます。私たちの本番ボットでもまさにこのパターンを使っています。Pythonが意図を出力し、/tmp/clob.sock 上のNodeデーモンが署名を処理します。Node版のデーモンは100ms未満なら十分ですが、Rustが真価を発揮するのは50ms未満です。












