Polymarket 上的执行 Alpha:滑点、价差以及为什么中间价是谎言
Polymarket 上的执行 Alpha:滑点、价差以及为什么中间价是谎言
如果你只想记住关于中央限价订单簿(CLOB)交易的一件事,那就是:
中间价不是可交易的价格。它是一个统计数据。
在 Polymarket 上,一个优秀的论点与一笔盈利交易之间的差距通常只有几个基点的执行成本。这个差距来自:
- 价差(立即成交所需支付的额外成本)
- 深度/价格影响(当你的订单规模过大时,会推动价格向不利方向移动)
- 费用(如果启用)(非线性曲线,在概率接近 50% 时最高)
- 机会成本(等待限价单成交所损失的潜在收益)
本文提供了一种可重复的方法,从订单簿快照中量化这些成本,然后展示如何将其转化为实际决策:做市商 vs 吃单者。
内部链接:
- Smart Money 概述:/smart-money
- 回测工具与方法:/backtesting
- 升级获取实时提醒:/subscribe
1)"中间价陷阱"
大多数用户界面显示:
- 最后成交价
- 最优买价 / 最优卖价
- 中间价(通常是最优买价和卖价的平均值)
中间价对图表分析有用,但它隐藏了决定你实际成交价格的两个因素:
- 顶部价位实际挂单量有多大
- 在你吃掉订单后,订单簿补充的速度有多快
在深度较深的订单簿中,中间价和成交量加权平均价(VWAP)接近。 在深度较浅的订单簿中,中间价可能是你支付价差和价格影响之前对自己的谎言。
2)定义执行成本(以可衡量的方式)
设:
p_mid= 下单时的中间价p_vwap= 你的订单规模的成交量加权平均执行价格p_ref= 你的参考价格(中间价,或“公平”模型价格)
对于买单,执行滑点的清晰定义为:
slippage_bps = 10,000 × (p_vwap - p_ref) / p_ref
对于卖单,符号取反:
slippage_bps = 10,000 × (p_ref - p_vwap) / p_ref
然后加上适用的费用:
total_cost_bps ≈ slippage_bps + fee_bps(p, market_type)
Polymarket 提供了订单簿和定价的公开 API,以及市场元数据的公开 API(包括 CLOB 代币 ID)。文档列出了 Gamma(市场元数据)和 CLOB(订单簿)API 的基础 URL。 来源:Polymarket API 端点概述(Gamma / CLOB / Data API)。https://docs.polymarket.com/quickstart/reference/endpoints
3)可重复的方法:从快照估算滑点
步骤 A — 获取市场的代币 ID(YES 或 NO)
Polymarket 的 Gamma Markets API 在启用订单簿交易时,会返回包含 clobTokenIds(YES/NO 代币 ID)的市场对象。
来源:Gamma "Get markets" 文档(包括 CLOB 代币 ID 和 enableOrderBook)。https://docs.polymarket.com/developers/gamma-markets-api/get-markets
示例(将 slug 替换为你关心的任何市场/事件 slug):
curl "https://gamma-api.polymarket.com/markets?slug=fed-decision-in-october"
从响应中:
- 确认
enableOrderBook为 true - 提取你交易的结果对应的
clobTokenIds
步骤 B — 拉取订单簿
Polymarket 的 CLOB API 提供了公开的 GET /book 端点,用于获取代币的订单簿(带价格层级的最优买卖盘)。
来源:CLOB API 端点参考(包括 /book、/midpoint、/spread)。https://docs.polymarket.com/quickstart/reference/endpoints
示例:
curl "https://clob.polymarket.com/book?token_id=YOUR_TOKEN_ID"
步骤 C — 计算你实际会支付的 VWAP
对于买单:
- 将卖单按价格从低到高排序
- 消耗数量,直到你的目标规模被成交
- 计算 VWAP
以下是一个极简的 Python 脚本(仅使用标准库),它:
- 获取
/book - 计算目标名义金额的 VWAP
- 与中间价比较
import json
import urllib.request
TOKEN_ID = "YOUR_TOKEN_ID"
NOTIONAL_USD = 5000 # 改为你的规模
def get_json(url: str):
with urllib.request.urlopen(url) as r:
return json.loads(r.read().decode())
def compute_vwap(book, side, notional):
levels = book[side] # 列表,每个元素为 [price, size]
levels.sort(key=lambda x: float(x[0]))
total_cost = 0.0
total_filled = 0.0
for price_str, size_str in levels:
price = float(price_str)
size = float(size_str)
cost = price * size
if total_cost + cost <= notional:
total_cost += cost
total_filled += size
else:
remaining = notional - total_cost
fill_size = remaining / price
total_cost += remaining
total_filled += fill_size
break
if total_filled == 0:
return 0.0
return total_cost / total_filled
book = get_json(f"https://clob.polymarket.com/book?token_id={TOKEN_ID}")
mid = (float(book['bids'][0][0]) + float(book['asks'][0][0])) / 2
vwap = compute_vwap(book, 'asks', NOTIONAL_USD)
slippage_bps = 10000 * (vwap - mid) / mid
print(f"Mid: {mid:.4f}, VWAP: {vwap:.4f}, Slippage: {slippage_bps:.2f} bps")
4)做市商 vs 吃单者:决策框架
现在你可以量化成本,做出明智的决策:
- 如果滑点 + 费用 < 预期价差缩小:立即吃单(市价单)
- 如果滑点 + 费用 > 预期价差缩小:挂限价单(做市商)
"预期价差缩小"是你认为在你等待期间价差会收窄的程度。这取决于市场波动性和你的耐心。
5)实际案例
假设你想买入 5000 美元的市场 "美联储 10 月加息" 的 YES 代币。
- 获取代币 ID:从 Gamma API 获取
clobTokenIds - 拉取订单簿:
/book?token_id=... - 运行脚本:中间价 = 0.45,VWAP = 0.4512,滑点 = 26.67 bps
- 如果费用为 10 bps,总成本约为 36.67 bps
- 如果你认为价差在几分钟内会缩小 50 bps,那么吃单是合理的。否则,挂限价单。
总结
- 中间价是谎言:它不代表你的实际成交价格。
- 使用订单簿快照计算你的 VWAP。
- 将滑点 + 费用与预期价差缩小进行比较,以决定做市商还是吃单者。
通过遵循这种方法,你可以将执行成本转化为可量化的 Alpha。
发布于: 2026年6月23日 · 8 分钟 · SightWhale