跳转到内容

高级假设检验与无偏验证

第 2 章给了你 t 检验,第 6 章给了你样本外封条。这一章把两件事都推到极限:当正态假设靠不住、样本外只有一个、而你又忍不住试了很多次的时候,检验还能怎么救你。

四个工具按火力递增:置换检验(不依赖任何分布假设)、消融实验(策略里到底谁在干活)、Walk-Forward(检验研究流程本身)、夏普折减(给「试了一百次」定价)。它们是当代实证量化研究的标配四件套。

t 检验要查正态分布表,本质是借「如果世界是正态的,随机波动长这样」来定位你的实测值。金融收益厚尾(第 2 章的 QQ 图见过),正态这座图书馆的地图是错的。置换检验的思路粗暴而彻底:不借地图,直接造世界。

零假设是「信号与收益的配对关系不存在」。若它为真,那么把配对关系打乱——每天该有的收益一天不少,只是「哪天算信号日」重新随机撒一遍——重新算出的统计量应该和实测值差不多。打乱几百次,就得到这个统计量在零假设下的完整分布(零分布),看实测值排在第几个百分点。全程没有任何分布假设。

手算一遍(完全枚举版):8 个交易日,其中 4 天有信号、4 天没有。收益如下:

信号日收益非信号日收益
+1.8, +2.2, −0.6, +1.5+0.2, −0.4, +0.3, −0.1

统计量取「信号日均值 − 非信号日均值」DD:1.225−0=+1.2251.225 - 0 = +1.225。直觉上很神——4 个信号日里 3 个大涨。

零假设下,8 天里哪 4 天被标成「信号日」是完全随机的,共 (84)=70\binom{8}{4} = 70 种等可能分法,每一种都能算一个 DD。全部数一遍(这正是「置换」的完全枚举):全体 8 天的均值是 4.9/8=0.61254.9/8 = 0.6125;若选中的 4 天收益和为 SS,则 D=(2S−4.9)/4D = (2S - 4.9)/4,要 D≥1.225D \geq 1.225 必须 S≥4.9S \geq 4.9。收益最大的三天 2.2、1.8、1.5 合计 5.5,配上其余任何一天都 ≥ 4.9(配最小的 −0.6 恰好等于 4.9)——共 5 种;不含这三天的任何组合最多 2.2+1.8+0.3+0.2=4.5<4.92.2+1.8+0.3+0.2 = 4.5 < 4.9。所以:

p=570≈0.071>0.05p = \frac{5}{70} \approx 0.071 > 0.05

3/4 的信号日大涨,p 值却连 0.05 都过不了。 这就是完全枚举的震撼教育:小样本里的「神迹」,绝大多数经不起最老实的数数。对比一下:如果 4 个信号日恰好是收益前 4 名(全胜),那样的组合只有 1 种,p=1/70≈0.014p = 1/70 \approx 0.014,才算勉强显著——差之毫厘,谬以千里。

样本一大,枚举不动(250 天选 60 天是个天文数字),就用随机抽样代替完全枚举,这就是正式的置换检验。本章演示数据:250 个交易日、随机 60 天为信号日(置换检验演示:250 个交易日(合成),随机 60 日为信号日。信号日超额收益 N(0.6%, 1.1%)、非信号日 N(0.01%, 1.1%)(rets 已含全部噪声与效应,信号日均值约 +0.6%)。统计量 D = 信号日平均超额收益 − 非信号日平均超额收益(%);nullValues 为 500 次重新随机抽 60 个信号日重算的 D(销毁信号与日期的配对关系);pValue = (零分布中 D ≥ 实测 D 的次数 + 1) / 501),统计量 DD = 信号日平均超额收益 − 非信号日平均超额收益,随机重抽信号日 500 次:

实测 D=+perm.realValue.toFixed(1)%D = +{perm.realValue.toFixed(1)}\%,远在零分布右侧,p=perm.pValue.toFixed(3)p = {perm.pValue.toFixed(3)}——60 个信号日、每天 1.1% 的噪声里藏 0.6% 的真实效应,这个样本量足以看清它。

置换检验真正的要点在「保持什么不变」:上例保持每天收益不变、只打乱信号标签,检验的是「信号与日期的配对」。第 14 章保持脉冲日个数、只打乱时间位置,检验的是记忆。还有一种更讲究的——匹配对照:给每个信号日配一个行业、市值、波动都相近的非信号日再比较,检验的是「剔除这些共同因素之后还剩什么」。平行世界必须和真实世界同样公平,只销毁你想检验的那一件事——销毁得太多,检验就失去意义。

策略上线了,回测赚钱,团队庆功。但它是靠哪个零件赚的?如果说不清,你其实不知道自己拥有什么——下次市场变了,你不知道该修哪里。

消融(ablation)的规则简单到不像一个方法:一次只关掉一个零件,其他原封不动,同屏对照。设一个三特征打分的策略,样本外年化如下:

配置样本外年化相对完整版的增量
A + B + C(完整)+8.0%—
B + C(去掉 A)+7.5%A 贡献 +0.5%
A + C(去掉 B)+2.0%B 贡献 +6.0%
A + B(去掉 C)+8.2%C 贡献 −0.2%

结论一眼可见:B 是主力(去掉它策略塌掉四分之三),A 可有可无,C 是负贡献(去掉反而更好——它不是特征,是噪声,还占着模型复杂度)。三行对照表,比任何归因玄学都可靠。

两条纪律:一次只动一样(同时去掉 A 和 C,你分不清是谁的功劳);对照组必须同时段重跑(拿今年的「去 A 版」和去年的「完整版」比,行情都不同,比了白比)。

Walk-Forward:检验流程,而不是参数

