遗传算法与暴力搜索在EA回测中的选型实战指南
遗传算法与暴力搜索在EA回测中的选型实战指南
上个月有个做澳美货币对的朋友半夜发消息给我,语气挺急的。他刚入手一套马丁格尔EA,在MT4策略测试器里用默认参数跑2019年至今的数据,回测结果漂亮得吓人,盈利因子2.8,最大回撤才6%。结果他往Exness的实时账户上一挂,三天就爆了仓。他问我是不是平台数据源有问题,我让他把回测报告里「建模质量」那一栏截图发过来,果不其然——显示的是「Every tick based on real ticks」旁边的「0.00%」。这家伙用了一整晚的暴力搜索,连个像样的tick数据都没喂进去。

这事其实特别典型。很多EA交易者以为回测就是「把参数丢进去,点一下开始」,然后盯着漂亮的权益曲线自我陶醉。但回测的本质是「用历史数据模拟未来」,你选的优化算法直接决定了这个模拟结果的可信度。今天我就把遗传算法和暴力搜索这两条路掰开揉碎讲清楚,顺便说说我在XM和Exness不同品种上踩过的坑。
暴力搜索:简单粗暴,但代价藏在细节里
暴力搜索(Brute Force)的逻辑很直白:你设定每个参数的取值范围和步长,程序把所有组合全部跑一遍。比如你优化移动平均线的周期,从5到50,步长5,那就是10个值;再叠加一个止损距离,从100到500,步长50,又是9个值。两两组合就是90次回测。听起来不多,但如果你的EA有四个参数,每个参数取10个值,那就是一万次回测。
我在测试一个双均线突破策略时干过这事,参数范围稍微放宽一点,总回测次数直接飙到六万多次。MT4策略测试器跑一次完整历史数据大约需要40秒,六万次就是28天。我当时用的是VPS上的四核处理器,连续跑了三天三夜,最后拿到结果的时候,我已经不想再看任何均线了。
暴力搜索的优势是结果完全可复现,每个参数组合都被真实测试过,不存在「漏网之鱼」。但它的致命伤在于计算成本呈指数级增长。而且有个隐藏陷阱:参数步长设得越细,越容易过拟合。我见过有人把步长设成1,优化出某个特定周期是27,而26和28的表现都很差——这种「尖峰型」参数组合,实盘基本就是灾难。
注意:如果你决定用暴力搜索,一定要先在「输入参数」面板里勾选「优化」选项,然后在「优化」标签页选择「全部数据」而不是「部分数据」。我见过不少人默认用了「部分数据」,结果只回测了最近三个月,样本量根本不够。
遗传算法:进化论式搜索,省时但有概率风险
遗传算法(Genetic Algorithm)的思路是模拟生物进化。它不会跑完所有组合,而是随机生成一批「染色体」(也就是参数组合),评估适应度(比如盈利因子),然后让表现好的组合「交配」产生下一代,加上一些随机变异,如此迭代多代。
这玩意儿省时间是真的。还是上面那个双均线策略,六万次暴力搜索要跑三天,遗传算法我设了种群大小50,迭代20代,总共才1000次回测,一个下午就出结果。但代价是:你永远无法保证找到的是全局最优解,可能只是局部最优。更麻烦的是,遗传算法的随机种子会影响最终结果——同样的参数范围,第一次跑出周期32,第二次跑出周期35,我都遇到过。
在MT4里用遗传算法,有个关键开关叫「优化方法」,默认为「遗传算法」。如果你用的是MT5,在策略测试器的「优化」标签页里,可以勾选「遗传算法」并设置「最大迭代次数」和「种群大小」。我建议种群大小不要低于30,迭代次数不要低于10,否则搜索空间太小,结果跟随机猜差不多。
我在XM的贵金属CFD品种上测试过一套黄金EA,用遗传算法优化时发现一个有意思的现象:默认参数下盈利因子只有0.8,但把「变异率」从0.1调整到0.05之后,盈利因子直接跳到1.5。原因是变异率太高导致后代频繁跳出优质区域,反而破坏了收敛。如果你发现遗传算法结果不稳定,先检查变异率,别急着换算法。
两种算法的实战选择:看品种,看参数维度
实操中我的选择逻辑是这样的:如果参数不超过3个,且每个参数的取值范围不大(比如步长5以内),直接暴力搜索,结果最可靠。如果参数超过4个,或者取值范围很大,就用遗传算法,但要做两轮验证——第一轮用遗传算法粗筛出几个候选区域,第二轮在这些区域附近用暴力搜索精确定位。
举个例子,我在Exness的裸点账户上优化一个趋势跟踪EA,涉及三个参数:ATR周期、均线偏移量、止损倍数。Exness的品种命名带后缀「.r」,比如EURUSD.r,合约规格和标准账户一样,点差模式是裸点。我用遗传算法粗筛,种群50,迭代15代,花了两个小时锁定了一个参数区域。然后在这个区域附近用暴力搜索,步长细化,再跑一个小时,最终得到的参数组合在2018年至今的回测里盈利因子2.1,最大回撤11%。这个结果比纯遗传算法的1.7和14%都要好。
但如果你做的是XM的股票CFD品种,比如Apple,就得注意合约参数的差异。XM的股票CFD点值计算和外汇不一样,最小交易量是0.1手,每手对应100股。这种品种波动特征完全不同,你用遗传算法优化出来的参数,很可能在另一个品种上水土不服。我建议每个品种单独跑一次优化,别偷懒直接套用。
回测数据里那些容易被忽略的坑
不管用哪种算法,回测数据本身的质量决定了结果的上限。MT4策略测试器默认用「每个tick基于真实tick」模式,但前提是你下载了完整的tick数据。很多人在Exness的MT4上没勾选「下载tick数据」,结果回测用的都是插值生成的模拟tick,这种数据跑出来的结果,在实盘上基本没法看。
另一个坑是「点差」设置。Exness的裸点账户点差很低,但回测时如果你用的是标准账户的点差数据,优化出来的EA在裸点账户上可能因为点差假设过高而过于保守,错失一些本可以盈利的入场机会。反过来,如果你用裸点账户的点差去回测,实盘换到标准账户,点差变宽,策略可能直接亏钱。
我在测试时发现,把点差设置从「当前」改成「自定义」,并输入一个略高于正常水平的数值(比如EURUSD设1.2点),优化出来的参数在实盘里表现更稳健。这算是一种「压力测试」思路,能过滤掉那些对点差极度敏感的脆弱参数。
历史数据里有一个比较典型的例子:某次欧洲央行决议前,欧元兑美元波动率骤降,ATR指标持续收窄,一套基于ATR突破的EA在回测里表现很好,但实盘遇到这种低波动环境,连续触发了十几个假突破,亏损不小。回测数据里这种「低波动期」其实不少,但如果你只优化最近几个月的数据,很容易忽略。
部署阶段的最后一道防线
优化完参数,别急着上实盘。先在VPS上跑一周的模拟盘(Demo),观察EA在实时行情下的表现是否和回测一致。我用的VPS是腾讯云的轻量服务器,2核2G配置,跑MT4加上一个EA绰绰有余。但如果你同时跑多个EA,或者用MT5回测,建议至少4核8G,否则CPU占用率一高,回测速度会明显下降。
我在部署时遇到过MT4提示「TradeContextBusy」的报错,排查了半天发现是VPS内存不足导致DLL调用失败。后来把虚拟内存从2G调到4G,问题就解决了。这种小问题在论坛里经常有人问,但真正引起重视的不多。
最后说一句:回测优化只是EA开发的一个环节,参数再漂亮,也替代不了实盘监控和动态调整。你在用遗传算法或者暴力搜索的时候,有没有遇到过参数优化结果和实盘表现差距特别大的情况?在评论区聊聊,我看看能不能帮你排查一下。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
