Expected value Polymarket arbitrage: how to calculate EV correctly
Practical guide to computing expected value for Polymarket arbitrage trades, including taker fees, partial-fill probability, and settlement risks. Step-by-step EV formulas and a working code example.
预期收益(EV)在 Polymarket 套利中的计算方法
本指南逐步展示如何计算 Polymarket 套利交易的预期收益(expected value,EV),包括 taker 费用、部分成交概率以及结算风险。如果你在 Polymarket 上做 intra-market 二元或组合套利,这些公式可以把名义价格差转换为可操作的 EV 估算值。
要点总结
- EV = (到手收益 − 成本 − 费用) × 成交概率 − 来自部分成交与结算时序的下行损失。
- 始终将 taker 费用和预期的部分成交率包括进来;Polymarket 的 maker 费用为零,所以只有当你挂单做被动流动性时才相关。
- 对于小额订单,使用简单的概率模型(Bernoulli 或二项分布)建模部分成交;当执行跨多档价格时对模型进行扩展。
- 切勿将套利交易称为“无条件的风险免费”——必须列出解析风险、滑点、费用、UMA 争议以及智能合约或时序风险。
1. 预测市场套利的 EV 基础
从第一性原理出发。一次完整且成功的套利,买入一套完整的结果代币的成本为 C(等于买入的 best-ask 价格之和加上任何 taker 费用),在结算后每套最终可赎回为 $1.00。名义上的 edge 为:
Edge = 1.00 − C
在不计费用与执行风险前的期望值就是每套的 Edge。用于实际交易时,你必须把它转换为 EV(期望货币收益),考虑费用、订单按报价成交的概率以及可能的部分成交。
EV_basic = Edge × FillProbability − Fees_expected
接下来会细化 FillProbability 和 Fees_expected 的计算。
2. 将 taker 费用与结算流程计入模型
在 Polymarket 上,taker 费用随市场分类变化,目前区间大约在 0% 到 1.8% 之间;maker 费用为零。做套利通常在跨价吃单的已成交腿上支付 taker 费用。
当你买入 N 个结果(在多结果市场中为一套完整结果,二元市场中为 YES 和 NO 两腿),计算毛成本:
C_gross = Σ bestAsk_i
taker 费用以基点或百分比表示。如果 fee_rate 是 taker 费用(以小数表示),你的费用大致为:
Fees = fee_rate × C_gross
如果某些腿作为 maker 成交(在紧套利中罕见)则不产生费用;可以通过把 C_gross 拆分为 maker 与 taker 部分来建模。
净成本 C_net = C_gross + Fees
那么在完全成交且可赎回的情况下名义利润为:
Profit_full = 1.00 − C_net
但 Profit_full 只有在 FillProbability_full 的概率下实现,所以 EV 的贡献为 Profit_full × FillProbability_full。
3. 对部分成交和不对称执行的建模
部分成交是实际损失的最常见来源。两个示例:
- 你的订单把 YES 全部买入但 NO 只部分成交。你会剩下一个按高于对冲隐含价格持有的 YES 头寸。
- 成交横跨多个价格档;实际实现的 C_gross 高于首档 best ask 之和。
对小额订单,一个简单而有用的模型是在显示的 best ask 上对每腿使用 Bernoulli 填单概率。对于较大规模,可以把填单建模为二项分布或把订单按价格档切片为确定性量。
计算中使用的符号:
- q_i = 针对第 i 条腿的目标数量(按结果代币份数)
- f_i = q_i 在发布的 best ask 下完全成交的概率
- r_i = 第 i 条腿的期望成交比例(0 ≤ r_i ≤ 1)
当可能发生部分成交时的期望成本:
E[C_gross] = Σ (bestAsk_i × q_i × r_i)
期望费用按比例跟随:
E[Fees] = fee_rate × E[C_gross](针对 taker 成交部分)
但部分成交会产生不对称的残余头寸。常见的保守做法是假设任何残余的单一结果头寸必须立即按更差的 mid/ask 价格平仓,并将该平仓的期望损失包含进 EV。
例如,如果你期望买入一套完整结果,但平均只在 NO 上成交 90%,你将持有 10% 的 YES,且你为这些 YES 支付了价格 p_yes。最坏情况下的残余损失大致为 0.90 × (p_yes − mid_unwind_price)(需调整刻度和费用)。把期望残余损失项 L_residual 包含进 EV。
4. 一个可实现的逐步 EV 公式
定义:
- n = 一套中的结果数(binary 时 n=2)
- ask_i = 第 i 个结果的 best ask 价格,单位美元
- q = 目标完整套数(份数;例如 10 套)
- fee = taker 费用率,十进制表示(例如 0.006 表示 0.6%)
- r_i = 第 i 条腿的期望成交比例(0..1)。若考虑完全成交则 r_i = 1.0。
- p_unwind_i = 任何残余头寸在第 i 个结果中可关闭的预期价格(保守做法:使用当前更差的 ask 或 mid)
计算:
- E[C_gross] = Σ_i ask_i × q × r_i
- E[Fees] = fee × E[C_gross]
- E[C_net] = E[C_gross] + E[Fees]
- 完整套赎回的期望支付 = q × 1.00 × P_redeem (P_redeem 为最终可赎回的概率;在没有 UMA 争议时通常为 1.0 —— 但下面会包括争议风险)
- 期望残余损失 L_residual = Σ_i max(0, q × (1 − r_i) × (paid_price_i − p_unwind_i))
最终 EV 估算:
EV = q × P_redeem − E[C_net] − L_residual
若你偏好每套的 EV,则将 EV 除以 q。
关于 P_redeem 的说明:UMA 争议可能会暂停或改变结算。将 P_redeem 设为 ≤ 1.0 以反映非零的争议风险;对许多市场可以近似 P_redeem ≈ 1.0,但必须明确考虑结算被延迟或争议的可能性。
5. 一个可运行且保守的数值示例(二元)
假定一个小规模的二元套利,你打算通过以各自 best ask 买入 YES 和 NO 来购买 100 套完整结果。数值仅作示例;费用保持在文档区间内。
- ask_YES = $0.49
- ask_NO = $0.50
- q = 100 套
- fee = 0.006(0.6% taker 费用)
- r_YES = 1.0, r_NO = 0.95(NO 在首档可能部分成交)
- p_unwind_NO = $0.52(你预计出售残余 NO 的价格)
- P_redeem = 1.0(假设最终可赎回)
计算 E[C_gross] = (0.49 + 0.50) × 100 × average_r
更精确地:
E[C_gross] = (0.49 × 100 × 1.0) + (0.50 × 100 × 0.95) = 49.00 + 47.50 = 96.50
E[Fees] = 0.006 × 96.50 = 0.579
E[C_net] = 96.50 + 0.579 = 97.079
Payout = 100 × 1.00 = 100.00
L_residual:你本预期买入 100 个 NO,但只获得 95 个,因此如果目标是持有完整套,你会短缺 5 个 NO。部分成交留下的典型残余是另一腿(YES)的超额敞口——在本例中部分成交会留下 5 个未匹配的 YES(假设 NO 是未完全成交的一腿)。如果你为这些 YES 支付了 0.49 并且必须以 p_unwind_YES 平仓(保守估计),据此计算。为对称起见,对被误填腿的保守残余损失估算为:
L_residual = (q × (1 − r_NO)) × (paid_price_NO_unpaired − p_unwind_NO)
如果未配对的是更贵的一腿,则包括该项损失。带入数值时应保守以避免高估 EV。
最终 EV = 100 − 97.079 − L_residual
若 L_residual 很小,该交易仍为正 EV;若 L_residual 超过名义 Edge,则该交易为负 EV。在下单前用程序运行这些计算。
6. 一个简短且可用的 JavaScript 代码片段
此片段计算每套的 EV,基于上文输入。它是有效的 JavaScript,可直接放入你的风控框架中。
function computeEVPerSet(asks, r, fee, p_unwind, P_redeem = 1.0) {
// asks: array of best asks for each outcome, e.g. [0.49, 0.50]
// r: array of expected fill fractions for each outcome, e.g. [1.0, 0.95]
const n = asks.length;
const q = 1; // per-set basis
const E_C_gross = asks.reduce((s, a, i) => s + a * q * r[i], 0);
const E_Fees = fee * E_C_gross;
const E_C_net = E_C_gross + E_Fees;
// Residual loss: assume unfilled fraction must be closed at p_unwind
const L_residual = asks.reduce((s, a, i) => {
const unfilled = q * (1 - r[i]);
const paid_price = a; // price you paid for filled portion of this outcome
const unwind_price = p_unwind[i];
return s + Math.max(0, unfilled * (paid_price - unwind_price));
}, 0);
const EV = q * P_redeem - E_C_net - L_residual;
return { EV_per_set: EV, E_C_gross, E_Fees, L_residual };
}
// Example
const asks = [0.49, 0.50];
const r = [1.0, 0.95];
const fee = 0.006; // 0.6%
const p_unwind = [0.48, 0.52];
console.log(computeEVPerSet(asks, r, fee, p_unwind));
根据保守原则调整 p_unwind 值(使用更差的 ask 或 mid),并根据历史在你交易规模下的填单率设置 r。
7. 实盘交易的实用建议
- 按品种和规模衡量经验填单率。使用短期、频繁的监测窗口;市场微观结构随市场而异。
- 将大笔目标数量切成更小的切片,以降低部分成交风险,并在适用时遵守 builder 或 relayer 的限额。
- 考虑 tick-size 行为:当价格接近极端值时刻度会收紧到 $0.001,这会改变平仓滑点。
- 在 P_redeem 中包含 UMA 争议与结算时序风险。争议可能暂停结算并影响机会成本。
- 遵守地理限制:市场按 IP 进行地域封锁;切勿建议使用 VPN 绕过限制。
对你交易的影响
在发送订单前计算每套的 EV,并将其与你的内部最低可接受 EV(已包含资金成本、被锁定 pUSD 的机会成本以及争议延迟的成本)比较。在小而频繁的套利中,通常需要在扣除费用和预期残余损失后每套仍有适度正 EV,才值得承担运营开销。
以主关键词结尾:expected value Polymarket arbitrage 应始终保守计算,明确建模 taker 费用和部分成交概率。
常见问题解答
如何为更大订单建模部分成交概率?
从你交易规模的经验填单率开始。对小增量使用按切片的 Bernoulli 假设;对较大规模把成交建模为跨价格档的二项分布之和,或使用历史的挂单深度进行确定性切片。估算 r_i 时始终偏保守。
在 EV 计算中我应该包含哪些费用?
包含已成交腿的 taker 费用——Polymarket 的 taker 费用目前随分类在 0% 到 1.8% 之间;maker 费用为零。把费用建模为 fee_rate × 已成交成本,并在适用时把已成交成本拆分为 maker/taker 部分。
我需要在 EV 中考虑 UMA 争议吗?
需要。UMA 争议可能暂停结算或改变时序。在模型中包含一个 ≤ 1.0 的 P_redeem 因子,以反映争议概率及结算延迟的时间价值/成本。
如果我打算以后再做组合平衡,能否忽略残余的平仓损失?
不能。残余头寸带来市场和方向性风险。除非你有经过统计验证且记录在案的补平计划及已知成本,否则在 EV 模型中包含一个保守的平仓价格 p_unwind。
名义 edge 是否等同于 EV?
不是。名义 edge = 1.00 − Σ bestAsk_i。EV 会调整该 edge,考虑 taker 费用、部分成交概率、残余平仓损失以及结算/争议风险。用 EV 来做决策。
参考术语
相关指南
仅供教育用途。非金融、法律或税务建议。Polymarket在你的司法管辖区可能不可用。