量化回测如何避免过拟合?Purged K-Fold 与组合交叉验证的工业级实战

作者:速铺宝工程团队 发布时间:2026-10-09 类别:量化投研方法论 · 量化防过拟合
核心摘要速览:
金融时间序列与普通机器学习数据最大的不同在于自相关性。如果不做 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)的策略,才具备投入真金白银实盘验证的价值。

怀疑你的策略存在回测过拟合或未来函数?

速铺宝投研工程团队提供专业级量化策略诊断服务:样本内外盲测、未来函数穿透排查与冲击成本深度重算,让策略在实盘中真正盈利。

申请策略深度诊断报告