金融机器学习的陷阱与验证:净化交叉验证与多重检验
钩子:在 Sharpe 2.5 面前下班的那位实习生
周三下午,某沪深300 多因子私募基金(private fund)的研究室。一位刚从海外回来的实习生把笔记本电脑转过来给你看:XGBoost、5 折交叉验证、特征包括过去 5 日收益、20 日 RSI、北向资金净流入、卖方分析师评级修订,因子模型层面用 Fama-French + 动量 + 质量做对照。sklearn.model_selection.cross_val_score 跑完,样本内年化夏普比率(Sharpe ratio)2.5。她想把结果汇报给基金经理。你拦住她。下班之前,你陪她重跑:净化(purge)加隔离(embargo)的 5 折交叉验证,夏普掉到 0.8;CPCV(组合净化交叉验证)across N=8 个区块,夏普分布中位数 0.5,5% 分位数 −0.1。同一份数据、同一个模型,从「即将上线」变成「需要回画板」。1.7 个夏普单位的跳水从何而来,以及为什么必然发生。
为什么标准 ML 框架系统性失败
2.6.1 监督学习框架假设训练样本 (xi,yi)∼P 独立同分布(IID),分布 P 平稳,标签充足、信噪比高,部署环境与训练环境一致。金融数据违反上面每一条。六个结构性违反:
- 特征与标签序列相关:h 天前瞻收益作标签,yt,yt+1,…,yt+h−1 全部依赖同一段价格路径;滚动特征 Xt 自相关。普通 k 折 CV 把它们当独立样本,独立性假设直接破坏。
- 重叠的前瞻窗口:训练 (Xt,yt)、测试 (Xt+1,yt+1),二者共享 h−1 天的价格信息;表观样本外 R2 被污染。
- 联合分布 P 不平稳:微观结构断裂(2007 年 Reg NMS、2024 年 5 月切换至 T+1 结算、CN 2015 年股票停牌潮、印花税从 0.1% 降至 0.05%)、宏观断裂(QE/QT、2020 COVID、2022 加息)。IID-from-stationary-P 假设在多月以上水平就错。
- 极低信噪比:好的 alpha 年化夏普约 1,对应日频 R2≈10−3,比视觉/NLP 基准低三个数量级。ROC 曲线、混淆矩阵在这种尺度下噪声大于信号。
- 对抗性部署:模型一旦下单,自己的成交改变价格过程,部署 Pt= 训练 Pt−1。这是金融版分布漂移。
- 多重检验与回测过拟合:同一份数据上试上千个候选;选出来的最大夏普几乎一定包含选择偏差(selection bias)。
净化 k 折交叉验证
López de Prado(2018, Ch. 7)的修正:净化加隔离。时间轴等分 k 个连续区块 F1,…,Fk。对每折 Ftest:
- Ftest 之外的样本作为候选训练集。
- 净化:删除任何标签窗口 [ti,ti+h] 与 Ftest 时间跨度 Ttest 有交集的训练样本。
- 隔离:再删除距离 Ftest 边界 h′ 时间步内的训练样本,h′=h 为标准选,事件驱动标签取 2h。
形式化训练集:
Dtrain={(Xi,yi):i∈/Ftest 且 [ti,ti+h]∩Ttest=∅ 且 d(i,Ftest)>h′}.
净化打断重叠标签的信息泄漏(information leakage);隔离打断长记忆特征和事件驱动自相关的残余泄漏。
Formula Explorer
1 - exp(-x/tau)
(把 x 设为隔离宽度 h′、τ 设为标签水平 h,曲线给隔离对残余相关性的衰减,是隔离宽度选择的直觉刻度。)
组合净化交叉验证(CPCV)
更进一步:不只切一次,把时间轴分 N 个区块(N∈[6,12]),枚举所有 (kN) 种组合作测试集,每个组合上跑净化-隔离 CV。结果是回测路径(backtest path)分布,不是单一样本外夏普。CPCV 是滚动窗口分析(walk-forward analysis)的蒙特卡罗推广:walk-forward 给一条路径(上线决策真正会走的那条),CPCV 给这条路径所属的分布。
CPCV 也支持回测过拟合概率(probability of backtest overfitting, PBO, Bailey et al. 2014):在 (2N) 种二分下,样本内最优策略在样本外排名落入下半区的频率。PBO 接近 50% 意味着研究流程产出的「最佳」与噪声不可区分。
多重检验与修正夏普比率
筛选 M 个候选策略,挑样本内夏普最高的那个。零假设下选择性最大夏普:E[maxSR∣H0]∼2logM。两种修正:
αcorrected=α/M(Bonferroni, FWER),p(i)≤iα/M(Benjamini-Hochberg, FDR).
Bailey & López de Prado(2014)的修正夏普比率(deflated Sharpe ratio, DSR)直接针对策略选择:
DSR=Z((SR−SR0)(T−1)/(1−γ^3SR+((γ^4−1)/4)SR2)),
Z(⋅) 是标准正态 CDF,γ^3,γ^4 是样本偏度与超额峰度,T 是观测期。截止 SR0 是 N 个独立零夏普试验的最大期望:
SR0≈Var(SR)[(1−γ)Φ−1(1−1/N)+γΦ−1(1−1/(Ne))],
γ≈0.5772 是 Euler-Mascheroni 常数。DSR 同时惩罚三件事:试验次数 N、收益非正态(负偏 + 厚尾会虚高夏普)、有限样本。
示意图(净化 k 折):横轴时间分 k 块,一块为测试,邻近样本因标签重叠被标 purged,边界 h′ 内被标 embargoed。
示意图(CPCV 蒙特卡罗):(kN) 路径夏普直方图;竖线 1 标在朴素 5 折(右尾,虚高);竖线 2 标在 walk-forward(分布中段)。
A 股的特殊数据峭壁
CN A 股的额外复杂度。涨跌停(主板 ±10%、创业板/科创板 ±20%)在每次重大事件后产生整段标签缺失,是结构性断裂;涨停和跌停后的「开板」会让标签 yi 失去经济含义。Alpha 衰减(alpha decay)在 A 股因新法规、印花税切换、北向通额度变动而格外明显。印花税从 0.3% → 0.1%(2008) → 0.05%(2023)三次切割,任何长样本的成本期望都不平稳;融资融券中两融的融券侧极稀薄,带短头寸的回测如果假设对称可借,样本外会暴跌。A 股(A-shares)的私募基金登记于中基协(Asset Management Association of China, AMAC),T+1 结算让次日卖出的标签必须按 T+1 可执行性裁剪。最大回撤在区制断点附近会突跳,任何稳态最大回撤估计都要按区制条件化。
工作示例:DSR 计算
观测年化夏普 SR=2.0,样本 T=1000,试验 N=100,偏度 γ^3=−0.5,超额峰度 γ^4=5。
- 算 SR0:Φ−1(1−1/100)≈2.326,Φ−1(1−1/(100e))≈2.520,(1−0.5772)⋅2.326+0.5772⋅2.520≈2.438。假设 Var(SR)≈1,SR0≈2.44。
- 算分母:1−(−0.5)(2.0)+((5−1)/4)(2.0)2=6.0;(1000−1)/6.0≈12.9。
- 算 z:(2.0−2.44)⋅12.9≈−5.7。
- 取 CDF:DSR=Z(−5.7)≈6×10−9。
结论:看上去亮眼的夏普 2.0,在试验数 100、非正态收益、T=1000 的约束下,与「100 次零夏普试验里挑最大」几乎不可区分。
Exercise
你筛选 N=200 个候选策略,样本期 T=500,最佳观测夏普 SR=1.8,偏度 γ^3=−0.3,超额峰度 γ^4=3。
(i) 估算 SR0。
(ii) 估算 DSR,判断是否显著高于零假设最大。
(iii) 试验数 N 从 200 降到 20,DSR 的方向?给一句直觉。
提示
Φ−1(1−1/200)≈2.576,
Φ−1(1−1/(200e))≈2.748。加权后约 2.65,即
SR0 尺度。
提示
分母约
1+0.54+1.62=3.16;
(SR−SR0)(T−1)/3.16 喂入
Z(⋅)。
N 降低 ⇒
SR0 降 ⇒ DSR 升。
推荐工作流
研究阶段:CPCV + DSR + PBO,把 alpha 样本外性能当分布而非点。上线决策:walk-forward analysis(滚动窗口分析),一次一条最接近真实部署的路径。再前一步:把策略规格在最终样本外评估前预登记(pre-registration)——超参数、特征、回测期一并冻结,然后只跑一次。蔡立耑/史可 CN 译本之后,九坤、鸣石、幻方、明汯、衍复、上海宽德的方法学披露里 净化 CV、CPCV、DSR 已是默认词汇。
下一课接什么
本课构造验证层:给一个 alpha 如何诚实报告样本外性能。下一课换角度:给一份原始数据,如何构造一个 alpha——从四个特征层级(因子模型、技术、订单流、另类数据)、三重栅栏标注(triple-barrier labeling)、元标注(meta-labeling),到 Alpha 衰减与多 alpha 聚合。验证工具不变,被验证的对象变具体。