交易系统 · 第 9 节

回测的坑:前视偏差与复权

把规则写死 · 第 9 页。

一句话速览 用了当时还拿不到的信息,或者用错复权口径,都会让回测结果失真且不易察觉。
这节课要你带走的 前视偏差和复权口径这两个坑,以及它们为什么特别难被发现。

这两个坑的共同点是: 它们不会让回测报错,只会让回测变好看。 所以它们特别难被发现。

前视偏差

用了当时还拿不到的信息

四种常见来源:

一、财务数据的发布延迟。 某季度的财报要等几周后才发布, 但数据源可能把它标注在季度末。

二、当日收盘价。 用收盘价作为信号又用收盘价成交, 实际上你在收盘前不知道收盘价是多少。

三、数据修正。 宏观数据经常被后续修正, 而你看到的历史序列是修正后的版本。

四、成分调整。上一节

复权口径

三种价格序列,含义不同

一、原始价格:历史上实际成交的价格。

二、前复权:把历史价格按分红拆股调整到当前口径。

三、后复权:把当前价格调整到历史口径。

用错口径会让分红除息日看起来像一次下跌, 或者让拆股看起来像一次暴跌。

做收益率计算必须用复权序列,做「价格是否突破某个历史价位」必须用原始序列。

因为前者关心的是持有人的实际回报后者关心的是当时的市场参与者看到的是什么价格。

前复权还有一个陷阱

前复权序列会随着新的分红和拆股而变化。

也就是说,你今天跑的回测和三个月后跑的回测, 用的历史数据可能不一样而这个变化是静默的。

应对:把回测用的数据快照存下来,标注取数日期 (见 U11-1)。

怎么发现这两个坑

一、如果回测结果好得不像话,先怀疑数据。 异常好的结果通常是数据问题,不是方法突破。

二、检查每一个信号用到的数据在那个时点是否可得。 逐项过一遍,这是唯一可靠的方法。

三、做样本外检验。 用一段完全没参与开发的数据验证, 前视偏差在样本外通常会立刻暴露。

一个务实的建议

对个人投资者来说, 完全干净的回测很难做到。

所以更实际的做法是: 把回测当成「排除明显不行的方案」的工具, 而不是「证明这个方案行」的工具。

前者对数据质量的要求低得多,而且它已经很有价值。

今天就做这一件事

如果你用过任何历史价格数据,查清楚它是原始价格还是复权价格。

然后找一个做过拆股的标的,看那个日期附近的数据长什么样。

带走这一条:前视偏差和复权口径都不会让回测报错,只会让它变好看,所以难被发现。前视偏差的四种来源是财务数据发布延迟、用当日收盘价、数据修正、成分调整。收益率计算必须用复权序列,判断是否突破历史价位必须用原始序列。前复权序列会随新的分红拆股静默变化,所以要存数据快照并标注取数日期。实际做法是把回测当成排除明显不行的方案的工具,而不是证明方案行的工具。