量化回测如何避免过拟合?Purged K-Fold 与组合交叉验证的工业级实战
核心摘要速览:
金融时间序列与普通机器学习数据最大的不同在于自相关性。如果不做 Purged 消除重叠期样本、不做 Embargo 阻断跨期泄漏,你的回测夏普比率就会被严重虚抬。
金融时间序列与普通机器学习数据最大的不同在于自相关性。如果不做 Purged 消除重叠期样本、不做 Embargo 阻断跨期泄漏,你的回测夏普比率就会被严重虚抬。
一、经典 K-Fold 交叉验证在金融时序上的致命缺陷
在传统机器学习中,样本之间默认满足独立同分布(IID)假设。然而在金融市场,今天的持仓收益往往包含了未来数日的持股期表现。如果直接使用标准的 K-Fold 随机打乱切片,训练集与测试集在时间维度上将产生严重的重叠,造成极端严重的‘穿越信息泄漏’。
二、Purged 与 Embargo 技术的核心数学与工程原理
Marcos Lopez de Prado 在《Advances in Financial Machine Learning》中提出了 Purging(样本清洗)与 Embargoing(隔离带)机制:在每个训练折与测试折之间,强制剔除所有标签时间重叠的样本,并在测试集后增加数天的隔离期,彻底阻断自相关性残余。
三、工业级 Purged K-Fold 验证函数 Python 实现
import numpy as np
import pandas as pd
def get_train_times(events, test_times):
"""
events: DataFrame 包含 index(采样时间) 与 end_date(事件标签结束时间)
test_times: 测试集时间区间 (start_time, end_time)
"""
train_idx = events.copy()
t_start, t_end = test_times
# 1. Purge: 剔除任何与测试集区间有交集的训练样本
overlap = (train_idx.index <= t_end) & (train_idx['end_date'] >= t_start)
train_idx = train_idx[~overlap]
# 2. Embargo: 在测试集结束之后增加安全隔离带 (例如 5个交易日)
embargo_limit = t_end + pd.Timedelta(days=5)
embargo_mask = (train_idx.index >= t_end) & (train_idx.index <= embargo_limit)
train_idx = train_idx[~embargo_mask]
return train_idx.index
四、速铺宝策略诊断体系中的防过拟合检验标准
速铺宝在为私募及个人量化开发者提供策略审计时,第一步便是采用全市场 Purged 框架复现历史信号。只有在剔除重叠期、扣减冲击成本后依然能跑出正期望(EV > 1.10)的策略,才具备投入真金白银实盘验证的价值。