Polymarket Bot 教程 · 第 21 章,共 32 章
Polymarket 二元 Yes/No 市场 bot 策略:标准事件合约、硬性上限 1x 杠杆、通过组合广度扩展规模、常见错误(追逐 0.99),以及代码骨架。
本章内容
二元(Yes/No)市场是 Polymarket 的基础。大多数策略都落在这里。本章涵盖杠杆上限、会让新开发者踩坑的 0.99 价格陷阱,以及生产级 bot 最终会收敛到的“靠广度而不是靠单笔规模”模式。
- 二元市场覆盖什么
- 1x 杠杆上限(以及如何绕开它扩展规模)
- 常见错误:追逐 0.99 价格
- 组合广度作为有效杠杆
- 单市场风险 vs 组合风险
- 代码:扫描二元市场并按规模下单
二元市场覆盖什么
二元市场是 Polymarket 的基础:一个 yes/no 问题,对应两个结果 token。“Trump 会赢得 2024 年大选吗?”是二元;“谁会赢得 2024 年大选?”如果有 5 位候选人,则是 NegRisk(第 11 章)。
二元市场中的两个结果 token(YES 和 NO)之和为 1.0,再减去一小部分价差税。你可以买任一边;两边都有自己的订单簿。价格是对称的-以 0.40 买入 YES,在预期收益上等价于以 0.60 卖出 NO。
Polymarket 上大多数非锦标赛市场都是二元的:天气问题、单一事件的政治结果、单场体育比赛、单个价格目标的加密货币问题。bot 模式在这些市场里大体相同。
1x 杠杆上限(以及如何绕开它扩展规模)
Polymarket 的二元市场是 1x 杠杆:你花 40 美元以 0.40 的价格买入 100 股;最高回报是 100 美元。没有保证金,也没有强平。资本效率低于永续合约(第 24 章),后者可提供 2-25x。
绕过 1x 上限扩展规模的方法有三种:(1)在多个市场部署更多资本-分散而不是加杠杆,(2)通过已结算市场轮转资本-每次结算后释放资金并转投下一个,(3)使用 NegRisk 市场,其中 sum-to-1 套利可以形成有效的合成杠杆。
二元策略的正确定位:低杠杆、高广度。50 个市场各持有少量仓位,是成熟 bot 的典型形态,而不是在 5 个市场里各押大仓位。
常见错误:追逐 0.99 价格
最常见的二元 bot 失败方式:买入接近结算的强势热门到 0.99,期待它在结算为 YES 时轻松赚到 1 美分。
数学上看:在 0.99 时,你花 99 美分去赚 1 美分。1% 的失败率(100 个市场里有 1 个),每次损失 99 美分,会抹掉 99 次成功的 1 美分收益。极端情况下,风险收益比非常糟糕。
容量也是问题。0.99 附近的订单簿很薄;一旦你下有意义的规模,价格会被推到 0.995 甚至更高,已经很薄的优势会进一步被侵蚀。
除非你有专门针对尾部收益套利画像设计的策略,否则不要进入价格 > 0.92 的市场。大多数二元 bot 都不应该买到 0.85 以上。
组合广度作为有效杠杆
你无法对单笔仓位加杠杆,但可以通过同时持有大量不相关仓位,来放大组合的方差特征。
50 个仓位,每个 20 美元,总计就是 1,000 美元在运作中。如果胜率是 55%,经济模型为 +3c/-4c,那么预期日 PnL 为 (0.55 × 3 − 0.45 × 4) × 50 × $0.20 = 预期 $1.50,且方差受控。与单个 1,000 美元仓位相比,预期回报相同,但回撤要小得多。
限制条件:这些仓位必须是真正不相关的。一个周末里 50 个 NFL 热门队并不等于 50 笔独立仓位;它们在很大程度上是跨比赛相关的天气+热门队仓位。应当在体育类型、事件类型、时间跨度上做分散。
单市场风险 vs 组合风险
两层风险上限,缺一不可。
- 单市场:每个市场最多投入 $X,不论 edge 多强。用于限制单一市场灾难性损失。常见数值:每个市场 $25-100。
- 组合:任意时点允许部署的总资本上限。用于限制在多个不相关坏日中的总回撤。常见数值:钱包余额的 50-70%。
单市场上限更重要,因为它限定了任何单个 bug 或 edge 消失事件的爆炸半径。组合上限是一个合理性检查;当你持有 50+ 个仓位时,即使没有它,大数法则通常也会把你控制在边界内。
这两个上限都应该写进代码,而不是只记在脑子里。没有强制上限的 bot,迟早会找到一种配置,把 90% 的资金压进单一市场,然后全部亏掉。
代码:扫描二元市场并按规模下单
参考实现:扫描成交量最高的二元市场,筛选合格 setup,按规模执行 FOK 买单。
def scan_and_buy():
events = gamma_top_events(limit=50, active=True, closed=False)
for ev in events:
for m in ev.get("markets", []):
if m.get("negRisk"): continue # binaries only
outs = json.loads(m["outcomes"])
prices = [float(p) for p in json.loads(m["outcomePrices"])]
for i, out_name in enumerate(outs):
if not setup_qualifies(m, i, prices[i]): continue
tok = json.loads(m["clobTokenIds"])[i]
size = compute_size(m, prices[i])
if size < 5: continue
place_fok(tok, "BUY", prices[i] + 0.02, size, neg_risk=False)
def setup_qualifies(m, idx, price):
return 0.10 <= price <= 0.85 # avoid extremes
setup_qualifies 函数就是你的策略所在。外层包装只是管道代码。





