Purged交叉验证与embargo:避免交易模型中的标签泄漏
了解金融时间序列中如何处理相互重叠的未来收益标签,并区分purging、embargo、walk-forward、TimeSeriesSplit和CPCV。
本指南内容随机K折何时会造成误导
简短摘要
Purged交叉验证会从训练集中移除结果区间与测试标签区间重叠的样本。Embargo则是在测试块之后另行设置缓冲期,在允许使用测试块之后的数据训练时,暂不将缓冲期内的后续观测纳入训练。两者解决的问题不同,也不会自动把任意切分变成按时间顺序的walk-forward模拟。
随机K折何时会造成误导
常规K折交叉验证会把样本分成若干组,轮流将一组用于测试。金融数据中的观测可能彼此相关,面向未来的收益标签也可能覆盖相互重叠的时间区间。此时随机切分会让训练和测试信息过于接近,评估结果可能显得过于乐观。
这并不表示K折在所有情况下都无效。是否适用取决于评估问题、数据结构,以及关于依赖关系和标签区间的假设。对时间序列而言,特征只能使用预测时实际可获得的信息;测试期的未来结果不能混入训练标签。
还要说明验证要回答的问题:是模拟当时只用过去数据训练、再预测后续时期的部署过程,还是考察模型在多个分组下的稳定性?这两种目标可能需要不同的切分方法。
定义决策时点和标签区间
对每个样本,记录决策时点t、当时确实可用的信息、特征窗口、目标标签区间,以及标签确定的终点t1。例如,在t时点做出日度决策、预测未来5个交易日收益的标签,覆盖区间(t,t+5]。不能把t+5之后才出现的信息用作t时点的特征。
两个样本的历史特征窗口有共同部分,并不自动构成泄漏。如果这段共同历史在两个预测时点都已可用,而且特征只基于各时点可用的数据构建,它通常属于市场依赖,与共享未来标签是两回事。相反,把之后修订的经济数据或回溯调整的价格当作当时已知的信息,就会产生问题。
如果标签由事件结束时点或波动率屏障决定,不同样本的区间长度可能不同。应保留每个标签实际的起止时间,而不是用固定行数代替所有事件区间。
移除与测试结果区间重叠的训练标签
如果训练样本实际的结果或标签区间与测试样本的结果区间相交,就应在purging时将其从训练集中排除。金融标签通常包含未来收益或事件;若只比较决策日期,可能会漏掉同一段价格变化同时进入训练标签和测试标签的情况。
对于长度不一的事件标签,应比较实际起止时间。对所有样本一律删除固定的5行,可能会漏掉较长事件,也可能过度删除较短事件。先检查标签区间是否真的重叠,再根据切分设计决定是否需要额外的embargo。
Purging本身不会让数据切分遵守时间顺序。某种方案仍可能把测试块之后的观测保留在训练集中。排除重叠标签与模拟只用过去数据进行历史预测,是两个不同要求。《Advances in Financial Machine Learning》第7章讨论了金融重叠标签的purging方法。
用五个交易日标签检查区间
假设每天都有一个决策,每个标签覆盖未来五个交易日,即(t,t+5]。以下数字表示连续的交易时段。若测试决策日期是第11日至第15日,第15日决策所对应的测试标签会延伸到第20日。
候选训练标签(7,12]与测试结果区间在第11日至第12日之间重叠。另一个候选标签(16,21]也与仍在延续的测试标签区间重叠。因此,这两个训练样本都应被purge。判断依据是实际的结果区间,而不只是决策日期相隔几天。
更晚的某个样本即使其标签不与测试标签相交,也可能因为落入另行规定的embargo期间而被排除。本例用于展示区间如何核对,并不规定所有数据都应使用同样长度的间隔。
将embargo与purging分别设定
对于允许用测试块之后观测训练的切分,embargo是在测试块之后设置的缓冲期;缓冲期内的后续观测暂不进入训练。它可以降低事件构造或特征构造造成的残余依赖,但不能取代对实际标签区间重叠情况的检查。
不存在适用于所有数据的固定比例或固定天数。应结合采样频率、标签期限、特征构造方法和数据依赖程度选择缓冲长度,并记录理由。如果特征窗口比标签期限更长,embargo太短仍可能留下依赖。
在walk-forward切分中,如果训练不使用测试时期之后的数据,通常不需要为后续训练样本设置embargo。不过,仍要核对测试前的训练标签是否延伸到测试结果区间。

