从灵感到证伪——Polymarket一个想法的研究始末
预测市场是个很有意思的地方,人们用真金白银为自己的看法定价——没有什么能够比金钱的流向更能体现信息、反映人们真实的想法。
这个市场还很新,既然是蓝海,便有套利者、投机客的生存空间。高中的时候老师讲过一个案例,有人用天气、新闻、温度等等因子建了一个模型去预测赛马结果,准确率极高。Polymarket本质上就是同一件事——只不过赌的不是马,而是BTC的涨跌、选举的结果、政策的走向。在这里跟形形色色的人博弈特别有意思。
我把研究方向聚焦在细分 5min 和 15min BTC 涨跌预测领域。
灵感最开始来自期中周的一个晚上,我想,能不能用随机过程建模这个BTC涨跌二元期权的fair price,和市场价格做对比来找mispricing的部分。一开始,我用最简单的几何布朗运动(GBM)来建模,用BTC年波动率来推算固定的σ。但回测后发现p值并不显著,数据量翻倍后收益率也收缩近0,edge无法覆盖交易成本。
实际上做建模找mispricing是做市商最擅长的事情,这个市场的定价已经做的足够好了。这里的对手是有着低费率、高基建的做市商,他们把这方向的edge早吃得差不多了。所以,再在这里优化建模模型并没有意义,多几分毛利并不会改变我在这里的结构性劣势,于是我想着能不能找另一波更加幼稚的对手。丛林里,最显著的猎物便是散户赌客。在网上找了一些被其他市场验证过的理论,我便开始了下一个研究方向——散户系统性高估小概率事件 (Favorite-Longshot Bias)。
找成熟市场被研究透、验证过的理论套到新兴市场上,是很不错的产生灵感的方法。
0/ 数据起点
Polymarket没有开放历史ticks数据的接口,只能连websocket自己爬取收集,所以一开始,我的数据量极少,只有几天。这也直接导致后来我在统计检验犯了很多错误。
1/ 假说与初步验证
起点假说: 散户系统性高估小概率事件 → YES token 在低价位被高估 → SELL YES 有正期望。
验证方法: Calibration table,按 mid 价格分10档,比较实际 UP 率 vs 市场定价。
初步结果(3.21-3.23共424窗口)看似支持假说:
- mid 0.20-0.30: 实际 12.9% vs 定价 25.6%,偏差 -12.7%
- mid 0.60-0.70: 实际 81.8% vs 定价 64.9%,偏差 +16.9%
此时我以为发现了"严重高估"和"严重低估"。
核心问题在于,我这里看到的是一个点估计(point estimate),但点估计在小样本下极不稳定。 12.9% vs 25.6%的"偏差",可能是市场真的错了,也可能纯粹是这31个样本恰好运气差。没有额外工具,你无法区分这两种情况。比如你扔一枚公平硬币(真实概率50%),但只扔10次。你完全可能得到7次正面、3次反面,算出来"正面率70%"。这并不意味着硬币有偏——这只是小样本的随机波动。
教训是没有置信区间的描述性统计毫无意义。样本量小时,任何百分比看起来都可以很"显著"。所以,我们需要区间推断 (interval inference)来回答到底"真实概率的合理范围是什么"。
2/ 置信区间
对于小样本或极端比例,我们用Wilson score interval而不是普通的CI。
对于mid 0.20-0.30,这里只有31个样本,Wilson 95% CI = [3.5%, 25.6%]。市场定价25.6%在CI边缘——无法区分市场错误和随机波动。也就是说,这里的偏差完全有可能只是随机噪声。
逐档位检验后:10个档位中只有1个(0.60-0.70)的市场定价落在CI外。 其他9个"偏差"全是噪声。
3/ 多重比较问题
感谢川总的DDA3600,在这里我学到了辨别伪alpha的方法。
(同样的思路也可以用来处理参数优化过拟合问题。)
每一次检验,我用的标准是 p < 0.05,即:
"如果市场定价其实是完美准确的(零偏差),我观察到这么大或更大偏差的概率小于5%。"
单独看一个档位没问题,但这里我做了十次。
对于p < 0.05 的检验,做1次的假阳性概率是5%;做10次,至少一个假阳性的概率是40.1%!
所以,这里需要对p值做修正。方法有很多,这里我们以控制整体假阳性率为思路,用Bonferroni校正。
Bonferroni的想法极其简单:想让整体假阳性率(family-wise error rate, FWER)控制在 α = 0.05。对于做了 k 次检验。那就把每次检验的门槛收紧到 α/k。
在这个case里,k等于10,即单个档位的p值要小于0.005,才能算"发现"。
对于那个落在CI外的 0.60-0.70 区间,其原始p值≈0.008(z=2.40),Bonferroni校正后 p=0.008×10=0.08,未通过0.05门槛。这个调查最终否定了FLB假说,严格的Bonferroni否定了我们在这个区间推进原先"系统性高估小概率事件假说"策略的想法,但即使0.60-0.70这个区间的统计特征不够显著,我们仍然能够继续进行研究。
原因有三:
- 效应量足够大: +17%偏差是全表最大的。即使统计上边际(有一点信号但不够显著),经济意义上值得继续研究——如果它是真的,这是一个可交易的信号。+17% 的偏差即使统计上只是边际的,一旦是真的就是巨大的 edge——值得继续花时间去搞清楚它到底是噪声还是真信号,而不是直接扔掉。
- 时间分割提供了独立证据: 3天都有正偏差(+18%, +21%, +9%),这不是同一个统计检验的重复,而是额外的稳健性证据。
- 统计不显著不代表不值得继续探索: Bonferroni校正回答的是"要不要拿真金白银下注",不是"要不要继续调查机制"。在探索阶段,一个边际显著+大效应量的发现值得追问"为什么"——即使最终答案是"这是假的",理解它为什么看起来像真的也有价值(事实证明确实如此:我们的深入调查揭示了动量机制)。
4/ 现象归因
经过置信区间和Bonferroni校正,我手里剩下一个事实:
"0.60-0.70 这个档位,市场定价约65%,实际UP率约82%,偏差+17%。效应量大,时间分割3天一致,值得继续调查。"
从这里,是否能够证明我们一开始的散户系统性高估小概率事件假说 (Favorite-Longshot Bias)是正确的,从而得出结论"市场在mid=0.65时系统性低估了UP概率,应该在这个价位买YES token"呢?
并不行。我们手中事实背后的机制尚不清晰,同一个现象可以有完全不同的原因。
这里,我们面对的是两个互相竞争的假说,它们都能解释"0.60-0.70档位实际UP率高于市场定价"这个现象:
假说A:定价偏差(Pricing Bias)
市场在 mid = 0.65 时,系统性低估了UP的概率。
不管mid是怎么到0.65的,只要它在0.65,市场就定低了。
如果A是真的:
- 这是一个静态的市场缺陷
- 策略很简单:只要看到 mid 在 0.60-0.70,就买 YES
- mid 是怎么到这个价位的无所谓
假说B:动量持续(Momentum Continuation)
mid 到达 0.65 的路径才是关键。
如果 mid 是从 0.50 涨上来到 0.65 的,那BTC正在涨,涨势可能继续,所以UP率高。
不是"0.65这个价位被低估",而是"涨到0.65这个过程预测了继续涨"。
如果B是真的:
- 偏差不是市场定价的错误,而是动量信号的投影
- 0.60-0.70只是恰好捕获了"正在上涨"的窗口
- 真正的信号不是价位,而是价格变化的方向
这两个假说导向完全不同的策略。 如果不区分它们就直接交易,可能会基于错误的因果关系做决策。
所以我们要做一个关键检验,对0.60-0.70档位的52个窗口,看mid是怎么到达这个价位的。
(这一步本质上是在做混淆变量控制(confounding variable control)。)
结果是,48/52个窗口是"从低处涨上来",0个窗口是"从高处跌下来"。这个数据能够让我们归因到"假说B 动量驱动"吗?
并不能。48/52从低处涨上来,只能说明数据构成,不能证明因果。"从低处涨上来"和"mid处于0.65"完全纠缠在一起(混淆confounding),无法分离。
那要怎么对这两个因子做分离归因呢?我尝试用Logistic regression做回归来分离。
Logistic regression 的核心能力是:当你把两个变量同时放进模型,它会尝试分离各自的独立贡献。
目前我们有两个候选解释变量:
- mid_level:当前mid的绝对价位(比如0.65)
- delta_mid:mid从开盘到现在的变化量(比如+0.15)
想知道:UP率高,到底是因为价位高(假说A),还是因为涨了很多(假说B)?
建模:
P(UP) = σ(β₀ + β₁·mid_level + β₂·delta_mid)
这个模型问的是:
在delta_mid相同的情况下,mid_level每高1个单位,UP概率变化多少?
在mid_level相同的情况下,delta_mid每大1个单位,UP概率变化多少?
如果回归能正常工作,就能直接读结果:
- β₁显著、β₂不显著 → A赢,价位本身有独立效应
- β₁不显著、β₂显著 → B赢,动量才是驱动力
- 两个都显著 → A和B都有贡献
结果出来了:
mid_level: β₁=+5.622, p=0.0004
delta_mid: β₂=+0.271, p=0.863
初看似乎"价位赢了动量输了"——但这个结果不可信。
还有一个很重要的待检验因素——多重共线性检验。
我们测出Correlation(mid_level, delta_mid) = 0.972,亦即知道了其中一个,你就几乎完美地知道了另一个。Correlation=0.972意味着logistic regression无法可靠地分离这两个变量。效应被"随机"归给了mid_level,delta_mid的p值被人为拉高。这是经典的共线性伪影,不是真实的因果分离。
一个教训是,高共线性(r>0.9)下回归系数的归因毫无意义。应该先检查相关性再解读系数。
并且,80%的窗口 mid_start 在0.45-0.55,因此 mid_level ≈ 0.50 + delta_mid——两个变量在数学上近乎等价。
因而,这个问题在当前数据下无解,我们无法真正拒绝假说A或者假说B。在当下的数据集,mid_start没有足够的变异。
5/ 信号分析
对交易来说,归因问题不重要。归因不改变交易结果。重要的是,这个信号已经在这里,它究竟有多强,能不能用来赚钱?不管这个信号的原因是"动量"还是"价位",我们看重的是它能否被用来交易。
归因重要的唯一场景是:你想把信号泛化到其他市场。如果是动量驱动,可能在DEX和CEX上也有效;如果是价位特性,就是Polymarket BTC涨跌预测特有的。
因而在这里,我们要做最重要的一步,验证这个信号(不管叫什么名字)是否已经被市场定价。
我们想知道,这个信号(delta_mid代理)越大,UP的概率是否越高?
用Spearman做排序检验,得出r = 0.575,p < 0.000001。看起来delta_mid几乎可以直接告诉你结算方向。
但这个r=0.575是在什么时刻测的?delta_mid的值取决于你在窗口内的哪个时间点观测。把每个时间点的r都算出来时,出现了一个意想不到的规律:
| 观测时刻 | Spearman r | 涨→UP | 跌→DOWN |
|---|---|---|---|
| t=10s | +0.072 | 57% | 52% |
| t=30s | +0.200 | 62% | 58% |
| t=60s | +0.306 | 67% | 62% |
| t=120s | +0.498 | 75% | 71% |
| t=150s | +0.558 | 75% | 75% |
| t=240s | +0.687 | 84% | 80% |
r单调递增——从t=10s的0.072一路涨到t=240s的0.687。之前报的r=0.575是在t≈150s(窗口中点)计算的。
这不是"动量信号越来越强",而是一个更简单的事实:越接近结算,mid越接近最终结果。5分钟窗口一共300秒,t=240s时离结算只剩60秒——mid几乎就是结算价本身,r当然高。这在很大程度上是同义反复(tautology),而非真正的预测力。
6/ 关键问题:能赚钱吗?
到这里,我们已经知道这个信号在统计上是"真的"——delta_mid确实和结算方向高度相关。但量化研究里最重要的一课是:信号的强度不等于盈利能力。
一个类比:股票的年度盈利增长和股价涨跌高度相关(r可能接近1)。但你不能靠"买盈利增长的股票"赚钱——因为股价已经反映了盈利预期。你买入时的价格已经"price in"了这个信息。
同样的问题适用于这里:当delta_mid很大(mid在涨)时,YES token的ask价格也在涨。如果ask价格涨得和UP率一样快,那信号再强也赚不到钱。
所以真正决定胜负的不是"信号有多强",而是:
edge = UP率 - ask价格 - 交易成本
按每个时间点算这个edge:
| 观测时刻 | r | BUY净edge | SELL净edge |
|---|---|---|---|
| t=10s | +0.072 | -0.059 | -0.119 |
| t=30s | +0.200 | -0.020 | -0.049 |
| t=60s | +0.306 | +0.014 | -0.036 |
| t=120s | +0.498 | +0.017 | -0.033 |
| t=150s | +0.558 | +0.018 | -0.024 |
| t=240s | +0.687 | -0.027 | -0.029 |
净edge在所有时刻都接近零或为负。 市场在每个时间点的定价都足够准确——做市商的ask价格忠实地跟踪着UP率的变化,留给方向性交易者的空间几乎为零。
这张表还揭示了一个根本性的trade-off:
- 观测越早(t=10s),ask价格低(便宜),但信号弱(r=0.072),UP率和50%差不多——你不知道该买还是该卖
- 观测越晚(t=240s),信号强(r=0.687),但ask价格已经追上了UP率——你知道该买什么,但价格不再便宜
最佳r(t=240s)和最佳edge(t=40s)出现在完全不同的时刻。 信号最清晰的时候恰恰是最赚不到钱的时候——因为做市商和你看到的是同一个信息。
SELL方向在所有时刻都为负,说明市场对下跌的定价更加准确。
7/ 结论:证伪
研究到这里,结论已经很清楚了:
- Favorite-Longshot Bias假说被否定——calibration table上的"偏差"经过CI和Bonferroni校正后,绝大部分是噪声
- 存在一个统计上极强的信号(delta_mid vs 结算方向,r最高达0.687)——但它很大程度上是"mid接近结算时≈结算结果"的同义反复
- 信号无法转化为利润——市场ask价格在每个时间点都忠实追踪了这个信号,扣除3%交易成本后净edge为负
- 信号的因果归因("动量"还是"价位")无法区分——但对交易决策而言,这个问题不重要
整个研究的终点是一个被正确reject的策略。没有找到能赚钱的因子,但学到了几条重要的教训:
信号 ≠ 利润。 一个被充分定价的信号可以有完美的预测力和零盈利能力。
没有置信区间的数字就是噪声。 小样本下任何百分比都可以看起来很"显著"。
统计量的大小 ≠ 可交易性。 r=0.575看起来是极强信号,但逐时刻分解后发现它主要反映的是mid在收敛到结算结果——这是市场运行的自然规律,不是可利用的inefficiency。
你赚的每一分钱,都是某个对手方亏的。如果你说不清对手方是谁,大概率你就是森林的猎物。 在这个市场里,做市商把方向性的edge吃得干干净净。散户确实在亏钱——但亏给了做市商,而我目前很难去分一杯羹。