Polymarket 量化交易实战(八):双向套利策略详解

417 阅读3分钟

这是系列中最“硬核”的一篇。

我们将揭开 V5 机器人的核心盈利逻辑——双向做市(Two-Sided Market Making)。
这里没有玄学,只有数学。

1. 策略原理:利用互补性

Arbitrage Math: Cost < Value Arbitrage Math: Cost < Value

预测市场有一个核心公理:
Yes Price + No Price = 1.0 (理论值)

如果市场上 Yes 卖 0.60,No 卖 0.40,这是完美平衡。
但实际上,订单簿往往是这样的:

  • Yes: Bid 0.58 / Ask 0.62
  • No: Bid 0.38 / Ask 0.42

我们的机会:Spread(价差)
作为 Maker,我们同时挂买单:

  • Yes @ 0.59
  • No @ 0.39

盈利推演:
假设两个单子都成交了:

  • 成本 = 0.59 + 0.39 = 0.98
  • 最终价值 = 1.00 (无论结果如何,合并后可赎回 $1)
  • 无风险利润 = 1.00 - 0.98 = $0.02 (ROI 2%)

结论:双向套利的本质,是用 0.98 的成本,合成了价值 1.00 的完整资产。

2. 代码实现:SimpleUpDownCycle

在代码中,我们并不追求“完美对冲”,而是动态压价。

# 策略:跟随并压价 (Penny Jump)
# 在 Ask 价格下方 -0.02 处挂单,保证成交即有利润空间
price_yes = raw_ask_yes - 0.02
price_no = raw_ask_no - 0.02

# 价格保护:如果加起来太贵,就别干了
if price_yes + price_no > 0.99:
    return # 没油水

为了让两边订单尽可能同时到达服务器,使用 place_orders_batch 批量发送(注意:这不是原子操作,订单仍可能部分成功)。

3. 库存管理的挑战

Dynamic Inventory Expansion Dynamic Inventory Expansion

理论很美好,现实很骨感。
最常见的情况是:一边成交了,另一边没成交。
这就形成了 Delta 风险

解决方案:动态平衡机制
我们在 V5 中引入了基于库存的动态开关:

# 获取持仓
up_pos = self.get_pos(up_id)
down_pos = self.get_pos(down_id)

# 动态扩容逻辑
# 如果两边都有持仓(形成对冲),允许额外持有 10 份
max_pos = 9.0 + (10.0 if (up_pos > 0 and down_pos > 0) else 0.0)

逻辑解析:

  • 如果不平衡(只有 Yes),限制仓位,防止单边投机。
  • 如果平衡(Yes/No 都有),说明我们持有的是无风险的合成资产(Synthetic Cash),这时候可以放宽限制。

4. 额外收益:Maker Rebates

除了 Spread 收益,Polymarket 还有一个官方的 Maker Rebates Program(做市商返点计划)

机制:

  • 在 15 分钟 Crypto 市场,Taker 支付的手续费会进入奖励池
  • 奖励池按做市商的成交量比例,每日分配 USDC 返点
  • 返点直接打入钱包,无需申请

如何检查市场是否启用返点:

# 查询 token 的费率
# fee_rate_bps = 1000 表示启用(1%)
# fee_rate_bps = 0 表示无费用

这意味着:在有费用的市场做市,你不仅赚 Spread,还能额外获得平台返点。

这套策略的边界

双向套利不是“无脑印钞机”,它有明确生效条件:

  1. 成本和成交必须稳定低于 1.0。
  2. 双腿下单的时序误差要足够小。
  3. 库存偏斜要能被及时拉回。

只要这三条里有一条被破坏,策略就会从“搬砖”变成“扛风险”。
所以这套方法的核心不是激进,而是纪律:有优势才做,没优势就空转等待。