EA回测参数优化实战:遗传算法与暴力搜索的适用场景对比(0919)
EA回测参数优化实战:遗传算法与暴力搜索的适用场景对比(0919)
上周三凌晨一点,老陈给我发了张截图。MT5 策略测试器的优化结果页面上,同一个 EA 在 EURUSD H1 上跑出来的最优参数组,盈利因子 1.82,最大回撤 11.3%。他问我:这组参数是不是可以直接上实盘了?我问他优化用了什么方法。他说遗传算法,跑了大概四十分钟。我说你把暴力搜索也跑一遍看看。

第二天他告诉我,暴力搜索跑出来的最优组盈利因子只有 1.41,最大回撤 18.7%。更关键的是,两组参数的核心区间完全不同。遗传算法选出来的止损是 35 点,暴力搜索选出来的是 62 点。差了将近一倍。这就是参数优化里最容易被忽略的问题——你用的搜索方法,本身就在塑造你看到的"最优解"。
遗传算法到底在做什么
遗传算法的逻辑不复杂。它把每一组参数编码成一条"染色体",初始随机生成一批个体,然后通过适应度函数筛选、交叉、变异,逐代进化。MT5 的策略测试器内置了这个功能,你只需要在优化模式下勾选"遗传算法",设置好种群规模和进化代数。
它的优势在于搜索效率。假设你有 6 个参数,每个参数 20 个候选值,暴力搜索需要遍历 20^6 = 6400 万种组合。遗传算法通常几千到几万次评估就能收敛到一个不错的区域。对于参数维度高、单次回测耗时长的策略,这是唯一可行的方案。
但代价是什么?遗传算法本质上是在做"局部最优的快速逼近"。它倾向于沿着适应度梯度爬坡,容易陷入局部极值。更麻烦的是,它的结果对随机种子敏感。同样的参数空间,换一个随机种子,可能收敛到完全不同的区域。我在测试一个基于布林带突破的 EA 时发现,连续跑五次遗传算法优化,五次的最优参数组分布在三个不同的区间。盈利因子从 1.2 到 1.9 都有。
注意:MT5 遗传算法的默认种群是 64,代数 30。如果你的参数超过 8 个,这个配置大概率不够。把种群提到 128 以上,代数 50 以上,但要做好跑几个小时的准备。
暴力搜索的笨功夫
暴力搜索就是穷举。所有参数组合一个一个跑,不遗漏任何一个角落。它的结果是确定的——同样的参数空间,跑一百次结果都一样。没有随机性,没有收敛问题。
问题在于计算量。MT5 的策略测试器支持多线程,但即便如此,一个中等复杂度的 EA 在 H1 周期上跑一年数据,单次回测大约 2-5 秒。如果你有 10 万个组合要跑,即使 8 线程并行,也要七八个小时。参数再多一点,就是几天几夜。
所以暴力搜索的适用场景很明确:参数数量少(通常不超过 4 个),每个参数的候选值也少(步长可以放粗),而且你有时间等。比如一个简单的均线交叉 EA,只有快线周期、慢线周期、止损三个参数,快线从 5 到 30 步长 5,慢线从 20 到 100 步长 10,止损从 20 到 100 步长 10。总共 6 × 9 × 9 = 486 种组合。半小时内跑完,结果一目了然。
这里有个细节:暴力搜索的步长选择本身就是一种过滤。步长太细,计算量爆炸;步长太粗,可能跳过真正的最优值。我的习惯是先用粗步长跑一轮,找到大致区域,再在区域内用细步长跑第二轮。这叫"由粗到细",比一次性细步长暴力搜索节省 80% 以上的时间。
什么情况下该用哪个
把这两种方法放在一起对比,决策逻辑其实很清晰:
- 参数维度 ≤ 4,候选值总数 < 5000:直接用暴力搜索。结果确定,心里踏实。
- 参数维度 5-8,候选值总数在几万到几十万:先用遗传算法定位区域,再用暴力搜索在区域内精搜。这是最实用的组合拳。
- 参数维度 > 8,或者单次回测超过 10 秒:只能靠遗传算法。但必须做多次运行,取交集而非并集。
老陈那个案例的问题就出在这里。他的 EA 有 7 个参数,直接上了遗传算法,跑了一次就当真了。后来我让他用遗传算法跑十次,把十次结果里反复出现的参数区间圈出来,再在这个区间里做暴力搜索。最终找到一组参数,盈利因子 1.67,最大回撤 13.1%。不是最高的,但胜在稳定——在样本外测试中,这组参数的表现衰减最小。
说到样本外测试,这是另一个容易被跳过的一步。不管你用什么方法优化,最终选出的参数必须在一段没有参与优化的数据上验证。我通常把历史数据按 7:3 切分,前 70% 用来优化,后 30% 用来验证。如果样本外盈利因子比样本内下降超过 30%,这组参数大概率是过拟合了。
一个容易被忽略的参数:点差和滑点
回测结果和实盘的差距,很多时候不是参数优化方法的问题,而是回测环境的设定问题。MT5 策略测试器里有一个"点差"设置,默认是"当前点差"。但历史点差是波动的,你在优化时用固定点差,实盘遇到点差扩大,结果就会偏离。
我的做法是在优化阶段就把点差设为一个偏保守的固定值,比如 EURUSD 设 15 个点(1.5 个标准点),黄金设 30 个点。滑点也加上,通常设 2-3 个点。这样优化出来的参数在实盘中更抗造。老陈后来把点差从默认的 8 调到 15,重新跑了一遍优化,最优参数的盈利因子从 1.67 降到了 1.52,但这组参数在实盘跑了三个月,盈利因子是 1.48。偏差很小。
注意:不同经纪商的品种命名和合约参数不一样。比如 XM 的黄金代码是 GOLD,Exness 是 XAUUSDm,点值计算方式也有差异。优化之前先确认你回测用的品种和实盘一致,否则参数再好也是白搭。
如果你在优化时发现遗传算法跑出来的结果每次都不一样,别急着换方法。先检查你的适应度函数是不是只用了盈利因子。把最大回撤、交易次数、盈亏比一起纳入适应度评分,遗传算法的收敛会稳定很多。我常用的权重是:盈利因子 40%,最大回撤 30%,交易次数 20%,盈亏比 10%。这个配比不一定适合所有人,但比单看盈利因子靠谱得多。
核心建议就一句:先用遗传算法缩小范围,再用暴力搜索确认结果,最后用样本外数据验证——别让任何一种方法单独替你做出决定。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
