因子投资-实验06-识别未来函数与幸存者偏差
并排构造两条财报管线:错误管线按 report_period 连接,正确管线只允许 announce_date 不晚于决策日。再比较“只保留期末仍上市股票”和历史股票池收益。目标是让两类偏差变成可失败断言,而非抽象警告。
问题
并排构造两条财报管线:错误管线按 report_period 连接,正确管线只允许 announce_date 不晚于决策日。再比较“只保留期末仍上市股票”和历史股票池收益。目标是让两类偏差变成可失败断言,而非抽象警告。
输入数据
两只股票 A、B 的年报报告期均为 2025-12-31;A 在 2026-03-20 公告,B 在 2026-04-15 公告。决策日是 2026-03-31。错误表会提前使用 B。
幸存者样本有 A、B、C 三只股票,C 在第二月亏损 50% 后退市。期末名单只有 A、B;若回溯删除 C,历史等权收益被抬高。
逐步实现
错误连接条件是 report_period≤decision_date,它只检查会计期间,不检查市场知道时间。正确连接先过滤 announce_date≤decision_date,再按股票取最新公告。
幸存者测试不需要复杂回测:对每月历史 eligible 股票等权,与先筛选 end_survivor 的结果比较即可。
完整代码
1 | |
预期输出
错误管线 A、B 都出现,B 的 future_announcement=True;正确管线只有 A,未来公告计数为零。历史股票池包含 C 的退市前损失,平均收益低于只保留 A、B 的回溯样本。
断言
- 错误管线至少使用一个未来公告。
- 正确管线未来公告为零,且只保留 A。
- 期末幸存股票回溯收益高于历史股票池。
- 日期和股票键应唯一;真实管线还需断言首次公告版本与日内可用时间。
结果解释
错误表不是因为数值错,而是因为“在未来才公开的正确数值”被放到了过去。幸存者管线也不是计算错,而是研究总体被期末名单重写。两者都无法靠稳健标准误修复。
正确历史股票池并不一定收益更低;本例故意让退市股亏损以显露偏差。真实研究的断言应检查成员身份与日期,而不是规定收益方向。
常见故障
- announce_date 只有日期,盘后公告仍假设当日可用。
- 修订财报覆盖首次公告。
- merge 后同一股票保留多版本。
- 退市股收益缺失后被 dropna。
- 指数历史成分用当前名单。
- 用“结果应该更差”代替结构断言。
练习
- 加入盘中/盘后时间戳和次日开盘成交。
- 同一报告期加入修订版本,做 point-in-time 版本选择。
- 让 C 退市前上涨,验证结构断言仍通过而收益方向改变。
- 比较当前指数成分与历史成分回测。
- 将错误和正确管线封装为单元测试。