Section titled “Walk-Forward:检验流程,而不是参数”

第 6 章的样本外封条有个先天局限:只能撕一次。而研究是迭代的过程——封条用掉之后,你改进策略、再来一次,第二次的「样本外」其实已经参与过决策了。Walk-Forward(滚动前推验证)是这个死结的工程解法:

把全样本按时间切成 KK 段互不重叠的测试段。第 ii 折:用测试段之前的全部数据走完你的研究流程(选参数、选规则、犯错、返工),然后用选出的参数在测试段上跑回测——只记录,不回头改。滚动推进,最后把 KK 段测试结果按时间拼接:

折训练段测试段(OOS)
1第 1–3 年第 4 年
2第 1–4 年第 5 年
3第 1–5 年第 6 年
……(每次向前滚一年)…

关键理解:Walk-Forward 检验的不是某一组参数,而是你的研究流程。每一折的参数都可以不同(事实上应该不同——市场变了,流程选出的最优参数自然漂移);如果流程真有预测力,那么不管每折选出的参数是什么,拼接起来的 OOS 表现应该稳定为正。它回答的问题是:「把你的选参能力封装成机器,每个月重新跑一遍,能赚钱吗?」——这才是流程上线后真实的工作方式。

判读标准:拼接 OOS 的夏普、回撤与「全样本固定参数」的表现接近,且逐折方向一致 → 流程稳健;拼接 OOS 明显塌掉 → 你的「参数选择」其实是在背答案,样本内的最优参数在未来换不来钱。

夏普折减:给「试了一百次」定价

Section titled “夏普折减:给「试了一百次」定价”

第 6 章讲过 1−0.95m1 - 0.95^m:试 mm 次,总有几个「显著」是蒙的。夏普折减(Deflated Sharpe Ratio, DSR,Bailey & López de Prado)把这个直觉做成可计算的账。它依赖一个漂亮的概率事实:mm 次纯随机的尝试里,最高分的期望约为 2ln⁡m\sqrt{2\ln m} 个标准差(正态假设下最大值的经典结论)。

手算一遍:你有一个 3 年样本、夏普 1.5 的策略。单次检验下,z≈SR×T=1.5×3≈2.6z \approx \text{SR} \times \sqrt{T} = 1.5 \times \sqrt{3} \approx 2.6,p≈0.005p \approx 0.005——很硬的证据。

但如果它是你试了 100 组参数后挑出的冠军呢?纯随机试 100 次,最高分的期望:

2ln⁡100=2×4.605=9.21≈3.03\sqrt{2\ln 100} = \sqrt{2 \times 4.605} = \sqrt{9.21} \approx 3.03

也就是说,什么都不懂、纯靠抽签试 100 次,平均也能抽到一个 z ≈ 3.0 的「显著」结果(折算夏普约 1.75)。你的 z = 2.6 连抽签的平均冠军水平都不到——同样的夏普 1.5,试 1 次是证据,试 100 次后挑出来的是平凡事件。这就是折减:同一个数字,放在不同的「尝试次数」语境里,置信度完全不同。

DSR 的完整公式还计入收益的偏度与峰度(厚尾的收益序列更容易在短样本里冒出高夏普),方向一致:尝试次数越多、样本越短、分布越怪,同样的夏普越不值钱。实务上先记住结论性的纪律:报告冠军夏普时,必须同时报告「一共试了多少次」——不报尝试次数的夏普,默认按试过很多次处理。

输入:全样本历史、研究流程 F(含参数选择规则)、折数 K
输出:拼接 OOS 指标、逐折明细、尝试次数台账
第一步:切折
把全样本按时间切成 K 段互不重叠的测试段
第 i 折的训练段 = 测试段 i 之前的全部数据
第二步:逐折执行(每折独立,规则全程不变)
对每折 i:
参数_i ← 在训练段上跑流程 F
(训练段内允许自由调参、返工——这正是被检验的能力)
OOS_i ← 用参数_i 在测试段 i 上跑回测
(只记录结果,绝不回头修改任何东西)
拼接 OOS = OOS_1 ‖ OOS_2 ‖ … ‖ OOS_K
第三步:判读与记账
拼接 OOS 的夏普/回撤 vs 全样本固定参数版,同表对照
稳健:两者接近,逐折方向一致
危险:拼接 OOS 明显变差 → 流程在背答案
台账:整个研究累计试过的策略/参数组数 → 供夏普折减用
  1. 置换打错对象。打乱日期、打乱股票标签、匹配对照——三种零假设各不相同。打乱方式必须对应「你想排除的那种巧合」,否则 p 值在回答一个你没问的问题。
  2. 消融不同步。去掉特征 B 之后,仓位规则、风控参数也「顺手优化」了一下——对照组被污染,增量算出来是几个变化的总和。一次只动一样,动之前先承诺不动别的。
  3. WF 之后又调参。看了 45 折的拼接结果,回头改了门禁阈值(上一章)或特征列表,再跑一遍 WF「确认」——第二次 WF 的数据已经参与过决策,封条又撕了一次。WF 保护的是流程,改流程就要换新的、更靠后的检验数据。
  4. 拿 DSR 折减「所有」结果。折减针对的是「挑最大值」的行为:报冠军才需要扣尝试次数。如果你如实报告全部 100 组的分布,没有挑选,就不存在折减问题——诚实本身就是免折减的。

至此,回测世界内部的防线全部建完:数据、统计、假设、引擎、指标、封条,加上本章的重武器。但还有最后一类坑,它不在回测内部,而在回测与真实 A 股之间——你的钱在一个有涨跌停、有除权、有排队失败规则的市场里交易。下一章,讲三道裂缝。