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、分层、多空等截面专属的检验维度。

原书的价值就在这一步:亲手写过时序回测、踩过未来函数的坑,你才能真正理解平台每个数字是怎么来的。

动手练习#

  1. 用 AKShare 拉任意一只股票三年日线,亲手实现上面五行双均线回测;
  2. 加上千分之一成本再跑一遍,看年化被吃掉多少;
  3. shift(1) 去掉跑一遍,感受”未来函数的美好幻觉”;
  4. 全部做完,你会彻底理解为什么平台的回测引擎要那样设计。

本页带走的三句话#

  1. signal.shift(1) 是回测的第一戒律——昨天的信号,今天的收益;
  2. 成本、停牌、涨跌停、复权,每个细节都能凭空改变回测结论;
  3. 亲手踩一次未来函数的坑,胜读十篇防坑指南。