Polymarket Bot 教程 · 第 3 章,共 32 章
选择你的 Polymarket bot 技术栈:Python(py-clob-client 0.34.6)、Node.js(@polymarket/clob-client-v2 v1.0.6),或 Rust(没有官方 SDK,基于 ethers-rs 构建)。优缺点、延迟、代码示例。
本章涵盖内容
语言选择的重要性远没有大多数开发者想象的那么高。Polymarket 为所有语言暴露相同的 REST 和 WebSocket endpoints;SDK 的选择主要决定你需要自己编写多少胶水代码。Python 和 Node 都有官方维护的 SDK;Rust 没有,但在 hot path 上是可行的。本章会梳理这些取舍,并在每种语言中演示相同的“获取 order book”任务,让差异更直观,最后以一个混合栈模式结束-这也是大多数生产 bot 最终采用的方式。
- 决策框架
- Python(默认选择]
- Node.js(全栈开发者)
- Rust(延迟关键的 hot path)
- 各栈的安装命令
- 代码骨架:用 3 种语言获取 order book
- 何时混用栈(Python control plane + Rust hot path)
决策框架
三个问题就能解决 90% 的技术栈选择。
- 你是否已经具备强项技能? 如果你每天都写 Python,那就用 Python 写 bot。如果你每天都写 TypeScript,那就用 Node 写 bot。下面提到的 SDK 质量差异确实存在,但与跟不熟悉语言较劲的成本相比要小得多。
- 策略是否对延迟极其敏感? 如果你的优势取决于在 50ms 以内响应(5 分钟 crypto 市场、新闻期间做 market-making),hot path 会从 Rust 或 Go 中受益。大多数策略并不需要这样。
- 你是否会同时运行多个策略? 单个 Python 进程通常可以轻松管理 10-20 个市场。超过这个规模后,async Node 或拆分进程的 Python 会更好扩展。
对于第一个 bot,诚实的默认选择是 Python。只有当实际测量的约束迫使你这么做时,再切换。
Python(默认选择]
Python 是默认选择,因为它的 SDK 最完整,迭代速度也最快。py-clob-client 在 0.34.6 版本(2026 年 5 月)覆盖了所有重要的 CLOB v2 endpoint:市价和限价订单、FOK/FAK/GTC 变体、order book 读取、余额/allowance 读取,以及通过 web3.py 进行的直接链上操作。
优点:SDK 成熟、可用 pandas 轻松做数据分析、社区庞大、可用 web3.py 读取链上数据。缺点:相比 JavaScript,async 的使用体验较别扭;GIL 限制多核加速(对 I/O 密集型 bot 通常影响不大);在冷启动容器上的启动时间较慢。
适合:80% 的开发者。尤其适合策略涉及回测、统计分析,或在执行之外还要处理大量数据的人。
Node.js(全栈开发者)
Node.js 是第二受支持的技术栈。@polymarket/clob-client-v2 在 1.0.6 版本中覆盖了与 Python SDK 相同的 endpoints,并且全程提供 TypeScript 类型。async 是原生且快速的;WebSocket 处理也非常出色。
优点:async 体验最佳、原生 TypeScript 类型、HTTP + WS 生态庞大、如果 bot 和 web dashboard 使用同一个 Node runtime,则部署很方便。缺点:数值精度需要对大 token ID 使用 BigInt 或字符串处理(ERC-1155 IDs 是 256-bit),数据分析工具不如 pandas 生态强。
适合:已经维护 JavaScript 技术栈、并希望只使用一个 runtime 的开发者。也适合:一边做 dashboard 一边做 bot 的人-在 bot core 和 Next.js dashboard 之间共享 types 可以消除一类 bug。
Rust(延迟关键的 hot path)
Rust 没有官方 Polymarket SDK。你需要直接基于 V2 REST 和 WebSocket APIs 构建,使用 reqwest(HTTP)、tokio-tungstenite(WebSocket),以及 ethers-rs 或 alloy 做签名。与 Python 里 30 分钟能完成相比,这大约需要 2 天的搭建工作。
优点:原生 EIP-712 签名,无需 JS 子进程、亚毫秒级订单构造、负载下内存占用可预测、没有 GC 暂停。缺点:没有 SDK 意味着你要自己实现 Python 用户免费获得的内容(clobToken ID 解析、response schema 校验、salt/nonce 管理)。延迟上的收益通常是比优化后的 Python 快 20-100ms,这只有在亚秒级策略中才有意义。
适合:market-making bot 的 hot path,或 news-arb bot 的交易触发那一段。几乎从不建议把整个 bot 都写成 Rust。
各栈的安装命令
在 mainnet 上完成一个可签名订单所需的最少命令(单个 CLOB v2 endpoint)。
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 token 的 order book-在每个技术栈中的写法。三者都调用相同的 CLOB v2 REST endpoint。
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(直接 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]);
三者的 response shape 完全相同。Rust 的成本主要体现在其他地方-签名、订单构造、错误处理-而不是读取路径。
何时混用栈(Python control plane + Rust hot path)
很多生产 bot 最终会收敛到这种模式:Python 负责所有涉及决策的部分,Rust 负责毫秒级执行。
架构是这样的:Python 进程读取市场状态,运行策略逻辑,并把一个小的命令文件(例如 {"action":"buy","token":"...","size":10,"price":0.45})写到 Unix socket。Rust daemon 监听这个 socket,签名订单,并把它提交到 CLOB。Python 进程可以慢一些、方便一些;Rust daemon 则快速且精简。
关键在于 handoff:通过隔离 signed-order 这一步,既能恢复 Python 崩溃预算,又不会牺牲延迟。我们在生产 bot 中就是这样使用的-Python 输出意图,位于 /tmp/clob.sock 的 Node daemon 负责签名。Node 版本的 daemon 在 100ms 以下场景表现很好;只有在 50ms 以下,Rust 才真正体现出价值。












