IS/OOS分割不够|Walk-Forward窗口设计
结论:OOS只有一个区间,就仍然只是“一次考试”
把数据分成优化用(IS)和验证用(OOS),是怀疑过度优化时行之有效的第一步。但如果只分割一次,OOS的结果只能告诉你“在那一个区间表现如何”。
我们的结论如下:把OOS拆成多个窗口,一边向前推进一边验证,看的不是合计,而是每个窗口是否盈利。即使合计为正,如果利润集中在个别窗口,评价也要先搁置。
固定分割的弱点
分割点会左右结果
固定分割时,在哪里切开由开发者决定。如果OOS恰好落在趋势明显的时期,策略看起来会比真实实力更好;反之,如果落在相反的时期,就可能把本来可用的逻辑丢掉。两种情况下,结果都依赖于“分割点”这一个选择。
反复查看OOS,OOS就不再是OOS
另一个问题出在开发者的行为上:OOS成绩不好就调整参数,然后再看一次OOS。重复下去,等于是在挑选适合OOS的参数。形式上是未使用的数据,实质上已经被用于优化。这是我们自己也可能犯的错误,不靠流程约束就无法避免。
Walk-Forward窗口的构建方法
Walk-Forward把“优化期间”和紧随其后的“验证期间”作为一组窗口,沿时间轴向前平移并重复。验证区间始终在优化区间的未来,因此可以得到多个OOS。
| 方式 | 窗口移动方式 | 适用场景 | 弱点 |
|---|---|---|---|
| 固定分割 | 只切一次 | 最初的粗略确认 | 对分割点的依赖很大 |
| 滚动型 | 保持优化期间长度不变向前推进 | 行情性质容易变化的品种 | 丢弃了较早阶段的信息 |
| 锚定型 | 固定起点,逐步延长优化期间 | 交易笔数较少的逻辑 | 旧数据的影响会一直保留 |
决定窗口长度的标准
窗口长度按交易笔数来定,比按日历年数更稳妥。验证区间内的交易太少,盈亏就只是偶然决定的。持仓时间长、交易频率低的逻辑,验证区间需要取得更长。
逐窗口确认的步骤
- 让各窗口的验证区间互不重叠地排列
- 在每个窗口内优化,并把得到的参数只应用于紧随其后的验证区间
- 按验证区间分别记录盈亏、PF、交易笔数和最大drawdown
- 确认PF在1.0以上的窗口有多少,亏损窗口出现在哪些时期
- 确认去掉利润最大的窗口后,其余部分合计是否仍然盈利
- 查看各窗口选出的参数是否大幅跳动
检查要点有三个:
- 盈利窗口是否集中在一部分
- 亏损窗口的损失相对盈利窗口的利润是否过大
- 相邻窗口的最优参数是否发生了极端变化
我们认为并不要求所有窗口都盈利。趋势跟随型逻辑在没有方向感的时期亏损是正常的。真正需要当作问题的,是亏损窗口的原因无法解释,以及亏损深度超出预期。
局限与注意事项
交易笔数不足,窗口就无法成立
ATLAS的回测在7.5年验证期内有1193笔交易,即使拆成多个窗口,每个窗口也能保留一定数量的交易。而ETHEREUM EA的回测在7.5年验证期内只有154笔交易。把这类低频逻辑切成细小的窗口,每个窗口的交易会非常少,以窗口为单位的盈亏几乎没有参考价值。只能把窗口划得更粗,或者把逐窗口评价仅作为参考。
公开的数值是全期间的值
实测排行榜中列出的PF和胜率,是贯穿整个验证期间的数值,并非逐窗口的成绩,因此仅凭这些无法判断是否存在过度优化。阅读时请对此打个折扣。
窗口设计本身也可能被优化
如果改变窗口的长度或数量,再挑选看起来结果更好的组合,这同样是过度优化。窗口设计必须在运行验证之前确定,之后不能再改动。这是前提,但从外部几乎无法确认这一前提是否被遵守。
即便如此,也无法预知未来
即使通过了Walk-Forward,也无法应对过去不曾出现过的行情。在我们运营的模拟账户前向测试中,也有多个EA的盈亏为负。这是模拟账户而非实盘成绩,且开始至今的时间还短,无论好结果还是坏结果,都还不到下结论的阶段。验证方法是减少失误的工具,并不承诺一定命中。
总结
- 固定的IS/OOS分割,结果会受分割点和OOS复查次数左右
- Walk-Forward是建立多个验证区间、边向前推进边确认的方法
- 要看的不是合计,而是逐窗口的盈亏,并确认利润是否偏集中以及参数是否稳定
- 交易笔数少的逻辑,窗口分得越细,判断越不稳定
- 窗口设计要事先固定。即使通过,也无法预知未来的成绩
关于验证的思路,我们也整理在知识库中。
相关文章
📧 MQL5 Market 版涨价前通知 + 5天邮件课程(免费)
在本站,只要拥有合作经纪商的真实账户,EA 即可免费使用。MQL5 Market 上销售的版本目前为首发价,会随销量分阶段涨价。除涨价前通知外,每天还会发送一封邮件,介绍外汇自动交易的本质、回测的正确解读方法和经纪商选择技巧。
※ 严格保护隐私。可随时取消订阅。