← 返回模块
Q2.6.5.1beta 可读 · 未来免费内容校验中内容版本 2026-05-26

金融机器学习的陷阱与验证:净化交叉验证与多重检验

2.6.5 · 金融量化中的机器学习 · 数学与统计能力

金融机器学习的陷阱与验证:净化交叉验证与多重检验

钩子:在 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(x_i, y_i) \sim P 独立同分布(IID),分布 PP 平稳,标签充足、信噪比高,部署环境与训练环境一致。金融数据违反上面每一条。六个结构性违反:

  1. ​特征与标签序列相关​​:hh 天前瞻收益作标签,yt,yt+1,,yt+h1y_t, y_{t+1}, \ldots, y_{t+h-1} 全部依赖同一段价格路径;滚动特征 XtX_t 自相关。普通 k 折 CV 把它们当独立样本,独立性假设直接破坏。
  2. ​重叠的前瞻窗口​​:训练 (Xt,yt)(X_t, y_t)、测试 (Xt+1,yt+1)(X_{t+1}, y_{t+1}),二者共享 h1h-1 天的价格信息;表观样本外 R2R^2 被污染。
  3. ​联合分布 PP 不平稳​​:微观结构断裂(2007 年 Reg NMS、2024 年 5 月切换至 T+1 结算、CN 2015 年股票停牌潮、印花税从 0.1% 降至 0.05%)、宏观断裂(QE/QT、2020 COVID、2022 加息)。IID-from-stationary-P 假设在多月以上水平就错。
  4. ​极低信噪比​​:好的 alpha 年化夏普约 1,对应日频 R2103R^2 \approx 10^{-3},比视觉/NLP 基准低三个数量级。ROC 曲线、混淆矩阵在这种尺度下噪声大于信号。
  5. ​对抗性部署​​:模型一旦下单,自己的成交改变价格过程,部署 PtP_t \neq 训练 Pt1P_{t-1}。这是金融版分布漂移。
  6. ​多重检验与回测过拟合​​:同一份数据上试上千个候选;选出来的最大夏普几乎一定包含选择偏差(selection bias)。

净化 k 折交叉验证

López de Prado(2018, Ch. 7)的修正:净化加隔离。时间轴等分 k 个连续区块 F1,,FkF_1, \ldots, F_k。对每折 FtestF_{\text{test}}:

  1. FtestF_{\text{test}} 之外的样本作为候选训练集。
  2. ​净化​​:删除任何标签窗口 [ti,ti+h][t_i, t_i + h]FtestF_{\text{test}} 时间跨度 TtestT_{\text{test}} 有交集的训练样本。
  3. ​隔离​​:再删除距离 FtestF_{\text{test}} 边界 hh' 时间步内的训练样本,h=hh' = h 为标准选,事件驱动标签取 2h2h

形式化训练集:

Dtrain={(Xi,yi):iFtest 且 [ti,ti+h]Ttest= 且 d(i,Ftest)>h}.D_{\text{train}} = \{ (X_i, y_i) : i \notin F_{\text{test}} \text{ 且 } [t_i, t_i + h] \cap T_{\text{test}} = \emptyset \text{ 且 } d(i, F_{\text{test}}) > h' \}.

净化打断重叠标签的信息泄漏(information leakage);隔离打断长记忆特征和事件驱动自相关的残余泄漏。

Formula Explorer

1 - exp(-x/tau)

(把 xx 设为隔离宽度 hh'τ\tau 设为标签水平 hh,曲线给隔离对残余相关性的衰减,是隔离宽度选择的直觉刻度。)

组合净化交叉验证(CPCV)

更进一步:不只切一次,把时间轴分 NN 个区块(N[6,12]N \in [6, 12]),枚举所有 (Nk)\binom{N}{k} 种组合作测试集,每个组合上跑净化-隔离 CV。结果是回测路径(backtest path)分布,不是单一样本外夏普。CPCV 是滚动窗口分析(walk-forward analysis)的蒙特卡罗推广:walk-forward 给一条路径(上线决策真正会走的那条),CPCV 给这条路径所属的分布。

CPCV 也支持回测过拟合概率(probability of backtest overfitting, PBO, Bailey et al. 2014):在 (N2)\binom{N}{2} 种二分下,样本内最优策略在样本外排名落入下半区的频率。PBO 接近 50% 意味着研究流程产出的「最佳」与噪声不可区分。

多重检验与修正夏普比率

筛选 MM 个候选策略,挑样本内夏普最高的那个。零假设下选择性最大夏普:E[maxSRH0]2logME[\max \mathrm{SR} \mid H_0] \sim \sqrt{2 \log M}。两种修正:

αcorrected=α/M(Bonferroni, FWER),p(i)iα/M(Benjamini-Hochberg, FDR).\alpha_{\text{corrected}} = \alpha / M \quad \text{(Bonferroni, FWER)}, \qquad p_{(i)} \le i \alpha / M \quad \text{(Benjamini-Hochberg, FDR)}.

Bailey & López de Prado(2014)的​​修正夏普比率(deflated Sharpe ratio, DSR)​​直接针对策略选择:

DSR=Z((SR^SR0)(T1)/(1γ^3SR^+((γ^41)/4)SR^2)),\mathrm{DSR} = Z\Bigl( (\widehat{\mathrm{SR}} - \mathrm{SR}_0) \sqrt{(T - 1) / (1 - \hat{\gamma}_3 \widehat{\mathrm{SR}} + ((\hat{\gamma}_4 - 1) / 4) \widehat{\mathrm{SR}}^2)} \Bigr),

Z()Z(\cdot) 是标准正态 CDF,γ^3,γ^4\hat{\gamma}_3, \hat{\gamma}_4 是样本偏度与超额峰度,TT 是观测期。截止 SR0\mathrm{SR}_0NN 个独立零夏普试验的最大期望:

SR0Var(SR)[(1γ)Φ1(11/N)+γΦ1(11/(Ne))],\mathrm{SR}_0 \approx \sqrt{\mathrm{Var}(\mathrm{SR})} \bigl[ (1 - \gamma) \Phi^{-1}(1 - 1/N) + \gamma \Phi^{-1}(1 - 1/(N e)) \bigr],

γ0.5772\gamma \approx 0.5772 是 Euler-Mascheroni 常数。DSR 同时惩罚三件事:试验次数 NN、收益非正态(负偏 + 厚尾会虚高夏普)、有限样本。

​示意图(净化 k 折)​​:横轴时间分 k 块,一块为测试,邻近样本因标签重叠被标 purged,边界 hh' 内被标 embargoed。

​示意图(CPCV 蒙特卡罗)​​:(Nk)\binom{N}{k} 路径夏普直方图;竖线 1 标在朴素 5 折(右尾,虚高);竖线 2 标在 walk-forward(分布中段)。

A 股的特殊数据峭壁

CN A 股的额外复杂度。​​涨跌停​​(主板 ±10%、创业板/科创板 ±20%)在每次重大事件后产生整段标签缺失,是结构性断裂;​​涨停​​和跌停后的「开板」会让标签 yiy_i 失去经济含义。​​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\widehat{\mathrm{SR}} = 2.0,样本 T=1000T = 1000,试验 N=100N = 100,偏度 γ^3=0.5\hat{\gamma}_3 = -0.5,超额峰度 γ^4=5\hat{\gamma}_4 = 5

  1. ​算 SR0\mathrm{SR}_0​​​:Φ1(11/100)2.326\Phi^{-1}(1 - 1/100) \approx 2.326,Φ1(11/(100e))2.520\Phi^{-1}(1 - 1/(100 e)) \approx 2.520,(10.5772)2.326+0.57722.5202.438(1 - 0.5772) \cdot 2.326 + 0.5772 \cdot 2.520 \approx 2.438。假设 Var(SR)1\sqrt{\mathrm{Var}(\mathrm{SR})} \approx 1,SR02.44\mathrm{SR}_0 \approx 2.44
  2. ​算分母​​:1(0.5)(2.0)+((51)/4)(2.0)2=6.01 - (-0.5)(2.0) + ((5-1)/4)(2.0)^2 = 6.0;(10001)/6.012.9\sqrt{(1000-1)/6.0} \approx 12.9
  3. ​算 zz​​​:(2.02.44)12.95.7(2.0 - 2.44) \cdot 12.9 \approx -5.7
  4. ​取 CDF​​:DSR=Z(5.7)6×109\mathrm{DSR} = Z(-5.7) \approx 6 \times 10^{-9}

结论:看上去亮眼的夏普 2.0,在试验数 100、非正态收益、T=1000T=1000 的约束下,与「100 次零夏普试验里挑最大」几乎不可区分。

Exercise

你筛选 N=200N = 200 个候选策略,样本期 T=500T = 500,最佳观测夏普 SR^=1.8\widehat{\mathrm{SR}} = 1.8,偏度 γ^3=0.3\hat{\gamma}_3 = -0.3,超额峰度 γ^4=3\hat{\gamma}_4 = 3

(i) 估算 SR0\mathrm{SR}_0

(ii) 估算 DSR,判断是否显著高于零假设最大。

(iii) 试验数 NN 从 200 降到 20,DSR 的方向?给一句直觉。

提示
Φ1(11/200)2.576\Phi^{-1}(1 - 1/200) \approx 2.576,Φ1(11/(200e))2.748\Phi^{-1}(1 - 1/(200 e)) \approx 2.748。加权后约 2.65,即 SR0\mathrm{SR}_0 尺度。
提示
分母约 1+0.54+1.62=3.161 + 0.54 + 1.62 = 3.16;(SR^SR0)(T1)/3.16(\widehat{\mathrm{SR}} - \mathrm{SR}_0)\sqrt{(T-1)/3.16} 喂入 Z()Z(\cdot)NN 降低 ⇒ SR0\mathrm{SR}_0 降 ⇒ DSR 升。

推荐工作流

研究阶段:CPCV + DSR + PBO,把 alpha 样本外性能当分布而非点。上线决策:walk-forward analysis(滚动窗口分析),一次一条最接近真实部署的路径。再前一步:把策略规格在最终样本外评估前​​预登记​​(pre-registration)——超参数、特征、回测期一并冻结,然后只跑一次。蔡立耑/史可 CN 译本之后,九坤、鸣石、幻方、明汯、衍复、上海宽德的方法学披露里 净化 CV、CPCV、DSR 已是默认词汇。

下一课接什么

本课构造​​验证层​​:给一个 alpha 如何诚实报告样本外性能。下一课换角度:给一份原始数据,如何​​构造​​一个 alpha——从四个特征层级(因子模型、技术、订单流、另类数据)、三重栅栏标注(triple-barrier labeling)、元标注(meta-labeling),到 Alpha 衰减与多 alpha 聚合。验证工具不变,被验证的对象变具体。