回测的坑:前视偏差与复权
这两个坑的共同点是: 它们不会让回测报错,只会让回测变好看。 所以它们特别难被发现。
前视偏差
用了当时还拿不到的信息
四种常见来源:
一、财务数据的发布延迟。 某季度的财报要等几周后才发布, 但数据源可能把它标注在季度末。
二、当日收盘价。 用收盘价作为信号又用收盘价成交, 实际上你在收盘前不知道收盘价是多少。
三、数据修正。 宏观数据经常被后续修正, 而你看到的历史序列是修正后的版本。
四、成分调整。见 上一节。
复权口径
三种价格序列,含义不同
一、原始价格:历史上实际成交的价格。
二、前复权:把历史价格按分红拆股调整到当前口径。
三、后复权:把当前价格调整到历史口径。
用错口径会让分红除息日看起来像一次下跌, 或者让拆股看起来像一次暴跌。
因为前者关心的是持有人的实际回报, 后者关心的是当时的市场参与者看到的是什么价格。
前复权还有一个陷阱
前复权序列会随着新的分红和拆股而变化。
也就是说,你今天跑的回测和三个月后跑的回测, 用的历史数据可能不一样, 而这个变化是静默的。
应对:把回测用的数据快照存下来,标注取数日期 (见 U11-1)。
怎么发现这两个坑
一、如果回测结果好得不像话,先怀疑数据。 异常好的结果通常是数据问题,不是方法突破。
二、检查每一个信号用到的数据在那个时点是否可得。 逐项过一遍,这是唯一可靠的方法。
三、做样本外检验。 用一段完全没参与开发的数据验证, 前视偏差在样本外通常会立刻暴露。
一个务实的建议
对个人投资者来说, 完全干净的回测很难做到。
所以更实际的做法是: 把回测当成「排除明显不行的方案」的工具, 而不是「证明这个方案行」的工具。
前者对数据质量的要求低得多,而且它已经很有价值。
今天就做这一件事
如果你用过任何历史价格数据,查清楚它是原始价格还是复权价格。
然后找一个做过拆股的标的,看那个日期附近的数据长什么样。