前视偏差与Point-in-Time:回测里的"时光机作弊"全集
先掌握这个答案
前视偏差(Look-ahead Bias)=决策时点使用了未来信息。常见形态:①财务按报告期对齐(q-062);②用当日收盘价算因子、又假设当日收盘价成交(信号与成交同一根K线的收盘);③用全样本统计量标准化(均值含未来);④用「今天的指数成分」回测历史(幸存者偏差的兄弟);⑤用分析师一致预期的最新版本回溯历史;⑥财报被修订后的最新值覆盖原值。PIT数据库=记录每个时点真实可见的数据版本。个人防线:公告日对齐+shift(1)宁多勿少+只用当日开盘前已知信息。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
以信息可得时间对齐
财报报告期结束日不是市场获知信息的时间。对每个特征记录available_at,并确认不晚于决策时点;盘后数据通常不能用于同日收盘前下单。保留历史修订与退市样本,检查删尾重跑是否稳定。
每一笔收益都要有可执行时间线
打印数据截止时间、信号时间、订单时间、成交时间和持仓收益区间。收盘信号不能乘当天完整收益;次日开盘成交也不能无条件拿到整个close-to-close收益。用原始价格判断可成交性,并纳入停牌与涨跌停。
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
- 我用的是历史数据所以没有未来:未来是相对决策时点的,2015年的数据对2013年的决策也是未来
- shift(1)一次就安全:因子内部多步计算时,中间变量的时间轴错位仍会泄漏——要对整条链审计
- 只有财务数据有这个问题:成分股快照、分析师预期、复权因子(未来分红影响历史复权价)都有
🛠 本题实践任务
写出你自己的「防前视三保证书」:①我的因子只使用t日及以前的数据;②我的收益从t+1日起算;③我的统计量只用expanding口径。抄在笔记本第一页。
💡 提示(先自己想5分钟再看)
第三条最容易违反:任何groupby后的横截面标准化,如果按全时间段算均值再回填,就是泄漏。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
🤖 AI导师
导师会先检查你的前置知识(公告日对齐),再用案例、公式和代码帮助理解。此功能需要先启用服务。