前视偏差:回测第一大敌的工程学防御
先掌握这个答案
前视的六个藏身点+防御工程:①信号与成交同刻→错位设计:t日收盘信号只能t+1日成交(框架强制shift);②财务对齐→只允许merge_asof(公告日)入口,禁止按报告期merge;③横截面标准化→用expanding(截至当日)统计,禁全样本均值;④股票池→用历史成分/历史状态,禁止「今天的列表」回测过去;⑤因子中间量→整条计算链的时间审计,shift宁多勿少;⑥复权价→用「截至当时」的复权因子(未来分红会改变历史复权价)。终极防线:截断检验——删掉最后20%数据重跑,历史信号必须逐日不变。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
以信息可得时间对齐
财报报告期结束日不是市场获知信息的时间。对每个特征记录available_at,并确认不晚于决策时点;盘后数据通常不能用于同日收盘前下单。保留历史修订与退市样本,检查删尾重跑是否稳定。
每一笔收益都要有可执行时间线
打印数据截止时间、信号时间、订单时间、成交时间和持仓收益区间。收盘信号不能乘当天完整收益;次日开盘成交也不能无条件拿到整个close-to-close收益。用原始价格判断可成交性,并纳入停牌与涨跌停。
本阶段实战方法 · 回测先过时序、成交与成本三道关
把信号变成策略收益时,每笔收益必须能追溯到当时能下出的订单。
- 画出时间线:数据可得→算信号→下单→成交→持仓收益;收盘信号不能倒用当天完整收益。
- 明确交易价格、T+1可卖数量、停牌涨跌停、仓位上限和实际成交量约束。
- 同时报告毛/净收益、换手、最大回撤、基准和样本外结果;对滑点与费率做压力测试。
使用边界
- 简单shift(1)只解决部分时序问题;次日开盘成交还要区分隔夜和日内收益。
- 成本应按成交金额与买卖方向计提;0.15%是教学情景,不是统一市场费率。
- 我人很小心所以不会犯:人肉审查在百行代码里勉强可行,千行代码+多年迭代必错——防御靠结构不靠细心
- shift(1)一招就够:财务对齐、股票池、标准化统计量、复权因子……每个数据入口都有自己的时间陷阱
- 截断检验太麻烦:它是唯一能一次性暴露所有隐蔽前视的终极检验——省掉它的代价是整份回测不可信
🛠 本题实践任务
给你的迷你回测(q-501)加上截断检验函数:自动比较全量与80%截断的信号矩阵,差异>1e-9即报错。再故意把成本计算的shift删掉,看检验能否抓到。
💡 提示(先自己想5分钟再看)
截断后重新计算整条信号链(不是切片信号矩阵);对照上面代码的full/truncated结构。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
🤖 AI导师
导师会先检查你的前置知识(回测构成、公告日对齐、shift纪律),再用案例、公式和代码帮助理解。此功能需要先启用服务。