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% 的技术栈选择。

  1. 你是否已经具备强项技能? 如果你每天都写 Python,那就用 Python 写 bot。如果你每天都写 TypeScript,那就用 Node 写 bot。下面提到的 SDK 质量差异确实存在,但与跟不熟悉语言较劲的成本相比要小得多。
  2. 策略是否对延迟极其敏感? 如果你的优势取决于在 50ms 以内响应(5 分钟 crypto 市场、新闻期间做 market-making),hot path 会从 Rust 或 Go 中受益。大多数策略并不需要这样。
  3. 你是否会同时运行多个策略? 单个 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-rsalloy 做签名。与 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 才真正体现出价值。

常见问题

py-clob-client 是否兼容 Polymarket V2?
是的。py-clob-client 0.34.6(截至 2026 年 5 月,我们在 VPS 上生产环境运行的版本)兼容 V2,并可配合 pUSD collateral migration 使用。该包通过 "pip install py-clob-client" 安装。
官方的 Node.js Polymarket SDK 是什么?
@polymarket/clob-client-v2(截至 2026 年 5 月当前为 v1.0.6)。包名里的 “v2” 很重要-旧的 @polymarket/clob-client 包属于 V1,不建议用于新项目。通过 "npm install @polymarket/clob-client-v2" 安装。
有官方的 Rust Polymarket SDK 吗?
没有。截至 2026 年 5 月,Polymarket 还没有官方 Rust SDK。Rust 用户通常直接基于 V2 REST 和 WebSocket APIs 构建,使用 ethers-rs(用于 EIP-712 signing)以及 reqwest 或 hyper(用于 HTTP/WS)。代码会更多一些,但 latency 和 concurrency 的收益对 market making 很重要。
我可以为 Polymarket bot 使用 Go 吗?
可以,技术上没问题-Go 有不错的 HTTP 和 Ethereum libraries(go-ethereum)。不过没有官方 Go SDK,所以你需要直接基于 REST API 开发。我们看到 Go 在 Polymarket bot 里的使用频率不如 Python 或 Node.js,但它完全可行。
如果我同时会 Python 和 Node.js,应该用哪个?
如果你的策略偏 research-heavy(pandas、NumPy、scikit-learn),选 Python。如果你的策略偏 real-time / event-driven,并且希望客户端和服务端使用同一种语言,选 Node.js。两者都能访问相同的 CLOB endpoints;对于任何非 HFT 策略来说,两者都足够快。
Node SDK 需要 TypeScript 吗?
不是必须,但强烈推荐。@polymarket/clob-client-v2 自带 TypeScript types,当 EIP-712 signature payloads 或订单类型出错时,在编译期捕获 type error 能省去大量调试时间。
Polymarket bot 需要多快?
大多数策略对毫秒级就够了,不需要微秒级。sports microstructure 和 market making 受益于 100ms 以下;news arbitrage 则能容忍 500-1000ms。策略逻辑用 Python,只有在 latency profiling 证明它确实影响你的 edge 时,才把 hot path 切换到 Rust。