← 研究笔记
技术研究 · 2026-04-01

预测市场自动化交易全景:机制、做市、套利与执行

系统梳理在 CLOB 预测市场上做自动化交易所需的数学与工程:从链下撮合/链上结算的平台机制、条件代币与 API 费用,到 Avellaneda-Stoikov 做市、Kelly 仓位、统计套利、贝叶斯信号、LMSR 与 Almgren-Chriss 最优执行,并附风险管理与数据源梳理。

预测市场把「某件事会不会发生」变成一个可以买卖的价格。作为目前规模最大的链上预测市场之一,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 验证订单签名,执行非托管的原子代币交换,并支持三种结算模式。

模式场景机制
NORMALA 持 USDC 想买 YES,B 持 YES 想卖直接代币互换
MINTA 想买 YES @ $0.50,B 想买 NO @ $0.50合约向双方收取 USDC,铸造一对代币后分配
MERGEA 想卖 YES,B 想卖 NO合约收回代币,合并为 USDC 后分配
关键洞察

MINT 模式意味着交易所在理论上拥有无限的流动性:只要同时有人想买 YES、有人想买 NO,系统就能用他们合并的担保品直接铸造出新的代币对,而无需预先存在的代币供应。这是预测市场 CLOB 与普通股票订单簿最本质的区别之一。

核心合约地址(Polygon 主网,均为公开链上信息):

合约地址
Conditional Tokens0x4D97DCd97eC945f40cF65F87097ACe5EA0476045
CTF Exchange0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E
Neg Risk CTF Exchange0xC5d563A36AE78145C45a50134d48A1215220f80a
Neg Risk Adapter0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296
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(α, β) 后验,每一步从后验中采样 ,以 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 框架PythonAI 代理框架,LLM + RAG 自主交易
官方 CLIRust命令行工具
py-clob-clientPython核心 Python SDK
rs-clob-client / clob-clientRust / TypeScript多语言客户端
poly-market-makerPython官方做市 Bot(AMM + Bands 策略)
ctf-exchangeSolidity核心交易所合约
real-time-data-clientTypeScriptWebSocket 实时数据

社区侧也有不少值得参考的项目:一个自称「预测市场的 CCXT」的统一 API 层;实战做市 Bot(作者坦言竞争已让利润明显下降);公开的大型历史数据集(数十 GiB 量级);面向短周期加密市场的实时助手;企业级微服务架构实现;把交易能力封装成 MCP 服务器供 AI 助手直接调用的项目;以及跨平台套利机器人等。这些项目对理解真实做市与套利的工程细节很有帮助。

官方做市策略拆解

官方做市 Bot 内置两套策略。AMM 策略模拟集中流动性 AMM 的行为:以 p_minp_maxspreaddeltadepthmax_collateral 为参数,从 price - spreadprice - depthdelta 间隔铺买单,对称地在上方铺卖单。Bands 策略则是基于 margin 的区间方法:用 minMargin/avgMargin/maxMarginminSize/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 查大额持有者)可以从聪明钱的行为中提取额外信号。

十六、参考文献

本文所引公式与方法主要来自以下学术文献:

工具与框架方面,Hummingbot 提供了含 Avellaneda-Stoikov 实现的开源做市 Bot,Gnosis 条件代币仓库给出了 LMSR 与固定乘积做市商的参考实现,预测市场专用 SDK 与统一交易 API 则大幅降低了对接成本。把这些理论与工具拼在一起,就得到了在 CLOB 预测市场上做系统化交易的完整脚手架——但正如社区实践反复提醒的:公开的 edge 会被竞争迅速磨平,真正的护城河永远在数据、执行细节与纪律里。

Amos · research.xishe.ai · 转载注明出处