分类
绩效
难度
高级
适用场景
回测策略设计MT5 操作

前推分析

前推分析是一种验证方法:先在一段历史窗口上重新优化参数,把这套设置原封不动地拿到紧随其后的窗口上交易,然后让两个窗口一起向前滑动、反复重来——最后只引用那些未被动过的区段。

亦称:WFA, 前推优化, WFO, 滚动样本外测试

更新于 · 审阅于 · 由 mt5depot research desk 审核

一句话讲清

在一段历史上把规则调好,再原封不动地拿到紧随其后的那一段上去交易,然后把两段一起往前挪,重来一次。只有那些未被动过的区段,才算进你对外引用的那个数字里。

为什么重要

一次样本外检验只把一个问题问过一遍。前推分析在每一步都重新问一次,而这是唯一能看出一份优势是否经得起反复重新拟合、还是只侥幸熬过了一次的办法。它同时也预演了实际部署的人真正会做的事:从最近的历史里挑参数,再把它们送进一段谁都没见过的未来。

  • 它评的是流程,不是某一组设置。“照这个方式重新拟合,然后交易”才是你真正会做的事,所以值得验证的正是这件事。
  • 它交回的是一串样本外结果,而不是一个数字,所以单独一个好看的季度没法自己把结论扛起来。
  • 它会把那些安不下来的参数暴露出来。当每一次重新拟合都落到新的位置,规则跟着的就是样本,而不是市场。
  • 单一预留区间会把行情状态的问题藏起来。我们记录在案的八次搜索里,有两次通过了搜索之后的那个窗口,却在搜索之前的那个窗口上失败。

用它验证策略

用在哪里

  • 验证一个你确实打算按固定周期重新拟合参数的策略。
  • 选择重新优化的间隔——一套参数在需要刷新之前还能用多久。
  • 把一份能熬过好几种行情状态的优势,和一份只在被调参的那个窗口里存在过的优势区分开。
  • 当历史太短、拿不出一整块大的预留区间时,仍然建立起一份站得住的样本外记录。

可靠的结果长什么样

  • 只有样本外区段首尾相接组成对外公布的数字,样本内的数字摆在旁边,而不是混进去。
  • 训练长度、测试长度和步长在第一次运行之前就定死了,而且这三个数一路跟着结果走。
  • 文字里引用的是样本外效率——样本外表现占样本内表现的比例——而不只是盈利。
  • 每一步都列出了它选中的参数,读者因此能判断这些参数漂得有多远。
  • 试过多少种前推配置这件事写在某个地方,因为试得多本身就是一种拟合。

警示信号

  • 一个合并后的数字,样本内和样本外这两半之间没有任何拆分。
  • 看上去被调过的窗口长度:一个没人解释的、古怪的训练与测试比例。
  • 每次重新拟合都跳一次的参数,这意味着每一次拟合追的都是上一个窗口的噪声。
  • 接近或高于 100 % 的效率,它指向窗口之间存在泄漏的概率,远高于指向一个格外稳健的策略。
  • 锚定式和滚动式两种做法被混着引用,因为不断增长的窗口和固定长度的窗口回答的是不同的问题。

回测与实盘的差异

  • 前推分析拉近了一部分与实盘结果之间的距离,因为被检验的流程就是被部署的流程。
  • 它完全没碰执行风险。滑点、点差扩大和延迟都落在这项工作之外。
  • 它造不出历史里不曾有过的行情状态,所以一个在平静的十年里熬过二十次重新拟合的策略,面对承压的行情依然是未经检验的。
  • 预期实盘结果贴近样本外那一串,而不是样本内那一个。样本内的数字用来诊断这次搜索;它们预测不了任何东西。

推荐的验证方法

  1. 1MetaTrader 5 没有内置的滚动式前推。策略测试器(Strategy Tester)Settings 标签页上的 Forward 字段只把区间切一次——1/2、1/3、1/4 或一个自定义日期——并在单独的 Forward Results 标签页里给出存活运行在尾段上的成绩。跑一次,只买到一步。
  2. 2这一串要靠手工搭起来:每一步重跑一次优化,每次把日期区间按步长往前挪,并保留每一次的 Forward 行。二十个区段就是二十次运行,所以在开始之前先把步数定下来。
  3. 3在看到参数网格之前先选好优化标准,因为它决定了 MT5 在每一步把哪一次运行叫作胜者。当没有任何内置标准符合你判断一次运行的方式时,Custom max 会把这个决定交给 OnTester()。
  4. 4MT5 总是把 Forward 切片从区间的末端切下来,所以紧挨训练期之前的那个窗口永远不会被检验。那一个要你自己去跑:在我们自己这套记录上,它抓出了两个已经被 Forward 检验放行的设计。
  5. 5把胜出的参数一步一步记下来。Forward Results 标签页交给你的是一次运行结果,永远不是这些设置在各步之间走过的轨迹——而那条轨迹才是真正的发现。
  6. 6把整件事当成一次实验。换一组新的窗口长度反复重跑直到通过,只是把过拟合往上挪了一层,而不是把它去掉。

示例

取自我们自己记录在案的工作中的一步:EXP-PARAM-SEARCH-OUTCOMES-001 里的八次参数搜索。ichimoku 模板在 H1 上搜了一个 12 组合的网格,留下样本内最好的那一次运行,然后迎面撞上两个这次搜索从未碰过的窗口。

搜索过的网格
12 种组合
SL 30-80 x TP 60-250, H1
样本内盈利因子
1.37
搜索之后的窗口
0.89
搜索之前的窗口
0.80
记录在案的搜索 / 采用的搜索
8 / 0

65 % 落在大多数文字都会称之为扎实的那个区间里。同一组设置在两个未见过的窗口上照样亏钱,正因如此,一步只能读成一个数据点,永远不能读成判决。

