Polymarket 替换了 RTDS:迁移到 PolyBolt
9 月 15 日,Polymarket 悄悄地把 RTDS 的参考价格功能变成了旧版。如果你在给机器人推送现货价格,有六件事同时改变了,包括价格来源和交易对代码格式,而且其中大多数会悄无声息地失效,而不是明确报错。
改了什么,什么时候改的
2026 年 9 月 15 日,Polymarket 在 wss://ws-live-v2.polymarket.com/ws 上线了 PolyBolt,并将 RTDS 的参考价格功能列为旧版。crypto_prices、crypto_prices_chainlink 和 equity_prices 都映射到了新的频道。comments 主题目前仍留在 RTDS 上。
如果你的机器人依靠流式现货价格来做任何决定(在加密货币 Up/Down 市场上,大多数机器人都是如此),这就和你有关。六件事同时改变了,麻烦的是其中好几件会悄无声息地失效:你仍然保持连接,只是不再收到你以为自己在收的价格。
六项破坏性变更
| RTDS(旧版) | PolyBolt | |
|---|---|---|
| URL | wss://ws-live-data.polymarket.com | wss://ws-live-v2.polymarket.com/ws |
| 认证 | 公开 | 需要 CLOB API 凭证 |
| 心跳 | 客户端每 5 秒发送 PING | 无需发送:服务器每 25 秒 ping 一次 |
| 订阅帧 | {action, subscriptions:[{topic,type,filters}]} | {op, subscriptions:[{channel,filter}]}:filter 是一个对象,而不是字符串 |
| 加密货币价格来源 | Binance / Chainlink | Pyth |
| 交易对代码 | btcusdt、btc/usd | btcusd:小写,USD 而不是 USDT |
最耗费你时间的两项
价格来源改成了 Pyth。你的参考价格现在来自一个与 9 月 14 日不同的预言机。如果你是根据 Binance 的报价跳动校准阈值的,请重新校准。而且交易对代码格式也变了:btcusdt 和 btc/usd 现在都是错的。错误的代码不会抛出异常;你只会得到一个永远不推送数据的订阅。
频道映射
| RTDS 主题 | PolyBolt 频道 | 过滤条件 | 说明 |
|---|---|---|---|
crypto_prices | price.crypto | {"symbol":"btcusd"} | 来源 Binance → Pyth;USDT → USD |
crypto_prices_chainlink | price.crypto | {"symbol":"btcusd"} | 来源 Chainlink → Pyth |
crypto_prices_twap_sixty | price.crypto.twap | {"symbol":"btcusd","window_seconds":60} | 60 秒 Chainlink TWAP |
crypto_prices_twap_thirty | 无 | — | 没有替代方案 |
equity_prices | price.equity | {"symbol":"aapl"} | 相同目录,小写 |
30 秒 TWAP 直接没了
crypto_prices_twap_thirty 在 PolyBolt 中没有对应项。这比看起来更重要:5 分钟加密货币市场在 8 月 7 日之后曾短暂按 30 秒 TWAP 结算,之后在 8 月 14 日改为 60 秒。如果你的技术栈中还有任何东西在使用 30 秒窗口,它没有迁移路径:你需要改用 60 秒频道,并重新校准模型。
建立连接
先在已打开的连接上认证,等待确认,然后再订阅。参考价格频道会拒绝未认证的订阅。
{
"op": "auth",
"rid": "a1",
"auth": {
"apiKey": "<api key>",
"secret": "<api secret>",
"passphrase": "<api passphrase>"
}
}这些凭证正是你为 CLOB 交易派生的那一套:key、secret 和 passphrase 三者一起。如果你从未创建过,端点指南介绍了 L1/L2 流程。
PolyBolt 提供而 RTDS 没有的三样东西
- 每次订阅都有一个快照。每个订阅都会返回之前两分钟的价格,带有
snapshot: true,也可能为空。用它初始化本地状态,然后再应用实时更新。在 RTDS 下,一个不活跃的交易对只会给你一片沉默,你根本不知道自己是已连接还是只是处在两次跳动之间。 - 连续的
seq和一个dropped计数器。你终于可以检测到缺口了。RTDS 完全没有序号,所以漏掉的消息是看不见的。按频道跟踪seq,把任何跳跃都视为重新同步的触发条件。 - 类型化的关闭码,取代原始的
1006:4001认证失败、4002消费者过慢、4003服务器排空、4008违反策略。4002意味着你读取 socket 的速度太慢:这是消费者的 bug,不是网络问题,重连解决不了。
用 full_accuracy_value,不要用 value
value 是浮点数;full_accuracy_value 是精确的十进制字符串。在一个按 TWAP 比较结算的市场上,你不会希望由小数点后第八位的浮点舍入来决定一笔交易。另外:旧版 TWAP 帧使用 window_s 和 E18 定点数价格。PolyBolt 发送的是十进制字符串,不要应用 E18 转换,否则你的价格会差十八个数量级。
连接限制
RTDS 没有公布任何限制。PolyBolt 公布了,违反其中任何一项都会以 4008 关闭 socket:
| 限制 | 值 |
|---|---|
| 每个连接的订阅数 | 64 |
| 每秒订阅帧数 | 20 |
| 最大帧大小 | 64 KB |
| 认证帧数 | 8 |
64 个订阅是需要提前规划的那一项。如果你跟踪 BTC、ETH 和 SOL 的现货和 TWAP,那是六个,对加密货币机器人来说余量充足;但一个铺开订阅整个股票目录的系统就会撞上这个上限。
按顺序迁移一个机器人
- 派生 CLOB API 凭证(如果你还没有的话)。RTDS 是公开的,PolyBolt 不是。这一步会卡住其他所有步骤。
- 把 URL 改为
wss://ws-live-v2.polymarket.com/ws。 - 删除你的客户端心跳。每 5 秒一次的
PING循环不仅没有必要,现在还成了噪音。服务器每 25 秒 ping 你一次。 - 重写订阅帧:
action→op,topic→channel,filter变成 JSON 对象而不是字符串。 - 修正每一个交易对代码:
btcusdt和btc/usd都变成btcusd。小写,USD。 - 处理快照帧,不要把两分钟的回补数据当成实时跳动。
- 加入
seq缺口检测,出现跳跃时重新同步。 - 重新校准任何根据 Binance 价格调优的东西。现在的来源是 Pyth。
如果你使用 TypeScript SDK
@polymarket/client 0.11.0 及更高版本封装了这些:在已认证的 SecureClient 上调用 client.subscribe([{ topic: "prices.crypto", symbols: ["btcusd"] }]),然后迭代带有 subscribe 和 update 类型的类型化事件。它会为你处理认证、帧和心跳。更完整的迁移情况见 SDK 指南。
这次没有改变的东西
值得说得精确一些,因为很容易迁移过头。CLOB 的 market 和 user 频道没有变化。wss://ws-subscriptions-clob.polymarket.com/ws/market 仍然推送订单簿和价格更新,仍然要求客户端每 10 秒发送一次 PING,best_bid_ask、new_market 和 market_resolved 也仍然需要通过 custom_feature_enabled 才能启用。只有参考价格迁移了。详见 WebSocket 指南。
更深层的局限也没有改变:数据流只能给你从连接那一刻起的价格。它无法告诉你上周二订单簿是什么样子。Polymarket 对已结算市场的订单簿返回 404,价格历史只保留大约每分钟一个点,这就是为什么回测需要一个在市场运行期间记录的存档。参阅 Up/Down 市场如何运作,或在市场查询中查找某个具体市场。
常见问题
- PolyBolt 是什么?它什么时候取代了 RTDS?
- PolyBolt 是 Polymarket 用于加密货币、股票和 TWAP 参考价格的 WebSocket,于 2026 年 9 月 15 日在 wss://ws-live-v2.polymarket.com/ws 上线。它使 RTDS 的参考价格功能成为旧版:crypto_prices、crypto_prices_chainlink 和 equity_prices 都映射到了新的 PolyBolt 频道。comments 主题目前仍留在 RTDS 上。
- PolyBolt 需要认证吗?
- 需要。参考价格频道需要 CLOB API 凭证(key、secret 和 passphrase),在订阅之前以认证帧的形式在已打开的连接上发送。这是与公开的 RTDS 在操作上的主要区别。在发送订阅帧之前,先等待服务器确认认证。
- crypto_prices_chainlink 被什么取代了?
- 被带有过滤条件 {"symbol":"btcusd"} 的 price.crypto 频道取代。除了名称之外还有两处变化:来源从 Chainlink 改为 Pyth,交易对代码格式从 btc/usd 改为小写的 btcusd。对于 60 秒 Chainlink TWAP,使用 price.crypto.twap 并将 window_seconds 设为 60。30 秒 TWAP 主题在 PolyBolt 中没有替代。
- PolyBolt 还需要客户端 PING 吗?
- 不需要。在 RTDS 下,客户端每 5 秒发送一次文本 PING。在 PolyBolt 上,服务器每 25 秒 ping 一次,客户端什么都不用发送,不过也接受可选的 {"op":"ping"}。注意这与 CLOB market 频道不同,后者没有变化,仍然要求客户端每 10 秒发送一次 PING。
- 为什么我连上了 PolyBolt 却收不到任何价格?
- 几乎总是交易对代码格式的问题。PolyBolt 使用以 usd 结尾的小写代码,所以 btcusdt 和 btc/usd 都无效,要用 btcusd。错误的代码不会报错;订阅只是永远不推送数据。还要检查在发送订阅帧之前认证是否已确认,以及你是否把初始的快照帧当成了唯一的数据。
- PolyBolt 的关闭码是什么意思?
- 4001 是认证失败,4002 表示你是慢速消费者、读取 socket 的速度不够快,4003 表示服务器正在排空,4008 是违反策略,比如超过 64 个订阅、每秒 20 个订阅帧、64 KB 的帧大小或 8 个认证帧。4002 是你的消费者的 bug 而不是网络故障,所以不解决吞吐量问题就重连只会重复出现。
获取 Polymarket 不保留的历史数据
PolyTest 在 Polymarket 加密货币 Up/Down 市场运行期间实时记录:240M+ 条快照,包含 8 档订单簿深度、亚秒级时间戳,并保留已结算的市场。从 3 天免费试用开始。
继续阅读
Polymarket WebSocket:不掉线的实时数据
轮询订单簿是白白耗尽速率限制额度最常见的方式。下面介绍四个数据流、没人写进文档的订阅选项,以及那种让你的机器人收到一片沉默、却以为市场很平静的失效模式。
如何构建 Polymarket 交易机器人
大多数 Polymarket 机器人教程都基于已经不存在的 SDK。这是一条最新的端到端路径:2026 年该安装什么、认证实际如何运作、数据缺口在哪里,以及在第一周就让机器人挂掉的失效模式。
2026 年的 Polymarket Python SDK(以及如何迁移出 py-clob-client)
如果你的代码还在从 py_clob_client 导入 ClobClient,那它就建立在一个已被取代的包之上,AI 助手为你写的大部分 Polymarket 代码也是如此。下面介绍当前的 SDK 以及如何迁移。