为什么单次回测会骗人
一份好看的回测报告,和一个真正有效的策略,并不是一回事。以下是如何区分二者——适用于任何工具,包括我们自己的。
只要测试的组合足够多,总会有一个看起来很出色
连续抛十次硬币,你多半会得到一个平淡无奇的结果组合。但让一千个人都抛十次,总会有人连续抛出十次正面。没有人会因此说这个人是“抛硬币天才”——但在回测中,交易者每天都在犯同样的错误。
任何工具的参数优化都以同样的方式运作:测试大量组合,找出表现最好的那些。这确实有用——但也自带一个陷阱。有些组合仅凭纯粹的运气就会显得很出色,因为历史数据中的随机噪声偶尔会恰好与某个特定设置对上,产生一条毫无意义、却异常漂亮的 Equity Curve。
而且你测试的组合越多,你的“最佳”结果就越有可能只是这类幸运的意外之一。这不是某个特定优化工具的缺陷——而是“从众多结果中挑出最好的一个”这件事本身的数学特性。这也意味着,看结果表格最上面那一行时,心里始终要多问一句:这是真实的优势,还是这次运行中的“中奖者”?
在信任任何结果之前,值得检查的三个信号
这些检查不需要用到我们的工具。它们与工具无关,用一张电子表格就能完成。
这个结果建立在多少笔交易之上?
14 笔交易带来 300% 的回报,只是个案,不是证据。小样本在两个方向上都容易产生极端结果——而极端的运气和极端的技巧看起来毫无区别。交易笔数越少,一次回测能告诉你的信息就越少。
相邻的参数值是否也表现一致?
如果周期设为 14 能赚钱,但 13 和 15 都在亏钱,你找到的不是优势,而是一个尖峰。真正值得信任的参数值,通常处在一整片表现不错的区域之中,因为真实的优势不会因为设置挪动了一格就消失。孤立的尖峰正是过拟合的典型特征。
你搜索得有多“用力”?
从 20 个组合中挑出的最佳结果,和从 2,000 个组合中挑出的最佳结果,含金量并不相同。搜索范围越广,运气产生一个“赢家”的机会就越多——因此一个结果需要表现得更加出色,才能真正跨过“这可能只是巧合”这道门槛。
每次运行都手动检查这三项,非常繁琐。这也是几乎没有人真正去做的原因。而这正是我们要解决的问题。
RunOpti 如何在每次运行中自动报告这些信号
RunOpti 会自动完成参数扫描——但我们最在意的,是回测结束之后发生的事。每一个结果都会依据上述三个信号进行评分:
- check_circle
低样本标记。交易笔数低于最低阈值的结果,会被明确标记为低置信度——无论原始数字看起来多么亮眼。
- check_circle
邻域稳定性。每个组合的评分都会反映其相邻参数值表现的一致程度。即使一个孤立尖峰的原始回报更高,它的得分也会低于一片稳固的区域。
- check_circle
按搜索规模折减。评分会根据本次运行测试了多少个组合进行调整。2,000 个组合中的最佳结果,要跨过比 50 个组合中的最佳结果更高的门槛,因为它多了四十倍靠运气取胜的机会。
- check_circle
如果没有任何结果能通过检验,我们就会直说。如果没有任何参数区域经受住这些检验,RunOpti 会直接告诉你:未找到可靠区域。我们认为,一个说不出“这次运行没有产生任何值得信任的结果”的工具,其实根本谈不上在衡量可信度。
最后这一项,是你当下最不喜欢看到的功能——但正因为有它,报告的其余部分才真正值得一读。
关于这些评分含义的说明。 RunOpti 的稳健性评分是单次运行内部的相对排名——它标示出被测试的组合中,哪些相对而言更值得信任。这并不是对未来表现的保证。无论过去的结果经过多么严谨的验证,都不能保证未来的回报。