为什么禁止随机K折:给金融CV立的三条法
我的掌握程度:
先掌握这个答案
三宗罪:①泄漏罪:验证折里的样本与训练折共享未来(重叠标签)+混入了更晚的市场状态——模型考试带着答案;②选择罪:按折平均分选超参,选出的往往是「最会利用泄漏的那组」——随机折把泄漏放大成系统性偏好;③乐观罪:折间高度相关(同一市场环境被反复采样)——「5折平均」的表面稳健是假方差缩减。替代:①时序K折(TimeSeriesSplit):折按时间排——修②③,仍不修①;②Purged K-Fold(q-710):时序+清重叠+隔离带——三罪全治(研究期标配);③单验证段+走查终审(q-771):最严格——上线前用。虚高量级:经验上随机K折比Purged的验证IC高20-50%(越短周期标签越严重)。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 把验证流程当作模型的一部分
训练选股模型或使用另类数据时,先保证训练过程没有接触预测时不可得的信息。
- 定义每个样本的特征可得时间和标签覆盖区间,再按预测场景设计时间切分。
- 归一化、缺失填充、特征选择和调参只在训练集拟合;重叠标签要按实际区间purge。
- 用朴素基线和多段滚动样本外比较,报告成本、稳定性、漂移与全部实验次数。
使用边界
- 排行榜或验证集反复用于挑模型后也会过拟合;留一份最终测试集。
- 随机切分不是所有问题都禁止,但金融未来预测必须尊重时点和标签重叠,说明验证目标。
背景 · 从一个困惑说起
sklearn的KFold(shuffle=True)在Kaggle表格赛是默认起手式——搬到金融数据上它就成了「作弊执照」。三条法律说清为什么,以及正确姿势。
由此产生的问题
随机K折在金融数据上的三宗罪?替代方案(时序K折/Purged K折/单验证段)怎么选?「分数虚高多少」有没有典型量级?
核心概念
三宗罪:①泄漏罪:验证折里的样本与训练折共享未来(重叠标签)+混入了更晚的市场状态——模型考试带着答案;②选择罪:按折平均分选超参,选出的往往是「最会利用泄漏的那组」——随机折把泄漏放大成系统性偏好;③乐观罪:折间高度相关(同一市场环境被反复采样)——「5折平均」的表面稳健是假方差缩减。替代:①时序K折(TimeSeriesSplit):折按时间排——修②③,仍不修①;②Purged K-Fold(q-710):时序+清重叠+隔离带——三罪全治(研究期标配);③单验证段+走查终审(q-771):最严格——上线前用。虚高量级:经验上随机K折比Purged的验证IC高20-50%(越短周期标签越严重)。
为什么需要它
①默认值陷阱:工具的默认参数为通用数据设计——金融的第一个「本地化」就是换掉所有shuffle;②分数的货币体系:不同CV下的分数不可通约——比较模型/汇报结果必须声明CV协议(这是金融ML报告的义务条款);③教学价值:亲手跑一次随机vs时序的分数差(本题practice)比读十遍原理记得牢。
实际应用场景
检查清单:grep所有CV相关代码——shuffle=True? TimeSeriesSplit有没有gap? 重叠标签purge了吗?三问全过才允许汇报分数。
与之前知识的联系
q-707(时间墙)的CV版展开;q-710(Purged)是完整解;q-592(走查)是终审形态;q-838(Kaggle的Public/Private)是同一思想在竞赛的制度化。
⚠ 常见误解
- TimeSeriesSplit就够了:它修了时间方向但没清标签重叠——短周期标签下它与随机折的差距只剩一半
- 分数高一点没关系就当乐观偏差:虚高不是均匀偏差——它选择性奖励「会利用泄漏的复杂模型」,扭曲模型选择的方向
- CV协议不影响结论方向:模型A随机折下胜B、Purged下反转的案例真实存在——协议就是结论的一部分
🛠 本题实践任务
在你的项目上跑三法对照(随机/时序/Purged),记录三个分数。若随机-时序差>30%:说明标签周期内重叠严重——检查purge窗口设置。
💡 提示(先自己想5分钟再看)
差值本身是诊断:它≈「重叠+漂移」的含金量;把它写进实验日志作为CV协议的验证记录。
✅ 验收标准
三分数对照+差值诊断。你从此看任何ML分数先问一句:什么CV协议?
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(时序切分、交叉验证概念),再用案例、公式和代码帮助理解。此功能需要先启用服务。