Polymarket Bot 教程 · 第 11 章,共 32 章
Polymarket 上 NegRisk 多结果市场如何运作:总和趋近 1 的机制、CLOB 订单中的 negRisk 标志、为什么不同 NegRisk 的 YES 仓位不可互换,以及执行最佳实践。
本章涵盖内容
NegRisk 市场是 Polymarket 处理互斥多结果事件的机制-例如 2024 年大选候选人、英超冠军、锦标赛对阵表。大多数 bot 第一次都无法正确处理,因为下单时需要一个标志,而如果缺失,这个标志会被静默丢弃。本章涵盖其机制以及生产代码路径。
- NegRisk 是什么意思(互斥的 Yes 仓位)
- 为什么 YES 总和会保持在接近 1 USD
- 下单中的 neg_risk 参数
- 跨 NegRisk 仓位的对冲
- NegRisk arb 何时有效(以及何时无效)
- 结算边缘情况
- 代码:下一个 NegRisk 订单
NegRisk 是什么意思(互斥的 Yes 仓位)
NegRisk(“negative risk”的缩写)是 Polymarket 处理多个互斥结果事件的机制-只能有一个结果结算为 YES。2024 年总统选举就是一个 NegRisk 事件:Trump-YES 仓位和 Harris-YES 仓位不可能同时获赔。
底层机制是:一个 NegRisk 事件有一个父级 question_id 和 N 个子市场,每个子市场都有自己的 YES/NO。交易所会在结算时强制所有 YES 仓位的总和为 1-恰好一个结算为 1.0,其余都为 0.0。
从 bot 的角度看,每个结果的 YES 仓位都像一个独立 token,有自己的订单簿和价格。下单中的 negRisk 标志(见下文)会把交易路由到 NegRisk 专用的交易所合约;如果缺少它,订单会被发送到标准 CTF 交易所,并且在结算时静默地无法正确结算。
为什么 YES 总和会保持在接近 1 USD
套利者会持续将所有 NegRisk 仓位的 YES 价格总和维持在 ≈ 1.0。如果 Trump-YES 是 0.55、Harris-YES 是 0.40,而且没有其他有竞争力的候选人,那么缺失的 0.05 大致就是“其他任何结果”的隐含概率。当缺失部分超过隐含尾部概率时,就存在套利机会:按比例买入所有 YES 仓位,总成本低于 1.0,锁定差价。
实际上,这种套利竞争非常激烈-在流动性好的事件里,明显折价通常只有 1-2 美分,并且会在开盘几分钟内消失。套利还受流动性限制:你可能只能锁定 1,000 美元的折价,而不是 20,000 美元。
大多数 bot 并不是在做 NegRisk arb;它们是在交易单独仓位,而执行正确性需要遵守 negRisk 标志。
下单中的 neg_risk 参数
在 CLOB v2 SDK 中,下单会接受一个带布尔值 negRisk 的 flags 对象。这个值必须与市场类型匹配:
// Node (CLOB v2)
await client.createAndPostOrder(
{ tokenID, price: 0.45, size: 10, side: Side.BUY },
{ tickSize: '0.01', negRisk: true }, // <-- TRUE for NegRisk
OrderType.FOK
);
这个标志也是大多数生产 bot 使用的 daemon op 签名中的一个参数:
{ op: 'buy', tokenID, price, size, neg_risk: true, order_type: 'FOK' }
真实来源:来自 Gamma API 的 market.negRisk。一定要读取它,绝不要硬编码。BTC 上/下市场是 negRisk: false(binary);锦标赛冠军市场是 negRisk: true(多结果)。接错线会把订单发到错误的交易所,并在结算时导致转账失败。
跨 NegRisk 仓位对冲
如果你持有 0.50 的 Trump-YES,并想对冲 Trump 下跌风险,在 NegRisk 内有两种选择。
买入竞争对手的 NO 仓位(例如 Harris-NO,价格 0.45)。如果 Harris 落败就会获赔,其中包括 Trump 获胜的情况。它是非对称的-Trump 获胜时有收益,但如果 Trump 输给第三方候选人则可能失效。
按比例买入所有竞争对手的 YES 仓位。如果你的组合在所有 NegRisk 仓位上完全平衡,你的风险敞口就被对冲了:恰好会有一个仓位获赔。这就是 synthetic-cash 头寸。
但有一种并不如预期有效的对冲工具:你当前市场的 NO 仓位。Trump-NO 与其他 YES 仓位相关,但并非完全相关-如果结局是“Other”,那么 Trump-YES 和 Trump-NO 都会变成 0。NegRisk 仓位并不是纯粹的二元仓位。
NegRisk arb 何时有效(以及何时无效)
“总和小于 1.0” 的 NegRisk arb 只有在满足以下三个条件时才成立。
- 所有仓位都有流动性:你需要买入的每个仓位在目标价格附近至少有 1k 美元深度。套利需要同时吃掉多个订单簿;只要有一个流动性不足,整笔交易就会失败。
- 价差足够紧:所有仓位累计的 spread-tax 必须小于折价。五个仓位每个 0.5c 的价差,成本就是 2.5c;如果折价只有 1.5c,那么套利就是负收益。
- 你可以持有到结算:NegRisk arb 本质上是结算套利。你要等父级事件结算后才会拿到 payout;如果结算要 6 个月,那么你的资金就会被锁定。
对于 95% 的 bot 来说,NegRisk arb 不是主要策略。剩下的策略是在交易单独仓位,而 negRisk 标志只是为了确保订单正确路由。
结算边缘情况
在持有 NegRisk 仓位并持有到结算时,有两个需要注意的边缘情况。
“None of the above” 结果:某些 NegRisk 事件包含一个明确的 “Other” 或 “None of the above” 仓位。如果实际答案不匹配任何已命名仓位,这个仓位就是赢家。不建模显式 Other 仓位的 bot 有时会把它当成退化情况,从而错过 payout。
有争议的结算:NegRisk 结算和其他市场一样也要经过 UMA。如果发生争议,市场可能会在 24-72 小时内保持未结算状态。在这段时间里,前端可能显示“已结算”,但链上的 payout 还没有最终确定。读取 CTF 合约上的 payoutNumerators 是唯一安全的确认方式。
代码:下一个 NegRisk 订单
下面是一个完整的 Node 示例,演示如何买入 NegRisk 的 YES 仓位。
import { ClobClient, Side, OrderType } from "@polymarket/clob-client-v2";
import { Wallet } from "ethers";
const c = new ClobClient({
host: "https://clob.polymarket.com", chain: 137,
signer: new Wallet(process.env.PRIVATE_KEY),
creds: { key: K, secret: S, passphrase: P },
signatureType: 2,
funderAddress: process.env.POLY_FUNDER,
});
// market.negRisk === true (verified via Gamma earlier)
const resp = await c.createAndPostOrder(
{ tokenID: "<YES_TOKEN_ID>", price: 0.42, size: 25, side: Side.BUY },
{ tickSize: "0.01", negRisk: true },
OrderType.FOK
);
console.log(resp.status, resp.orderID);
新手构建者最常见的 bug:在 NegRisk 市场中省略 negRisk: true。订单会被 CLOB 接受,但结算会失败。务必从 Gamma 读取 market.negRisk 并传递下去;不要只根据问题标题来猜测。










