推进式测试:用策略从没见过的数据验证它

推进式测试(walk-forward testing)通过在一段窗口拟合、在下一段窗口测试来验证策略。因为测试窗口从没参与过调校,它能暴露过拟合。

MyTrade Academy 编辑部
7 分钟阅读

一个在某一整段历史上拟合得很漂亮的回测,换个地方可能到处失效。推进式测试是在真实资金介入之前抓住这一点的方法:在一段窗口拟合,在下一段测试,然后往前滚动重复。

因为每一段被测试的时期都从没参与过调校,结果比单一样本内拟合更有分量。

TL;DR

推进式测试在一个训练窗口拟合策略,在紧接着的样本外窗口测试,然后向前滚动重复。因为每个测试窗口从没用于调校,结果能暴露过拟合,也比单一样本内回测更有分量。

推进式测试怎么运作

历史被切成连续窗口。策略先在第一个训练窗口拟合,然后在它从没见过的下一个窗口测试。过程向前滚动:每一步都用最近的数据拟合,用接下来的一段测试。

结果是一系列样本外测试,而不是一个样本内数字,这让过拟合更难藏住。

样本内拟合和推进式测试的对比
维度单一内存拟合推进式测试
参数在哪里设定在完整测试历史上只在训练窗口
测试什么被调校过的同一份数据从没用过调校的窗口
过拟合暴露藏在拟合里被测试暴露
结果一个亮眼的数字一系列样本外结果

为什么它能暴露过拟合

拟合到噪声的策略,只在它被调校的那份数据上表现好。当推进式测试移到从没参与调校的窗口时,对噪声的拟合就停止工作了。

在样本外窗口里持续的表现,比一个样本内数字更强的证据,因为模式在策略从没见过的时期里存活了。

示例:单一样本内拟合 vs 推进式测试(3 个滚动窗口合计)
项目单一样本内拟合(50 笔,调校用的同一段历史)推进式测试(3 个窗口,合计 100 笔,全部样本外)
胜率60%(30 / 50 笔)44%(44 / 100 笔)
平均盈利350 元 / 笔350 元 / 笔
平均亏损200 元 / 笔200 元 / 笔
期望值+130 元 / 笔+42 元 / 笔

同一套参数,在被拟合过的那段历史上表现是 130 元一笔,挪到 3 个从没用来调校的窗口后,缩水到 42 元一笔。

样本内胜率60%(30/50)
样本内期望值+130 元 / 笔
样本外(推进式)胜率44%(44/100)
样本外期望值+42 元 / 笔
样本内的 130 元,样本外只剩 42 元

同一套参数在被调校过的那 50 笔历史上,期望值是 130 元一笔;挪到 3 个从没参与调校的窗口、合计 100 笔之后,只剩 42 元一笔。这段缩水,正是推进式测试要暴露的东西:如果优势是真实的,它不会在没见过的数据里掉这么多。

重要的选择

窗口大小和测试向前滚多远都是选择,它们会影响结果。短的训练窗口拟合的数据少;长的窗口可能以另一种方式过拟合。

纪律是在运行之前定好流程:窗口长度、步长和步数都提前设定,而不是对着结果调。

测试窗口绝不能碰到调校

推进式测试的全部价值,来自测试窗口是策略没有被拟合过的数据。如果流程让测试时期漏进调校,那只是一个更复杂的样本内拟合。

它的局限

推进式测试不是保证。每个样本外窗口仍然来自同一段市场历史,没有任何流程能证明策略未来会有效。

最好把它和其他过拟合检查一起用:参数数量、正当性、子周期一致性和日期敏感性。

常见问题

推进式测试和留出期是一回事吗?

不是。留出期是一个固定的样本外时期;推进式测试在多个连续窗口上重复拟合与测试的循环。

通过推进式测试能证明策略有效吗?

不能。它比样本内拟合更强的证据,但不能保证未来表现。

应该用多少个窗口?

没有通用数字。流程应该提前定好,并产出足够多的样本外结果来看到模式。

在策略从没见过的时期上验证

第 44 课解释过拟合、参数风险,以及独立时期验证怎么暴露对噪声的拟合。

打开第 44 课