预测市场把「某件事会不会发生」变成一个可以买卖的价格。作为目前规模最大的链上预测市场之一,Polymarket 采用一种混合架构:订单撮合放在链下、清算结算放在 Polygon 链上,既有中心化交易所的撮合体验,又保留了非托管的链上结算。本文系统梳理在这样一个 CLOB(中央限价订单簿)预测市场上做自动化交易需要用到的数学与工程机器——从平台的代币机制、API 与费用,到做市、仓位管理、套利、信号生成与最优执行,再到风险控制。所有公式均取自公开的量化金融文献与平台文档,目标是把散落各处的知识拼成一张完整的地图。
本文仅为市场机制与量化算法的研究梳理,不构成任何投资建议。预测市场在部分司法辖区受监管限制(如 CFTC 审查、地域封锁),交易前请自行了解合规要求并谨慎评估风险。
一、平台架构:链下撮合 + 链上结算
整个交易系统运行在 Polygon(PoS,Chain ID 137)上,是一种典型的混合去中心化交易所设计。客户端(Python / Rust / TypeScript 等 SDK)通过 REST 与 WebSocket 与一个链下撮合引擎(Operator)交互。撮合引擎负责零 Gas 地接受、取消和撮合订单,维护完整的买卖订单簿,并按 Maker∶Taker 为 1∶1 或 N∶1 的方式配对;价格改善(price improvement)归属于 Taker。撮合完成后,成交被批量提交到链上结算。
链上结算由 CTFExchange 合约完成:它用 EIP-712 验证订单签名,执行非托管的原子代币交换,并支持三种结算模式。
| 模式 | 场景 | 机制 |
|---|---|---|
| NORMAL | A 持 USDC 想买 YES,B 持 YES 想卖 | 直接代币互换 |
| MINT | A 想买 YES @ $0.50,B 想买 NO @ $0.50 | 合约向双方收取 USDC,铸造一对代币后分配 |
| MERGE | A 想卖 YES,B 想卖 NO | 合约收回代币,合并为 USDC 后分配 |
MINT 模式意味着交易所在理论上拥有无限的流动性:只要同时有人想买 YES、有人想买 NO,系统就能用他们合并的担保品直接铸造出新的代币对,而无需预先存在的代币供应。这是预测市场 CLOB 与普通股票订单簿最本质的区别之一。
核心合约地址(Polygon 主网,均为公开链上信息):
| 合约 | 地址 |
|---|---|
| Conditional Tokens | 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 |
| CTF Exchange | 0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E |
| Neg Risk CTF Exchange | 0xC5d563A36AE78145C45a50134d48A1215220f80a |
| Neg Risk Adapter | 0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296 |
| USDC.e(担保品) | 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 |
二、条件代币框架(CTF)
结果份额用 Gnosis 条件代币框架表示为 ERC-1155 代币。整个体系建立在一个简单的恒等式上:
1 YES + 1 NO = 1 USDC(担保品)
代币的推导链条从预言机问题出发,层层哈希得到最终的持仓 ID:
questionId(UMA 辅助数据的哈希)
│
▼
conditionId = hash(oracle, questionId, outcomeSlotCount=2)
│
├── indexSet = 0b01 → YES outcome → collectionId → positionId(YES Token)
└── indexSet = 0b10 → NO outcome → collectionId → positionId(NO Token)
围绕它有三种基本操作:Split(拆分/铸造)——存入 1 USDC 换得 1 YES + 1 NO;Merge(合并/赎回)——归还 1 YES + 1 NO 换回 1 USDC;Resolution(结算)——UMA 预言机裁定条件后,胜方代币以 1∶1 兑换担保品。
对于多结果市场(如「谁赢得选举?」下 5 个候选人),平台采用负风险(Neg Risk)框架:每个结果仍是一个底层的二元 YES/NO 市场,但任一市场的 NO 份额可以转换成其余所有市场各 1 份 YES。其资本效率在于——买齐所有结果只需要 1.0 的担保品,而不是各市场价格的简单相加。
三、API 与数据通道
CLOB API 的基础地址是 https://clob.polymarket.com。公开端点无需认证,可读取订单簿与价格;交易类端点需要 API Key 与签名。
| 类型 | 端点 | 描述 |
|---|---|---|
| GET | /book?token_id=X | 完整订单簿(bids/asks) |
| POST | /books | 批量查询多个订单簿 |
| GET | /midpoint?token_id=X | 最优买卖中间价 |
| GET | /price?token_id=X&side=BUY | 最优可用价格 |
| GET | /spread?token_id=X | 买卖价差数据 |
| GET | /price-history | 历史价格 |
| POST | /order / /orders | 下单 / 批量下单(最多 15 个) |
| DELETE | /order / /orders | 取消 / 批量取消 |
| GET | /orders / /trades | 查询挂单 / 成交记录 |
认证分三级:L0 无认证、只读公开数据;L1 携带 API Key Header,认证读取;L2 完整交易(签名订单)。速率限制按端点区分,例如下单端点的突发上限约为每 10 秒数千次、持续上限约为每 10 分钟数万次,批量下单额度更紧。做自动化时需要把限速当成一等约束纳入调度。
实时数据走 WebSocket。Market Channel(公开)按 asset ID 订阅,推送 book(L2 订单簿更新)、last_trade_price(最新成交价)、price_change(最优买卖价变动)与 tick_size_change(动态 tick size);User Channel(认证)推送个人订单与成交更新。一个典型的订阅消息如下:
{
"auth": {},
"markets": ["<condition_id>"],
"assets_ids": ["<token_id>"],
"type": "market"
}
四、订单类型与费用结构
订单类型覆盖了做市与吃单两类需求:GTC(挂到成交或取消,默认)、GTD(到指定 Unix 时间戳自动过期)、FOK(必须立即全部成交,否则整单取消)、Post-Only(仅 GTC/GTD 可用,保证以 Maker 身份上簿)、按美元金额下的市价单,以及每次最多 15 单的批量下单。
费用设计遵循一个核心原则:Maker 零费用,仅 Taker 付费。费用随价格呈钟形曲线,在 50% 概率处最高:
fee_USDC = baseFeeRate × min(price, 1 - price) × shares
加入品类指数后的扩展形式为 fee = C × p × feeRate × (p × (1 - p))^exponent,不同品类用不同指数塑造曲线形状:
| 指数 | 品类 | 效果 |
|---|---|---|
| 1.0 | 加密货币、体育、政治、金融 | 标准曲线 |
| 2.0 | 通用、提及类 | 更陡,中间费用更低 |
| 0.5 | 经济、天气 | 更平,整体更均匀 |
由此得到几条直接的策略含义:尽量用 Post-Only / GTC 限价单做 Maker 以规避 Taker 费用;在概率接近 50% 的均势市场,费用显著更高,进场时要把它算进成本;而对称的费用设计意味着无法靠「买 YES 对冲卖 NO」来套费用的便宜。
五、流动性提供与激励机制
平台通过 Q-Score 机制奖励挂单者提供流动性:每隔约 60 秒随机快照一次订单簿,用一个二次价差函数为订单打分:
S(v, s) = ((v - s) / v)² × b
其中 v 是仍可获奖励的最大合格价差,s 是订单距(经 size-cutoff 调整的)中间价的价差,b 是订单数量。二次形状重度奖励贴近中间价的报价——把报价从 3 分差收窄到 1 分差,得分的提升远超 3 倍。双边挂单取两侧最小值 Q_final = min(Q_yes, Q_no),单边则按一个折减比率计分。当中间价落在 [0.10, 0.90] 时单边即可计分;在极端区间([0, 0.10) 或 (0.90, 1.0])则必须双边报价才算数。此外,任何人都可以向合约存入 USDC 赞助特定市场,奖励再按流动性贡献比例自动分配。
六、做市算法:Avellaneda-Stoikov 模型
做市的经典框架来自 Avellaneda 与 Stoikov(2008)。它假设中间价 S(t) 服从算术布朗运动 dS(t) = σ dW(t),做市商持有库存 q(t),并最大化终端财富的指数效用 u(W) = -exp(-γ W),其中 γ 是风险厌恶参数。
保留价格
做市商对成交与否「无所谓」的价格称为保留价格,由对应的 HJB 方程求解:
r(s, q, t) = s - q · γ · σ² · (T - t)
其中 s 为当前中间价,q 为库存(正为多头、负为空头),γ 为风险厌恶系数,σ² 为中间价过程方差,T - t 为距终端的剩余时间。直觉是:当持有多头(q > 0)时,保留价格低于中间价,从而更激进地卖出去库存;持有空头时反之,保留价格高于中间价以激励买入回补。
最优价差与报价
δ* = γ · σ² · (T - t) + (2/γ) · ln(1 + γ/k)
这里 k 是市场订单到达强度参数,到达率模型为 λ(δ) = A · exp(-k · δ)。最终买卖报价围绕保留价格对称展开:
p_ask = r(s, q, t) + δ*/2
p_bid = r(s, q, t) - δ*/2
展开后:
δ_bid = (1/2)·γσ²(T-t) + (1/γ)·ln(1+γ/k) + (1/2)·q·γσ²(T-t)
δ_ask = (1/2)·γσ²(T-t) + (1/γ)·ln(1+γ/k) - (1/2)·q·γσ²(T-t)
库存惩罚扩展
为了更强地抑制库存堆积,可在目标函数里加入运行库存惩罚项:
max E[W(T) - γ·Var(W(T)) - φ·∫₀ᵀ q(t)² dt]
相应地,保留价格多出一项与库存成正比的漂移:r(s, q, t) = s - q·γσ²(T-t) - q·φ·(T-t)。
预测市场的适配
预测市场价格被限制在 [0, 1] 区间,直接套用无界布朗运动并不合适。一个常用的处理是先做 logit 变换,在无界空间里应用模型,再变换回来:
r_logit = logit(s) - q · γ · σ²_logit · (T - t)
r = sigmoid(r_logit) = 1 / (1 + exp(-r_logit))
其中 logit(s) = ln(s / (1 - s))
七、Kelly 准则与仓位管理
做市决定「怎么报价」,Kelly 准则决定「下多大」。对于赔率 b∶1、真实胜率 p 的二元下注,最优下注比例为:
f* = (b·p - q) / b = p - (1 - p) / b (其中 q = 1 - p)
它来自最大化财富对数增长的期望:G(f) = p·ln(1 + f·b) + (1-p)·ln(1 - f),令 dG/df = pb/(1+fb) - (1-p)/(1-f) = 0 即得。落到预测市场上,若以价格 P 买 YES(真实概率估计为 p_true),净赔率 b = (1-P)/P,于是:
买 YES @ P: f* = (p_true - P) / (1 - P)
买 NO @ P: f* = (P - p_true) / P
为什么用分数 Kelly
实务中很少用满 Kelly,而是取 f_fractional = α · f*,其中 0 < α ≤ 1,常见区间是四分之一到二分之一 Kelly。原因有四:满 Kelly 假设你确知真实概率,而估计误差会导致系统性过度下注;G(f) 在最大值附近近似抛物线,把 f 减半只损失约四分之一的期望增长(G(f*/2) ≈ G(f*)·(3/4));减仓能显著降低方差和最大回撤;并在概率估计出错时大幅降低破产风险。用一点增长换来数量级更小的波动,通常划算。
多结果与多市场
对 n 个互斥结果(真实概率 pᵢ、价格 Pᵢ),Kelly 变成一个带约束的凸优化问题,可用标准求解器求解:
max Σᵢ pᵢ · ln(1 + Σⱼ fⱼ · (δᵢⱼ/Pⱼ - 1))
约束: Σ fⱼ ≤ 1, fⱼ ≥ 0
若面对的是 N 个相互独立的二元市场,问题可分解为 N 个独立的 Kelly 子问题分别求解;但只要市场之间存在相关性,就必须回到完整的联合分布上统一优化,不能各算各的。
八、统计套利策略
预测市场的定价一致性约束,天然孕育了一批(近似)无风险的套利结构。
互补结果套利(Dutch Book)
二元市场里 YES 与 NO 的价格本应恰好合成 $1。当两侧最优卖价之和低于 1(扣费后)时,同时买入两侧即锁定利润:
若 P_yes + P_no < 1 - fees → 无风险套利
每对利润: π = 1 - P_yes - P_no - 交易成本
分区一致性套利
互斥且穷尽的结果集 {O₁, …, Oₙ} 应满足 Σ P(Oᵢ) = 1。据此可做买入或卖出方向的套利:
买入套利: π = 1 - Σᵢ P_ask(Oᵢ) - fees (当 Σ P_ask < 1)
卖出套利: π = Σᵢ P_bid(Oᵢ) - 1 - fees (当 Σ P_bid > 1)
跨平台与多腿套利
把同一事件在不同平台(如另一个受监管的事件合约交易所)的报价放在一起,当 P_A(YES) + P_B(NO) < 1.00 时即存在跨平台无风险利润。更一般地,给定 m 个市场、n 个世界状态与支付矩阵 A(m×n),寻找组合向量 x 满足所有状态非负支付、非正成本、且至少一个严格不等式——这正是资产定价基本定理下的线性规划可行性问题:
Ax ≥ 0 (所有状态非负支付)
P·x ≤ 0 (非正成本)
至少一个严格不等式 → 套利存在
协整统计套利
对相关但非同一事件的市场,可用协整思路:先用 Engle-Granger 或 Johansen 检验协整关系,构造平稳价差 z(t) = P₁(t) - β·P₂(t),再用 OU 过程建模并按 z-score 交易:
dz = θ(μ - z)dt + σ_z dW
半衰期: t_half = ln(2) / θ
z-score = (z(t) - μ) / σ_z
交易规则:
z > +阈值: 卖出(价差过宽)
z < -阈值: 买入(价差过窄)
OU 参数可由回归 ΔP(t) = a + b·P(t-1) + ε(t) 校准,得到 θ = -b/Δt、μ = -a/b、σ = std(ε)/√Δt。
九、贝叶斯更新与信号生成
当把新息(民调、新闻、盘口)融进概率估计时,贝叶斯框架给出自洽的更新规则。
Beta-Binomial(二元事件)
取先验 p ~ Beta(α, β),观测 n 个信号中 s 个正面后:
后验: p | data ~ Beta(α + s, β + n - s)
后验均值 = (α + s) / (α + β + n)
= w · 先验均值 + (1 - w) · 观测频率, w = (α+β)/(α+β+n)
高斯信号的连续更新
若先验 p ~ N(μ₀, σ₀²)、信号 x|p ~ N(p, σ_x²),后验仍是高斯:
μ₁ = (σ_x²·μ₀ + σ₀²·x) / (σ₀² + σ_x²)
σ₁² = (σ₀²·σ_x²) / (σ₀² + σ_x²)
K 个信号顺序更新(精度形式):
τ_posterior = τ_prior + Σᵢ τᵢ
μ_posterior = (τ_prior·μ_prior + Σᵢ τᵢ·xᵢ) / τ_posterior
Thompson 采样:探索与利用的平衡
为每个市场维护一个 Beta(α, β) 后验,每一步从后验中采样 p̃,以 E[π] = |p̃ - P_market| 估计期望利润,把资金分配到期望利润最高的市场,观测结果后再更新 α、β。这套机制会自动在不确定的市场减仓、在有把握的市场集中下注,无需手工调节探索强度。
十、LMSR 对数市场评分规则
除了 CLOB,预测市场的另一条经典定价路线是 Hanson 的对数市场评分规则(LMSR)。给定 n 个结果、流通份额 q = (q₁, …, qₙ),成本函数为:
C(q) = b · ln(Σᵢ exp(qᵢ / b))
其中 b 是流动性参数。价格是成本函数的偏导,恰好是一个 softmax,天然满足求和为 1、且落在 (0,1) 内:
pᵢ(q) = ∂C/∂qᵢ = exp(qᵢ/b) / Σⱼ exp(qⱼ/b)
从 q 变到 q′ 的交易成本是两次成本函数之差;买入 Δ 份结果 k 的成本可写成 Cost = b · ln(1 + p_k · (exp(Δ/b) - 1))。二元市场是其特例,价格退化为 sigmoid:p_yes = 1 / (1 + exp(-(q_y - q_n)/b))。做市商的最大损失有界:L_max = b · ln(n),二元市场即 b · ln(2) ≈ 0.693b——这也是选取 b 的核心权衡:b 越大,盘口越深、越难被推动,但潜在最大亏损也越大。
十一、技术指标与 Alpha 生成
价格时间序列上的经典技术分析同样适用,只是要结合预测市场的特性(价格有界、成交量事件驱动)审慎使用。
均线交叉:快慢均线(或 EMA,EMA(t) = α·P(t) + (1-α)·EMA(t-1),α = 2/(n+1))金叉买 YES、死叉买 NO。
动量:RSI = 100 - 100/(1 + RS),RS = avg_gain(n)/avg_loss(n);RSI > 70 视为超买(概率可能已过度上移),RSI < 30 视为超卖。MACD 则用 EMA_12 - EMA_26 与其 9 周期信号线的差判断动能。
均值回归:当市场价偏离基本面模型估计时,用标准化偏离 z(t) = (P_market - P_model)/σ_historical 触发反向交易——z > +阈值 卖 YES、z < -阈值 买 YES,仓位按 |z| 或 Kelly 缩放。
成交量信号:VWAP 给出成交量加权的价格中枢,量价趋势 VPT(t) = VPT(t-1) + V(t)·(P(t)-P(t-1))/P(t-1) 捕捉资金流方向。
十二、执行算法
有了信号和目标仓位,还要以尽量低的冲击把单子执行掉。
TWAP 把总量 Q 均分成 N 份、总时间 T 均分成 N 段;在预测市场里的适配是:无流动性时跳过该时段,并用限价单替代市价单。VWAP 按历史成交量分布分配 q(t) = Q · V_hist(t) / Σ V_hist(t);但预测市场成交量高度事件驱动,应改用近期模式而非长期历史的自适应 VWAP。
Almgren-Chriss 最优执行把冲击建模为临时影响 h(v) = η·v 与永久影响 g(v) = γ·v,在 min E[Cost] + λ·Var[Cost] 下解出清仓 Q 份的最优轨迹:
x(t) = Q · sinh(κ(T-t)) / sinh(κT)
v(t) = -Q·κ · cosh(κ(T-t)) / sinh(κT)
κ = √(λ·σ² / η)
两个极端很直观:λ → 0(风险中性)退化为均匀执行(TWAP);λ → ∞(极度厌恶风险)则倾向立即清仓。
滑点估算可从粗到细:线性模型 slippage = Q/(2·L)(L 为价格区间内总流动性);平方根模型 slippage = η·σ·√(Q/ADV)(η 约 0.1–0.5,ADV 为日均量);最精确的是直接在订单簿上模拟逐档吃单,AvgPrice = Σᵢ Pᵢ·min(qᵢ, Q_remaining)/Q,滑点即 AvgPrice - BestPrice。
十三、开源生态与做市策略
围绕这个平台已经形成相当完整的开源工具链。官方与社区分别提供了 SDK、CLI、做市机器人、实时数据客户端与统一交易抽象。以下为截至研究时点的部分代表项目(星标数会随时间变化):
| 项目 | 语言 | 用途 |
|---|---|---|
| 官方 agents 框架 | Python | AI 代理框架,LLM + RAG 自主交易 |
| 官方 CLI | Rust | 命令行工具 |
| py-clob-client | Python | 核心 Python SDK |
| rs-clob-client / clob-client | Rust / TypeScript | 多语言客户端 |
| poly-market-maker | Python | 官方做市 Bot(AMM + Bands 策略) |
| ctf-exchange | Solidity | 核心交易所合约 |
| real-time-data-client | TypeScript | WebSocket 实时数据 |
社区侧也有不少值得参考的项目:一个自称「预测市场的 CCXT」的统一 API 层;实战做市 Bot(作者坦言竞争已让利润明显下降);公开的大型历史数据集(数十 GiB 量级);面向短周期加密市场的实时助手;企业级微服务架构实现;把交易能力封装成 MCP 服务器供 AI 助手直接调用的项目;以及跨平台套利机器人等。这些项目对理解真实做市与套利的工程细节很有帮助。
官方做市策略拆解
官方做市 Bot 内置两套策略。AMM 策略模拟集中流动性 AMM 的行为:以 p_min、p_max、spread、delta、depth、max_collateral 为参数,从 price - spread 到 price - depth 按 delta 间隔铺买单,对称地在上方铺卖单。Bands 策略则是基于 margin 的区间方法:用 minMargin/avgMargin/maxMargin 与 minSize/avgSize/maxSize 定义若干价带,保证每个价带内的净订单量落在 [minSize, maxSize] 之间。两套策略默认每 30 秒同步一次报价。
十四、风险管理框架
再好的信号也要配上纪律化的风控。仓位管理层面,常见做法是 Kelly(或其分数版)确定单笔规模、固定分数法控制每笔风险敞口、并对单一市场设置绝对上限(示例区间量级为每市场数百美元)。止损/止盈层面,做市通常用较窄的止盈与偏紧的止损,方向性交易则放宽;止损触发后设置冷却期暂停交易,并对跨市场总敞口设硬上限。
预测市场还有几类特有风险需要专门缓解:
| 风险类型 | 描述 | 缓解措施 |
|---|---|---|
| 二元结算风险 | 仓位在结算时跳变到 $0 或 $1 | 结算前减仓;用分数 Kelly |
| 流动性风险 | 订单簿薄,大单滑点大 | 下单前查市场深度;设最低流动性阈值 |
| 相关性风险 | 同一事件的多个市场高度相关 | 用负风险框架;限制单事件总敞口 |
| 波动率风险 | 高波动期风险加剧 | 波动率过滤器;必要时暂停 |
| 智能合约风险 | 依赖链上合约的执行安全 | 限制总存入量;使用经审计合约 |
| 监管风险 | 合规审查与地域限制 | 持续关注政策动态 |
资本效率同样是风控的一部分:通过 Merge 把配对的 YES + NO 合并回收 USDC,对做市商尤为关键;在多结果事件中还可用负风险转换跨市场腾挪 NO 仓位。最后,任何策略上线前都应过一遍盈亏平衡边际:大致要求 所需边际 > fee_rate × E[|payout - cost|] / E[|profit|],确保 edge 足够覆盖费用与摩擦。
十五、数据源与 Alpha 来源
官方数据接口构成了信号的第一层来源:CLOB API 提供订单簿、价格与交易执行;Gamma API 提供市场/事件元数据与搜索;Data API 提供仓位、成交与排行榜;两条 WebSocket 分别推送实时成交/订单更新与链上/股票行情。
更有价值的 Alpha 往往来自外部数据与市场价的比对:新闻(经向量化后做 RAG 分析)、民调数据对政治市场的定价、体育博彩线与盘口的差异、链上预言机的 BTC/USD 价格、主流交易所现货作为加密市场参考价,以及链上 Subgraph 提供的活动、持仓与盈亏数据。此外,排行榜与「鲸鱼追踪」接口(按利润/成交量排行、查询特定地址、按 condition_id 查大额持有者)可以从聪明钱的行为中提取额外信号。
十六、参考文献
本文所引公式与方法主要来自以下学术文献:
- Avellaneda, M. & Stoikov, S. (2008). "High-frequency trading in a limit order book." Quantitative Finance, 8(3), 217–224.
- Hanson, R. (2003). "Combinatorial Information Market Design." Information Systems Frontiers, 5(1), 107–119.
- Hanson, R. (2007). "Logarithmic Market Scoring Rules for Modular Combinatorial Information Aggregation." Journal of Prediction Markets, 1(1), 3–15.
- Kelly, J. L. (1956). "A New Interpretation of Information Rate." Bell System Technical Journal, 35(4), 917–926.
- Almgren, R. & Chriss, N. (2001). "Optimal execution of portfolio transactions." Journal of Risk, 3(2), 5–39.
- Guéant, O., Lehalle, C.-A., & Fernandez-Tapia, J. (2012). "Dealing with the Inventory Risk." Mathematics and Financial Economics, 7(4), 477–507.
- Chen, Y. & Pennock, D. M. (2007). "A utility framework for bounded-loss market makers." Proceedings of UAI.
工具与框架方面,Hummingbot 提供了含 Avellaneda-Stoikov 实现的开源做市 Bot,Gnosis 条件代币仓库给出了 LMSR 与固定乘积做市商的参考实现,预测市场专用 SDK 与统一交易 API 则大幅降低了对接成本。把这些理论与工具拼在一起,就得到了在 CLOB 预测市场上做系统化交易的完整脚手架——但正如社区实践反复提醒的:公开的 edge 会被竞争迅速磨平,真正的护城河永远在数据、执行细节与纪律里。