一个在某一整段历史上拟合得很漂亮的回测,换个地方可能到处失效。推进式测试是在真实资金介入之前抓住这一点的方法:在一段窗口拟合,在下一段测试,然后往前滚动重复。
因为每一段被测试的时期都从没参与过调校,结果比单一样本内拟合更有分量。
推进式测试在一个训练窗口拟合策略,在紧接着的样本外窗口测试,然后向前滚动重复。因为每个测试窗口从没用于调校,结果能暴露过拟合,也比单一样本内回测更有分量。
推进式测试怎么运作
历史被切成连续窗口。策略先在第一个训练窗口拟合,然后在它从没见过的下一个窗口测试。过程向前滚动:每一步都用最近的数据拟合,用接下来的一段测试。
结果是一系列样本外测试,而不是一个样本内数字,这让过拟合更难藏住。
| 维度 | 单一内存拟合 | 推进式测试 |
|---|---|---|
| 参数在哪里设定 | 在完整测试历史上 | 只在训练窗口 |
| 测试什么 | 被调校过的同一份数据 | 从没用过调校的窗口 |
| 过拟合暴露 | 藏在拟合里 | 被测试暴露 |
| 结果 | 一个亮眼的数字 | 一系列样本外结果 |
为什么它能暴露过拟合
拟合到噪声的策略,只在它被调校的那份数据上表现好。当推进式测试移到从没参与调校的窗口时,对噪声的拟合就停止工作了。
在样本外窗口里持续的表现,比一个样本内数字更强的证据,因为模式在策略从没见过的时期里存活了。
| 项目 | 单一样本内拟合(50 笔,调校用的同一段历史) | 推进式测试(3 个窗口,合计 100 笔,全部样本外) |
|---|---|---|
| 胜率 | 60%(30 / 50 笔) | 44%(44 / 100 笔) |
| 平均盈利 | 350 元 / 笔 | 350 元 / 笔 |
| 平均亏损 | 200 元 / 笔 | 200 元 / 笔 |
| 期望值 | +130 元 / 笔 | +42 元 / 笔 |
同一套参数,在被拟合过的那段历史上表现是 130 元一笔,挪到 3 个从没用来调校的窗口后,缩水到 42 元一笔。
同一套参数在被调校过的那 50 笔历史上,期望值是 130 元一笔;挪到 3 个从没参与调校的窗口、合计 100 笔之后,只剩 42 元一笔。这段缩水,正是推进式测试要暴露的东西:如果优势是真实的,它不会在没见过的数据里掉这么多。
重要的选择
窗口大小和测试向前滚多远都是选择,它们会影响结果。短的训练窗口拟合的数据少;长的窗口可能以另一种方式过拟合。
纪律是在运行之前定好流程:窗口长度、步长和步数都提前设定,而不是对着结果调。
推进式测试的全部价值,来自测试窗口是策略没有被拟合过的数据。如果流程让测试时期漏进调校,那只是一个更复杂的样本内拟合。
它的局限
推进式测试不是保证。每个样本外窗口仍然来自同一段市场历史,没有任何流程能证明策略未来会有效。
最好把它和其他过拟合检查一起用:参数数量、正当性、子周期一致性和日期敏感性。
常见问题
推进式测试和留出期是一回事吗?
不是。留出期是一个固定的样本外时期;推进式测试在多个连续窗口上重复拟合与测试的循环。
通过推进式测试能证明策略有效吗?
不能。它比样本内拟合更强的证据,但不能保证未来表现。
应该用多少个窗口?
没有通用数字。流程应该提前定好,并产出足够多的样本外结果来看到模式。