计算 0.89 除以 1.37 = 这一步上 65 % 的效率;0.80 除以 1.37 = 更早那个窗口上的 58 %

结果 65 % 的效率——落在一组我们拒绝发布的设置上

怎么读这个数字

先读样本外那一串,再读比例,最后读参数的稳定性。对外公布的盈利是这三者里信息量最小的一个。

区间 含义
大约低于 40 % 这次搜索主要拟合的是它自己的那个窗口。可能还剩下一点小优势,但不是被宣传的那一份。
大约 40-60 % 一旦有几个参数发生移动,这就是很平常的水平。按样本外那个数字去做规划,而不是样本内那个。
单独一步高于 60 % 令人鼓舞,但不是判决。我们那一步的 65 % 在它没见过的两个窗口上照样亏钱。
大多数步都高于 60 %,且参数稳定 强。这些重新拟合一直有效,而且它们对设置的看法彼此一致。
接近或高于 100 % 怀疑窗口之间存在泄漏、存在前视,或者区段少到撑不起任何含义。
  • 数一数区段。四个区段是个轶事;二十个才是一个分布。
  • 把各步选中的参数画成图。一个到处游走的最优点,是在告诉你它是噪声。
  • 永远不要把样本内和样本外的资金曲线揉成一条:那条曲线一半是考卷,一半是答案。
  • 训练期之前的那个窗口也要测。我们八次搜索里有两次向前通过、向后失败。

mt5depot 会在每一次运行背后写明数据窗口、测试器模型和成交笔数,所以这里任何一项样本外主张,都可以对照产出它的那个样本去核对。

常见误区

把 MT5 的一次 Forward 运行叫作前推分析

Forward 字段只把区间切一次,然后报告尾段。那是一次锚定式的单一预留检验,只不过标签页整洁一些,而且它只把问题问过一遍。前推分析需要这道切口移动起来,在 MT5 里这意味着由你自己驱动这个循环:每一步跑一次优化,再把各次的 Forward 行收集成一串。

把前推配置本身也拿去调

搜索好几种训练长度和测试长度,然后发布得分最高的那一对,只是把过拟合搬高了一层。窗口长度同样是参数,所以要先选定、写下来,然后再跑。

把一个高的样本外数字直接读成好

我们的 macd_signal 搜索在搜索之后的窗口上达到 1.14-1.15,在搜索之前的窗口上是 0.74-0.77。高样本外数字可能意味着泄漏,可能意味着一段有利的行情,也可能意味着区段太少——先去查清楚,再去庆祝。

以为前推分析能证明策略对未见过的状况稳健

它检验的永远只是历史里包含过的状况。在同一种行情状态里做二十次重新拟合,得到的是这种状态下的二十个结果,对下一种状态什么都没说。

深入说明

常见问题

在 MetaTrader 5 里怎么做前推分析?
MT5 给你的是零件,不是那个循环。在策略测试器(Strategy Tester)的 Settings 标签页上把 Forward 设为 1/2、1/3 或 1/4:测试器会在日期区间的前段做优化,并在尾段上给存活下来的运行打分,结果列在它自己的 Forward Results 标签页里。这就是一步。要得到一串,就把整个日期区间按步长往前挪,每个区段重跑一次优化,每次都记下 Forward 行和胜出的参数。二十个区段就意味着二十次运行。
样本内和样本外的窗口长度该取多少?
长到训练窗口里装得下不止一种行情状态,测试窗口里装得下足以说明问题的成交笔数。测试器内置的 1/2、1/3 和 1/4 是合理的起点,而当步长很小时,一个自定义的 Forward 日期能给出更短的测试切片。规矩比数字更重要:在第一次运行之前就把比例选好,因为试好几种再发布最好的那一种,重复的正是前推分析本来要抓的那个错误。
前推分析能消除过拟合吗?
不能。它把过拟合挪了个位置,并让它显形。重新拟合依然发生在每一个训练窗口内部,所以这个方法量的是这份拟合有多少能在撞上下一个窗口之后活下来,而不是阻止它发生。我们自己记录在案的八次搜索跑了 116 组参数组合,一组也没有采用:其中两次通过了搜索之后的窗口,却在搜索之前的窗口上失败,而这正是单一预留检验会藏起来的那种形态。
样本外效率多少算好?
一旦有几个参数发生移动,大约 40-60 % 就是平常水平;而在大多数步上都高于 60 %、同时参数保持稳定,才算得上强。任何单独一步都要带着怀疑去读:我们拟合得最好的那次搜索在某一步上读出 65 %,它选中的设置在两个没见过的窗口上照样亏钱。接近或高于 100 % 的数字,更常见的信号是训练窗口与测试窗口之间存在泄漏,而不是一个格外稳健的策略。
该由哪一个优化标准来给运行结果排名?
在参数网格出现之前就决定,因为这个标准——在更广的文献里叫目标函数——会在每一步挑出胜出的那一次运行。以余额为准的排名奖励的是承担风险最多的那一次,以回撤为准的排名奖励的是交易最少的那一次,而当两者都不合适时,Custom max 会把这个决定交给你自己的 OnTester()。在我们记录在案的搜索里,测试器的排名从来没有独自定下过任何事:每一次存活下来的运行,之后都得在三个窗口上把盈利因子保持在 1.0 以上,而八次里没有一次做到。
前推分析和一次样本外检验有什么不同?
单次检验预留一块数据,把最终参数对着它检查一遍。前推分析沿着整段历史反复走“调参—检验”这个循环,因此它交回的是一串样本外结果,并且检验的是重新拟合这个流程本身——那正是实际部署的人月复一月真正在做的事。