Summary: 基于遗传算法的EA参数优化深度实践。涵盖适应度函数设计、收敛监控、帕累托效率以及MQL5实际代码实现。




参数优化是EA开发中最危险的环节——对历史数据的过拟合会摧毁未来表现。遗传算法(GA)提供概率性搜索,但使用不当会放大过拟合。本文聚焦于MT4/MT5中稳健的GA设计。

1. EA优化的GA核心组件
GA在参数集(染色体)群体上运行。标准流程:
  • 在定义范围内随机初始化种群

  • 计算适应度(例如:利润因子、夏普比率或自定义评分)

  • 选择:锦标赛法或轮盘赌法

  • 交叉:混合两个父代的参数

  • 变异:小幅随机扰动以维持多样性

  • 重复直到收敛或达到最大代数


  • 2. 适应度函数设计——避免单一指标
    仅使用净利润会导致曲线拟合。应组合多个目标:
    ```
    Fitness = w1 * 利润因子 + w2 * (平均每笔交易 / 最大回撤) - w3 * 交易次数
    ```
    更好的选择:使用夏普比率或卡玛比率。MQL5中的适应度计算示例:
    ```cpp
    double CalculateFitness(double profitFactor, double sharpeRatio, double maxDrawdownPct) {
    if(maxDrawdownPct <= 0) return 0;
    double score = profitFactor * 0.4 + sharpeRatio * 0.4 - (maxDrawdownPct / 100.0) * 0.2;
    return MathMax(0, score);
    }
    ```
    绝不要仅基于总净利润进行优化。

    3. 变异与交叉公式
    对于连续参数(例如止损=20-200点):
  • 均匀交叉:childParam = alpha * parent1 + (1-alpha) * parent2, alpha ∈ [0,1]

  • 高斯变异:newValue = oldValue + N(0, sigma),sigma随代数递减

  • sigma衰减:`sigma(t) = sigma_initial * exp(-t / tau)`,tau为衰减常数(例如20代)

    MQL5代码片段:
    ```cpp
    double Mutate(double value, double minVal, double maxVal, double sigma) {
    double mutation = MathRandNormal(0, sigma);
    double newVal = value + mutation;
    if(newVal < minVal) newVal = minVal + (minVal - newVal);
    if(newVal > maxVal) newVal = maxVal - (newVal - maxVal);
    return MathMax(minVal, MathMin(maxVal, newVal));
    }
    ```
    `MathRandNormal`需要实现Box-Muller变换。

    4. 避免过拟合——前进式验证
    GA必须在样本外进行验证。标准协议:
  • 数据划分:70%样本内(IS),30%样本外(OOS)

  • 仅在IS周期上运行GA

  • 将最佳5-10组参数在OOS上测试

  • 仅当OOS表现 ≥ IS表现的80%时接受


  • 稳健性评分公式:
    ```
    Robustness = min(1.0, OOS_利润因子 / IS_利润因子) * (1 - OOS_回撤增幅)
    ```
    接受稳健性 > 0.7。

    5. 多目标帕累托优化
    单一适应度评分会掩盖目标间的权衡。帕累托前沿包含这样的参数集:无法在不损害其他目标的前提下改进任一目标。常见目标:利润、夏普比率、最大回撤、交易次数。

    在MQL5中实现非支配排序:
    ```cpp
    bool IsDominated(double obj1[], double obj2[]) {
    bool betterInAny = false;
    for(int i = 0; i < ArraySize(obj1); i++) {
    if(obj1[i] > obj2[i]) return false; // 假设最大化目标
    if(obj1[i] < obj2[i]) betterInAny = true;
    }
    return betterInAny;
    }
    ```
    导出帕累托边界集,而不仅仅是单个“最佳”参数。

    6. MT4与MT5的GA能力对比
    MT5策略测试器内置原生GA优化,可配置种群大小、交叉概率(0.7-0.9)和变异率(0.01-0.1)。MT4需要外部GA封装(例如通过DLL或将参数导出到Python)。MT4用户推荐工作流:导出分笔数据,通过Python的`DEAP`库优化,然后导入最佳参数。

    参考来源
  • MQL5文档:“策略测试器中的遗传算法”(www.mql5.com/zh/docs/tester/ga)

  • 《算法交易:制胜策略及其原理》Ernie Chan著,第6章——过拟合与前进式验证。