区分walk-forward与TimeSeriesSplit
Walk-forward或rolling-origin验证使用过去数据训练,再对之后的时期测试。它适合回答历史部署问题:如果当时只用那时已经获得的数据,模型能否预测下一个时期?应说明训练窗口是逐步扩展还是保持固定长度。
scikit-learn的TimeSeriesSplit也会让训练集早于测试集;gap参数指定测试前从训练集末尾排除多少个观测。官方文档将gap定义为样本行数。对于等间隔观测,它对应固定行数的间隔,但不会自动检查非定长事件标签的实际区间是否重叠。
因此,单独设置gap不能代替实际标签区间核对。时间顺序、标签重叠和所需缓冲期应分别处理。如果观测行不对应均匀的实际时间,也应记录行数如何映射为时间长度。
理解Purged K-fold和CPCV回答的问题
Purged K-fold会针对每个测试块排除标签区间与其重叠的训练样本。根据具体构造,训练集也可能包含测试块之后的观测。这有助于研究模型在不同时间组合下的稳健性,但回答的问题不同于只用过去数据进行历史部署模拟的walk-forward检验。
Combinatorial purged cross-validation(CPCV)组合多个测试块,形成多条测试路径,用于考察结果分布。《Advances in Financial Machine Learning》第12章关于walk-forward和CPCV的讨论介绍了相关方法;第7章讨论了重叠金融标签的处理。多条测试路径并不能消除特征前视、事后修订数据、在全样本上预处理或反复尝试模型造成的选择偏差。
不要把CPCV路径数量当成相互独立的模型实验次数。通过大量尝试挑选模型所造成的过拟合,需要单独评估。Bailey等人关于回测过拟合概率的研究讨论了从多个候选结果中进行选择的问题。
检查切分后仍然存在的泄漏来源
Purging无法修复前视特征、错误的时间戳、生存者偏差或事后修订的数据。如果在切分前就用全样本拟合标准化、缺失值填补或特征筛选,测试信息可能传入训练过程。反复根据测试结果调整模型,也会造成选择偏差。
应在每个训练fold内部拟合预处理转换和特征筛选,再将已拟合的步骤应用到对应的验证部分。选择模型或超参数时使用考虑时间顺序的嵌套验证,并保留一个从未用于选择的最终时间顺序holdout。手续费、价差和订单实际成交能力等假设不现实,也会扭曲结果。
交叉验证不能保证未来表现。分数是以具体样本、特征和标签定义以及成本假设为条件的估计。
记录可复现的验证设计
每次实验都应记录决策时间、信息可用时间、特征窗口、标签的开始与结束时间、训练和测试fold的边界、被purge的样本、embargo长度及理由、预处理拟合范围,以及最终holdout。这样其他人才能重建相同的样本边界。
有关过拟合,可继续阅读[金融模型中的偏差-方差权衡](/zh-CN/learn/bias-variance-tradeoff-financial-model-overfitting-explained);有关反复检验,参见[多重检验与金融中的错误发现率](/zh-CN/learn/multiple-testing-false-discovery-rate-finance-explained);[考虑序列相关性的Sharpe比率年化](/zh-CN/learn/sharpe-ratio-serial-correlation-annualization-explained)则介绍收益序列评估中的另一项问题。报告时应说明每个阶段使用了哪些数据,而不只是写出方法名称。
常见问题
Q1两个样本的历史特征窗口重叠就一定是泄漏吗?
不一定。如果共同历史在两个预测时点都已可用,窗口重叠本身不会泄漏标签。若测试结果或未来信息进入训练标签、特征或预处理中,才会产生泄漏风险。
Q2Embargo是否必须固定为五天?
不是。没有通用的固定长度或比例。应根据采样频率、标签期限、特征构造和数据依赖程度说明缓冲期,并单独检查实际标签区间。
Q3CPCV得分高能保证未来交易表现吗?
不能。CPCV会生成多条测试路径,但无法消除前视、事后修订数据、多次试验的选择偏差或不现实的成本与成交假设。
资料来源与延伸阅读
报告问题
我们会准备一封包含本文链接的邮件。发送后,Mark 才会收到你的反馈
快速检查
读完指南后,用 3 道题检查一下
问题 01
训练标签的结果区间与测试结果区间重叠时,purging应如何处理?
选择答案即可查看解释