691 字
3 分钟
第五部分(下):策略实现与回测 —— 那行值一万块的 shift(1)
原书策略章节真正的价值不在策略本身,而在实现细节。本页把这些细节提炼成清单——它们会在你未来的每一次回测里保护你。
双均线策略:五行代码的完整解剖
fast = close.rolling(5).mean()slow = close.rolling(20).mean()signal = (fast > slow).astype(int) # 1 持有 / 0 空仓ret_strategy = signal.shift(1) * ret # shift(1):昨天的信号,今天的收益!cum = (1 + ret_strategy).cumprod() # 净值曲线第四行那个 shift(1) 值一万块钱——今天收盘算出的信号,最早只能赚到明天的收益。漏掉它,回测立刻染上未来函数,收益虚高得离谱。检查方法:把 shift(1) 改成 shift(0) 跑一遍,如果收益率大幅提升,说明你的信号里确实藏着”当天的未来信息”。
回测实现的检查清单(原书细节的提纯)
| 检查项 | 错误后果 | 正确做法 |
|---|---|---|
| 信号对齐 | 未来函数 | 信号统一 shift(1) 后再乘收益 |
| 持仓状态 | 信号和持仓混淆 | 信号 → 持仓要经过状态转换(开仓/持有/平仓) |
| 成本计提 | 收益虚高 | 在换仓日按换手量计提双边成本 |
| 停牌/涨跌停 | 假装能成交 | 停牌日冻结持仓;一字板日放弃调仓 |
| 复权 | 除权日假跳空 | 全程使用后复权价格 |
| 基准对比 | 自嗨 | 永远画上买入持有基准线 |
从”策略回测”到”因子回测”的跨越
原书教的是单标的择时回测;平台做的是截面因子回测。迁移时的思维转换:
- 信号从”一个时间序列”变成”trade_date × symbol 的面板”;
shift(1)的对应物是”用前一日收盘决定持仓、当日结算收益”(平台回测引擎内置);- 净值曲线之外,多了 IC、分层、多空等截面专属的检验维度。
原书的价值就在这一步:亲手写过时序回测、踩过未来函数的坑,你才能真正理解平台每个数字是怎么来的。
动手练习
- 用 AKShare 拉任意一只股票三年日线,亲手实现上面五行双均线回测;
- 加上千分之一成本再跑一遍,看年化被吃掉多少;
- 把
shift(1)去掉跑一遍,感受”未来函数的美好幻觉”; - 全部做完,你会彻底理解为什么平台的回测引擎要那样设计。
本页带走的三句话
signal.shift(1)是回测的第一戒律——昨天的信号,今天的收益;- 成本、停牌、涨跌停、复权,每个细节都能凭空改变回测结论;
- 亲手踩一次未来函数的坑,胜读十篇防坑指南。