因子工程设计课程节选:把数据泄漏变成可定位的审计问题
第09讲《因子挖掘问题、数据泄漏与可信验证》 · 课件案例节选
样本日期属于训练集,标签也一定属于训练集吗?
课件对“414批次”的代表性产物 part0003 做只读审计:共读取92,704行,发现126条严格边界违规。这些记录集中在2024年12月30日、31日两个 factor day,涉及63个品种;样本日期仍在2024年,但标签退出时间已经进入2025年的留出区间。
第一步:区分样本日期与标签信息区间
仅用 factor_day 划分 IS 与 OOS,会漏掉跨界的未来标签。审计要同时检查特征何时可得、何时决策、标签何时开始与结束,再判断训练标签是否完整落在允许的区间内。
完整时间契约:
feature_available_at ≤ decision_time < label_entry_at ≤ label_exit_at
跨界判定:
factor_day < split_date,但 label_exit_at ≥ split_date
→ 从左侧 fold 中 purge 跨界样本
这次代表性产物没有 decision_time,因此只能检查较弱的 feature_available_at < label_entry_at ≤ label_exit_at。时间先后通过,也不代表训练标签没有越过留出边界;两项检查回答的是不同问题。
原课件示意图,点击可放大。Purge 与 Embargo 是不同的边界处理;当前课件程序检查标签跨界,尚未检查 Embargo。第二步:把审计结论与证据逐项对应
| 检查项目 | 课件结果 | 能说明什么 |
|---|
| 时间顺序 | PASS · 非空标签记录0违规 | 满足产物中可检查的较弱时间不等式,不能替代完整决策时刻契约。 |
| 严格留出边界 | FAIL · 126条 | 2个因子日 × 63个品种,标签退出时间跨入2025年。 |
| OOS选择接口 | PASS · review-only | 指标表有414行、无选择列;这只是接口证据,不证明人工查看和选择历史。 |
| 处理器拟合范围 | 不可验证 | 缺少 fit provenance,不能从最终产物反推归一化等步骤的拟合范围。 |
| 真实产物未来扰动 | 不可验证 | 缺少原始输入重算入口,不能把受控案例的通过结果套用到真实产物。 |
课件给出的修复路径是:purge 跨界样本,或改用 label_exit_at 定义 IS 边界;随后重跑受影响的 IS 评估、全局相关性和 OOS 复核。报告要保留违规行与边界,而不只是给一个“检查失败”的提示。
上述数字引用原课件审计记录,未在本网页重新运行。范围是代表性 part0003 与 OOS 接口,不是对414个因子逐列执行全部检验;126条违规也不能直接推断全部因子无效。
第三步:用未来扰动反证特征是否偷看未来
选定 cutoff,仅修改它之后的数据,按同一计算路径重算特征,再对比 cutoff 及之前的输出。如果过去特征随未来数据变化,就要定位中心窗口、双向平滑或错误对齐等依赖。
保留 cutoff 及之前的输入
→ 扰动 cutoff 之后的输入
→ 重新计算特征
→ 比较 cutoff 及之前的输出,并保存差异行
原课件未来扰动测试流程图,点击可放大。课件用 clean 与 leaked 两组受控输入验证检查器:时间契约、切分边界、拟合范围、未来扰动、OOS选择五项检查,分别呈现5项 PASS 与5项 FAIL。这个对照用于证明检查器能识别预设错误,真实工程仍需提供自己的时间、拟合、重算和运行血缘证据。