交易系统 · 第 10 节

回测的坑:幸存者偏差与未来函数

建立你自己的交易系统 · 第 10 页。上一节讲参数,这一节讲数据。

一句话速览 过拟合还算容易发现,这三个坑更隐蔽:样本里少了已经消失的公司、假设了实际上成交不了的价格、用了当时还不知道的信息。
这节课要你带走的 三个坑各自的识别方法,以及一组「回测结果好得不像真的」时该查什么的信号。
1

幸存者偏差

如果你的股票池是「今天还在市场上的所有股票」,那么已经退市、被并购、长期停牌的公司都不在里面

而那些公司恰恰是表现最差的一批。用今天的名单去回测过去,等于假设你当年就知道哪些公司能活下来。

典型症状:回测显示「买入跌幅最大的股票然后持有」很赚钱。 现实中这类策略会大量买到后来退市的票,而回测样本里没有它们。 ST 与退市 那一节讲过退市股的实际下场。
怎么处理:用包含退市股的完整历史名单(专业数据源会提供), 或者至少在结论里说明这个偏差的方向:你的回测结果偏乐观。
2

成交假设不成立

回测里下单必然成交,现实里不一定。差距最大的三种情况:

一是涨跌停。回测按涨停价买入,实盘要排队,可能根本买不到, 见 打板那一节。跌停时想卖也一样卖不掉。

二是流动性。小盘股、冷门股的盘口很薄,你的委托量本身就会推动价格, 见 五档盘口。回测按收盘价成交,实盘可能差好几个点。

三是滑点。即使能成交,实际价格也往往比回测假设的差一点。频率越高影响越大。

典型症状:策略专门交易小市值、低流动性标的,回测收益极高。 这类结果几乎都是成交假设造成的。
怎么处理:加保守的滑点假设(比如每次多算 0.1% 到 0.3%), 涨跌停时假设无法成交,并且限制单笔委托不超过该股日均成交额的一个很小比例
3

未来函数

在决策时用了当时还拿不到的信息。这是三个里最隐蔽也最致命的, 因为它不会让回测「有点乐观」,而是让回测完全失去意义

常见形式:

  1. 用当日收盘数据决定当日买入。比如「当日涨幅超过 5% 就买」, 但涨幅要收盘才确定,你无法在盘中知道。
  2. 用还没发布的财报数据。财报有披露日期, 用报告期而不是披露日去对齐数据,就把未来信息塞进来了。
  3. 用修订后的数据。很多宏观数据会事后修订, 用修订值回测等于用了当时不存在的数字。
  4. 指标计算窗口越界。比如某个「热度」因子实际上统计了未来几天的数据。
典型症状:回测曲线过于平滑、回撤极小、胜率高得不真实。 如果一个策略的回测曲线接近一条直线,先怀疑未来函数,而不是庆祝。
怎么处理:对每一个用到的数据问一句 「做决策的那一刻,这个数字存在吗」。 财报要用披露日对齐,盘中信号只能用已发生的分钟数据。
回测曲线太漂亮,先查数据,不要先高兴。

好得不像真的?先查这几个数

下面每一条出现时,都要回头查数据

最大回撤小得离谱查未来函数
胜率超过 70% 且盈亏比也大于 1查未来函数
年化收益超过 50% 且持续多年查成交假设
专做小市值或低流动性标的查滑点与冲击成本
策略偏爱大跌之后的股票查幸存者偏差
换个时间段结果就完全不同查过拟合(上一节)

这不是说好结果一定有问题。而是说好结果的先验概率很低,所以看到它时, 合理的反应是增加怀疑而不是增加信心。

一个最基本的自查

如果你自己做回测,至少做到这一条:把数据按时间切成两半,只用前一半调参数,然后在后一半上跑一次。

后一半的结果如果明显变差,说明前一半的优化是拟合噪音。这个动作成本很低,但能挡掉大部分自欺。

更严格的做法是滚动验证:用第 1 到 3 年调参、第 4 年验证,再用第 2 到 4 年调参、第 5 年验证,依此类推。这样能看出参数是不是需要频繁调整,而需要频繁调整本身就是不稳健的信号

今天就做这一件事

回到 上一节 你找的那个回测,这次只问三个问题:

一、股票池包含已退市的公司吗?
二、成交价怎么假设的,有没有算滑点?
三、用到的每个数据,在做决策那一刻都存在吗?

三个问题里能明确回答的,通常一个都没有。而这就是你该给这个回测的可信度。

带走这一条:幸存者偏差让结果偏乐观,成交假设让结果无法复现, 未来函数让结果完全无效。回测曲线太漂亮时先查数据。 最基本的自查:数据切两半,前半调参、后半验证。