回测的坑:过拟合
先拆一个真实流传的回测
在量化社区里能搜到大量打板策略的回测。下面这个是其中比较典型的一个:
这个数字本身没有造假。问题在于它无法说明这个策略未来能赚钱。逐条看:
样本期只有半年
按每天一次交易算,半年也就一百多笔。 上一节 讲过,这个样本量连「有没有优势」都分辨不出来, 更不用说算年化。而且把半年的收益年化本身就是一种放大。
样本期落在特定行情段
2024 年 9 月之后有一段明显的行情。一个在单边上涨里测出来的做多策略, 说明不了它在震荡市和下跌市里的表现。好的回测至少要跨越一次完整的牛熊。
幸存者偏差:你只看到了发出来的那个
同样的思路可以生成成百上千个参数组合,其中总有几个的历史表现很好。 发出来的是那几个,亏钱的那些没人发。这跟 FOMO 那一节 讲的盈利截图是同一个机制。
「概念热度」很可能含未来信息
这类因子如果用了当日收盘后才能确定的数据来决定当日买入, 就是未来函数。这是回测里最隐蔽也最致命的错误, 下一节 专门讲。
按涨停价成交,实盘可能根本排不上队
回测假设你能在涨停价买到。而 打板那一节 讲过, 涨停价上只有时间优先,你的委托大概率排在几万手后面。 回测里 100% 成交,实盘可能只有 20%,而且成交的那些往往是板要炸的时候。
不计滑点和冲击成本
即使算了手续费,滑点通常也没算。而这类策略的交易频率极高, 上一节 算过:频率是成本的乘数。
六条里任何一条都足以让这个数字失去参考价值。而它们同时存在。
过拟合是怎么发生的
假设你有一个策略,里面有个参数(比如均线周期)。你在历史数据上试遍所有取值,选表现最好的那个。
这个动作看起来很合理,实际上你选的是「在这段历史的噪音里恰好最合适」的那个值。
把滑块拖到样本内表现最好的那个位置,看看样本外是多少。这就是过拟合:样本内的峰值,在样本外往往平平无奇甚至更差。
而且有个反直觉的规律:样本内曲线越尖锐,越可能是过拟合。一个真正稳健的策略,参数在一定范围内变化时表现应该都还可以,而不是只在某一个点上特别好。
回测检查清单
下次看到任何回测(别人的或自己的),按顺序问这七个问题:
- 样本期多长,跨越了几种市场环境?少于两年、或者没跨过牛熊的,直接打折。
- 试了多少组参数?试得越多,最优那组是运气的可能性越大。
- 参数附近的表现如何?只在一个点上好的,是过拟合。
- 有没有样本外验证?用一段数据调参,用另一段没碰过的数据验证。这是最基本的要求。
- 成本怎么算的?佣金、印花税、滑点分别按多少算的。频率高的策略 尤其要看这条。
- 成交假设是什么?按什么价格成交、假设成交率多少、有没有考虑流动性。
- 有没有用到当时拿不到的信息?这是 未来函数,最隐蔽。
七个问题里,第 4 条(样本外验证)和第 7 条(未来函数)是硬门槛。这两条不过关的回测,收益率再高也不用看。
今天就做这一件事
去搜一个「年化 XX%」的策略回测(量化社区、公众号、研报都行), 用上面七个问题逐条问一遍。
记录它能回答几个。多数情况下你会发现, 连样本期和成本假设这两条基本信息都没写。
这个练习的价值在于:以后再看到类似的数字,你的第一反应会从「哇」变成「样本期多长」。