最后五年被贴上“最终测试”标签。第一次结果不理想,研究者换个信号;第三次终于好看了,报告仍写“样本外表现优秀”,理由是程序从没把那五年放进训练函数。这段资料究竟有没有教会研究者怎样选规则?
程序没训练,不代表研究者没学习。只要那段结果改变了规则、参数或题目,它就参与了选择。要知道一份检验还剩多少独立信息,除了看时间分界,也要看人何时看过什么、改过什么。
这次要安排清楚的事
- 区分开发、验证与最终测试的用途,记录所有查看和修改。
- 画出按时间前进的滚动或扩展窗口,检查训练信息何时完整可得。
- 给重叠标签、已污染留出与未来观察留下处理办法,完成T06的时间划分和查看日志。
这里教设计和审查,不声称某个划分比例最优,也没有执行C2真实历史策略检验。后面的月度例子是独立的C4时间机制练习。
三种区间,不是三个漂亮的文件名
开发区间用于理解资料、实现规则、选择特征或估计参数。验证区间用于在已声明的候选和评价方式间作选择;既然参与选择,就不能又称作最后一次独立评价。
最终测试应在规则与评价办法锁定后,按预先约定的方式使用,避免结果反过来决定报告版本。它可以发现坏消息,不是必须通过的一道考试。发现实现错误需要修复时,也要记录看过哪些信息、修了什么,并下调对该段独立性的描述。
scikit-learn的资料泄漏说明不仅要求测试不参与参数拟合,也要求它不参与模型选择,预处理的统计量应从训练资料取得。[1] 换成个人研究,就是不能一边看“最终结果”,一边让AI替你寻找更合适的规则。
样本外是相对于某次选择过程而言的,不是市场数据自带的属性。同一段历史可以在一轮研究中用于测试,在下一轮成为开发材料;身份改变可以记录,不能假装身份从未变过。
先沿用C2已经写下的分界
C2-A教学规格把2007—2014年用于规则理解与开发,2015—2019年用于验证,2020—2024年作为冻结的教学留出,并另取2006年起资料预热。本篇不改这些年份,也不因后来行情更好就延长到当前。
按整年计算,三段分别覆盖8年、5年、5年;若每个日历月有一个有效月末值,对应96、60、60个月。真实观察数量还要按有效资料和交易日核对,不能把这个简单月数直接当作已取得的完整数据。
更关键的是,2020—2024年的行情已经属于历史教学内容,不是作者从未知道的未来。本书只把它称为冻结的教学留出;读者若已看过相关曲线或据此改过参数,也要注明影响,不能因为文件夹叫“test”就恢复未知状态。
C2的固定经济规则也不一定存在机器学习“训练参数”。没有训练函数,仍可能在开发中挑过资产、均线长度、起止日期和费用假设。把整个研究选择过程登记,才知道时间划分实际约束了什么。
为什么不能随手把所有月份打乱
如果任务是模拟先观察过去、再作下一步决定,把未来月份随机送进训练,可能让模型先看到后来的价格环境。尤其数据相关、制度变化或标签跨期时,随机分行不一定能近似你要执行的过程。
时间序列划分工具因此提供按先后顺序训练和检验的方式;scikit-learn的TimeSeriesSplit说明还提示等间隔等条件,与具体切片定义有关。[2] 这不是说随机划分对所有统计问题都错误,而是要匹配本次“向未来作决定”的任务。
仅按日期切开也不够。标准化、缺失填补、特征选择和模型估计,都只能使用该次训练允许的信息。测试段可按已确定方法转换,不能把测试均值偷偷拿回来改变训练尺度。
滚动窗口:每走一步,只带当时能带的材料
设有18个连续、等长的合成月M1至M18,按顺序编号。为先读懂窗口,假设每次校准所需历史资料在窗口末已经可得,暂不引入未来三月标签。约定每次用最近6个月校准一次,后面3个月检验,不在这3个月中途因结果改方法。
| 轮次 | 校准时已知的最近6个月 | 随后检验的3个月 | 扩展窗口的替代校准范围 |
|---|---|---|---|
| 1 | M1—M6 | M7—M9 | M1—M6 |
| 2 | M4—M9 | M10—M12 | M1—M9 |
| 3 | M7—M12 | M13—M15 | M1—M12 |
| 4 | M10—M15 | M16—M18 | M1—M15 |
左边保留固定长度、逐步向前,是这里的滚动窗口;右边保留更多已知历史,是扩展窗口。两者都可以合理,但它们对旧资料和近期变化的取舍不同,不能只在看结果后留下更好的一种。
四轮检验共12个月,M7至M18每月只计一次,训练区间重叠并没有凭空增加检验月份。若把重复出现的训练行也算成新的样本外结果,记录长度就被夸大了。
CFA的回测概述介绍了按滚动窗口校准并跟踪后续表现的流程,同时提醒结构变化和前视等限制。[3] 滚动并不是让旧风险消失;它只是把“每个时点允许学习什么”写得更明确。
到了第二轮,上一轮检验的M7至M9已经发生,可以按事先确定的扩展或滚动机制进入新一轮训练。这与拿它们重写第一轮决策不同;规则、更新频率和选择办法仍应在评价前锁定。
这里冻结的是更新方法,不一定是模型系数永远不变。事先约定每三个月按最近六个月重估,与看见亏损后临时决定改成九个月,是两回事。前者可以作为同一动态规则连续评价;后者产生了新版本,需要登记选择依据。这样才能既允许模型更新,又不让“滚动”成为随时改题的借口。
拼接后续结果时,还要保留账户连续性。窗口交界的持仓、资金和调仓成本不能每轮免费归零;若只看预测误差,也应与实际交易评价区分。分段图拼得顺,并不证明已经得到一条可实施的完整净值。
标签伸到了后面,训练行也要往前检查
现在改变一个条件。假设每个月末的特征用于预测随后3个月的复合收益,即M6这一行的答案要到M9结束才完整知道。准备在M6结束后校准、从M7开始检验时,还能把M1至M6所有标签都拿来训练吗?
不能。M4标签要用M5、M6、M7,M5要用M6、M7、M8,M6要用M7、M8、M9,都跨过了校准时点。按这里的明确假设,最晚可完整知道的是M3标签,它由M4至M6的结果构成。
因此,这次需要排除M4至M6的未成熟标签,或重新设计校准与评价时点。所谓间隔、清除重叠等处理,应依据每条标签结束与实际可得时间决定,不是所有策略一律空出三个月。工具提供gap参数,也不会自动替你理解标签。[2]
特征使用过去窗口则是另一回事。M7特征若只用当时可得的M1至M6历史,不因跨过训练边界就必然泄漏;关键是没有借未来,也没有用后续统计量重估它。不要把过去特征重叠与未来答案越界混成同一种问题。
偷看之后,怎样诚实地继续
如果小林先看2020—2024结果,再把均线由10期改为12期,该区间已参与选择。把它切成2020—2022和2023—2024,或者把后段文件重命名为“真正最终测试”,都不能抹掉已经看到的信息。
应保留原版与查看日期,写出这段结果影响了什么,重新把它视为已用研究材料。后续评价可以继续提供探索线索,但不再冒称第一次接触、完全独立的最终证据。
修复一个真实代码错误,也不是可以免记污染的通行证。修复可能有合理依据,仍需说明错误怎样发现、哪些结果已看,以及重跑后的证据性质。隐藏修复前版本,会让别人无法判断研究者实际上尝试了多少。
如果存在确实未用于本次选择、也未由其他汇总提前透露的材料,可以记录其隔离与选择依据后使用;若无法证明,就保留未知。不能反复寻找一段恰好好看的年份,直到得到可以宣布成功的测试。
前瞻观察,从冻结后的新资料开始
历史时序正确,和研究者当时真的没见过,是两个层次。只有规则和流程冻结后,让之后新到资料依次进入并保存时间戳,才能形成这项规则的前瞻观察记录。
纸面观察仍有模拟成交的限制,真实小额执行还会增加订单、账户和运营问题;两者都不是看几天有利润就通过。样本长度、交易次数、市场环境及与历史差异,都需要单独评价。
新环境可能让旧关系改变。可以按预先写好的监控条件暂停、复查或开启新版本研究,但应分开旧规则的前瞻结果与新规则的开发。不能边调整边把整段称作一条从未修改的策略。
先把这张时间表读一遍
解释题:程序没有对最终段调用训练函数,研究者却根据它换了参数,为什么仍不独立?应用题:滚动表第3轮可以用M13—M15的均值做标准化,再回算M7—M12吗?先写允许的信息范围。
第一题中,最终段通过研究者决策影响了选择,信息不只从训练代码进入。第二题把尚待检验的未来统计量用于训练,违反本轮时点;应从允许训练资料估计转换,再按同一转换处理后续值。
换一个看过全图的项目
一份独立合成项目原定M1—M12开发,M13—M18验证,M19—M24最终检验。作者已查看M1—M30完整表现图,并因M19—M24结果不理想换了规则,随后把M25—M30命名为新留出。请判断这段能否自动称为未知样本外。
不能。M25—M30也出现在已看全图中,重分区没有取消它可能对资产、规则和窗口选择的影响。应在查看日志登记完整30个月及修改理由,把新报告标为已见历史上的后续探索,再设计确实隔离或之后到来的评价。
再问:若在M12结束后训练,标签是随后3个月收益,按与前例相同的可得假设,M10、M11、M12中哪一行能用?三行都不能,最晚完整可用的是M9标签,由M10至M12结果组成。不能只删除最后一行就认为清理完成。
完成T06的时间窗与查看日志
为自己的项目画出开发、验证和最终留出的日期边界,另记预热、特征回看、标签结束、资料实际可得时间和最早允许交易时点。若采用滚动或扩展,填每轮校准范围、检验范围与账户衔接政策。
查看日志至少写规则与数据版本、谁或哪个工具何时看过哪些区间、查看目的、得到什么信息、是否修改及原因。失败和中途放弃同样保留;AI看到并据此建议更改,也要记入,而不只记人亲自打开的图。
自检时从任意一次历史决定往回追:当时是否拥有所需特征和标签,所用方法何时锁定,检验结果有没有反过来参与选择?缺一项就标未核,不用一张绿色检查表替代实际记录。
小结:样本外需要时间,也需要没有被偷偷用过
先按任务给区间分工,确保每次学习和预处理只使用当时允许的信息,再检查标签结束与执行顺序。滚动和扩展能描述更新机制,不能自动消除重复查看、相互依赖或环境变化。
看过就登记,改过就分版本。已知历史可以继续教你东西,但不能靠重命名重新变成未知;把前瞻观察与探索分开,才知道下一份结果究竟增加了什么证据。
参考资料
- scikit-learn:Common Pitfalls—Data Leakage。测试信息不参与模型及预处理选择;本篇不要求调用程序库。
- scikit-learn:TimeSeriesSplit。按时间划分、扩展与gap定义;工具不替代业务时点审计。
- CFA Institute:Backtesting & Simulation,2026公开概要。滚动研究与前视、结构变化限制;未读取付费课程。
资料核查日期2026-10-29。本文由AI辅助编写与核查,尚待人类金融审校及目标读者试读。月度窗口和标签例均为原创合成输入,未运行真实C2策略,也未把教学留出冒充未知未来。