试得越多越容易碰巧成功
把同一份历史数据反复切分、换参数、换指标,总能找到一组结果看起来不错。这件事本身不是运气问题,而是统计上的必然:试验次数一多,随机噪声里总会出现一段像信号的形状。真正需要判断的是,那个结果到底来自数据中的稳定结构,还是来自你试了很多次。
先搞清楚问题的来源
每一次回测都是一次统计检验。检验次数增加,至少出现一次「显著」结果的概率就会上升。假设单次检验出现假阳性的概率是 5%,独立做 20 次,至少一次假阳性的概率会接近三分之二。这不是理论推导的边角料,而是日常操作里最常见的坑。
麻烦在于,大多数试错是没有被记录下来的。你改了入场条件、改了持有周期、删掉几笔极端值、又换了评价指标,这些动作散落在几天里,最后只留下那个最好看的版本。到这一步,你手上的结果已经无法用单次检验的标准去解读。
- 判断标准一:这个参数组合是事先想好的,还是看过结果之后调出来的?
- 判断标准二:同一份数据上,你总共试过多少个版本?
- 判断标准三:如果把评价指标换成一个你没优化过的指标,结论还成立吗?
这三个问题里,只要有一个答不上来,结论就要打折扣。
把试错次数记下来
最实用的做法是维护一份试验日志。每跑一次回测,记录时间、改动的变量、评价指标值。不需要很复杂,一张表就够。比如有一份数据,你先试了 5 个均线周期,又试了 4 个止损阈值,再试了 3 种仓位规则,那么你已经做了远超 1 次的检验,最终的显著性要按这个规模去折算。
日志的另一个作用是逼自己区分「假设驱动」和「结果驱动」。假设驱动的试验是先有理由再跑;结果驱动是先看到好看的数再补理由。后者占的比例越高,结论越不可信。
用样本外数据做一次干净检验
参数在样本内调好之后,留出一段完全没有参与调整的数据,只跑一次,不看过程只看结果。这次检验的价值在于它是单次的,没有反复修正的机会。
- 切分时按时间顺序切,不要随机打乱,否则会引入未来信息。
- 样本外数据要足够长,能覆盖不同的市场状态,而不是同一种行情的重复。
- 只允许看一次。如果结果不好又回头改参数,这段数据就作废了,需要再留一段新的。
- 如果数据总量不够,宁可不做样本外,也不要一边看一边调。
反复使用同一段样本外数据,实质上就是把它变成了样本内数据,这是最常见的自我欺骗方式。
检查结果对参数的敏感度
一个真实存在的结构,通常在参数小幅变动时表现是连续的。把均线周期从 20 改成 21、22,结果忽然从很好变到很差,说明这个「好」大概率是噪声的特定排列。
具体做法是围绕最优点画一张参数网格,观察指标随参数变化的曲面。理想情况是一个平缓的台地,而不是一根孤立的尖峰。尖峰越陡,越要怀疑。
同时看效应量,而不只是看是否显著。两个版本的差异如果只有零点几个百分点,即便统计上显著,也可能被交易成本和滑点吃掉。判断时要问:这个差异在扣除实际摩擦之后还剩多少。
一个可执行的流程
- 先写清楚要检验的假设,再去跑数据。
- 每跑一次都记入日志,累计次数。
- 用假设数量对显著性阈值做折减,试得越多,门槛越高。
- 保留一段从未看过的数据,只在最后用一次。
- 检查参数曲面是否平缓,以及效应量是否大于摩擦成本。
- 结论只写成「在某个范围内表现较好」,不写成「这个参数最优」。
这套流程不会让结果变得更好看,它的作用是让你知道自己在多大程度上可能只是碰巧撞上了一个数字。能接受这个不确定性,才有资格谈下一步的验证。
相关文章
动手前先建个基准线
这篇讲怎么在开始优化数据流程之前,先建立一个可比较的基准线。内容包括选指标、定口径、留出对照样本,以及基准线失效时怎么判断,让后续每次改动都有据可查。
回测里的幸存者偏差怎么避免
回测中最隐蔽的误差往往来自数据本身。这篇讲清楚幸存者偏差是怎么混进样本的,给出检查数据集、重建历史成分、设定对照组的可操作方法,尽量在动手之前就把这类误差挡在外面。
训练集和验证集该怎么分
数据集划分没有万能比例,关键看样本量、时间结构和类别分布。本文给出随机划分、分层抽样与按时间切分的判断标准,并说明验证集该留多大、如何避免信息泄露。