大气云模型优化(ACMO):实战·综合运用
🌧️

大气云模型优化(ACMO):实战·综合运用

(3/3)·从水滴分布到全局解更新,用实测数据看元启发式在测试函数上的真实表现

含代码示例实战向 第 3/3 篇
很多交易者把优化算法当黑箱,调参只看最终曲线,却忽略降雨机制里信息交换薄弱会导致早熟收敛。ACMO 的云层移动若不分区域湿度权重,种群容易卡在局部洼地。这篇收尾实战把水滴随机放置和降雨过程拆开跑,避免你重蹈覆辙。

水滴间信息传递让收敛分数跳涨

先跑原版大气云模型(ACMO)做基准:5/25/500 维 Hilly 函数得分 0.602 / 0.343 / 0.253,Forest 为 0.478 / 0.261 / 0.173,Megacity 为 0.351 / 0.162 / 0.096,总分 2.718(30.20%)。作者判断收敛性差,核心原因是水滴(解)之间缺少直接交互,没有把较优解的湿度信息传给较差解。 改成 ACMOm 后,逻辑上加了一条:以一定概率把最佳水滴的信息丢给最差水滴。同样 10000 次运行下,Hilly 5维从 0.602 升到 0.903,Forest 5维从 0.478 升到 0.803,Megacity 5维从 0.351 升到 0.623;总分拉到 4.041(44.90%),提升约 14.7 个百分点。 在 45 种算法横向表里,改版 ACMO 排第 27 位。前一名 ABHA 是 4.127,后一名 ASBO 是 3.657,夹在中间算稳定段。随着表内算法增多,相邻分差会持续收窄,这个区间可看作已知顶级方法的密集区。 收敛图显示:低维(如 5 维)长平直段明显,说明算法仍可能陷局部极值;维数加到 500 后该缺陷倾向消失。RainProcess 方法按 drops 数组累加每朵云落下的水滴数来更新湿度指标,可视化的云簇形态会随区域数、云数、初始熵和干燥阈值变化。

◍ 从表尾算法看降水过程的落点逻辑

上面那串横向对比里,排在第29到45位的算法实测得分跨度很大:Micro-AIS 综合分 3.379、排名 37.54,而 PSO 只有 2.230、排名 24.77,Boids 虚拟生物算法也仅 2.229。越靠后的元启发式在外汇样本上的收敛质量倾向更弱,但这不代表不能拿来做降水式参数扩散的底子。 RainProcess 这个函数就是云滴下落的调度核心。rev 为 false 时所有云初始化为满湿度 1.0,相当于冷启动均匀撒点;rev 为 true 时才按区域湿度累加,缺失湿度用 minGp 兜底,这一步决定了优化初期探索是否偏向历史湿润区。 落点不是均匀随机,而是用 GaussDistribution 按云的熵距和超熵做高斯扰动,越界就拉回区间。外汇与贵金属市场高风险,这种基于云模型的采样在 MT5 里跑 EURUSD 15M 回测时,可能比纯 PSO 少陷进局部极值,但概率优势依赖 coords 与 cloudsNumber 的配比,建议直接抄下面代码改 cloudsNumber 验证。

MQL5 / C++
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class="type">void C_AO_ACMO::RainProcess(class="type">bool &rev)
{
  class=class="str">"cmt">//to shed drops from every cloud----------------------------------------------
  class="type">class="kw">double cloud [];
  class="type">int    drops [];
  ArrayResize(cloud, cloudsNumber);
  ArrayResize(drops, cloudsNumber);
  if (!rev)
  {
    ArrayInitialize(cloud, class="num">1.0);
  }
  else
  {
    ArrayInitialize(cloud, class="num">0.0);
    class="type">class="kw">double humidity;
    for (class="type">int i = class="num">0; i < cloudsNumber; i++)
    {
      for (class="type">int c = class="num">0; c < coords; c++)
      {
        humidity = areas [c].regions [clouds [i].regionIndex [c]].humidity;

if (humidity != -DBL_MAX) cloud [i] += humidity;
        else                cloud [i] += minGp;
      }
    }
  }
  DropletsDistribution(cloud, drops);
  class=class="str">"cmt">//ArrayPrint(drops);
  class="type">class="kw">double dist   = class="num">0.0;
  class="type">class="kw">double centre = class="num">0.0;
  class="type">class="kw">double xMin   = class="num">0.0;
  class="type">class="kw">double xMax   = class="num">0.0;
  class="type">class="kw">double x      = class="num">0.0;
  class="type">int    dCNT   = class="num">0;
  for (class="type">int i = class="num">0; i < cloudsNumber; i++)
  {
    for (class="type">int dr = class="num">0; dr < drops [i]; dr++)
    {
      for (class="type">int c = class="num">0; c < coords; c++)
      {
        dist   = clouds [i].entropy [c];
        centre = clouds [i].center  [c];
        xMin   = centre - dist;
        xMax   = centre + dist;
        x = u.GaussDistribution(centre, xMin, xMax, clouds [i].hyperEntropy);
        if (x < rangeMin [c]) x = u.RNDfromCI(rangeMin [c], centre);

「变异与择优的落点写进种群」

上面这段是云滴生成循环收尾,核心在做两件事:越界回拉、以及用概率择优覆盖劣解。x 若超出当前维度的 rangeMax,就由 RNDfromCI 在 centre 与 rangeMax[c] 之间重抽,再用 SeInDiSp 夹回步长网格,保证不跑出可行域。 随后随机挑一个下标 p,若它的适应度 a[p].f 优于当前最差滴 a[dCNT].f,则以 0.95 概率直接继承 p 的同维参数;否则把刚生成的 x 写回。这个 0.95 不是拍脑袋,是留 5% 扰动空间防止早收敛,外汇与贵金属回测里过早收敛常导致样本外崩坏,属高风险区。 循环末尾 dCNT 自增,内层走完再把 drops[i] 累加到 clouds[i].droplets,完成一代云滴注入。开 MT5 把 0.95 改成 0.80 对比代际多样性,能直观看到收敛速度变化。

MQL5 / C++
        if (x > rangeMax [c]) x = u.RNDfromCI(centre, rangeMax [c]);
        x = u.SeInDiSp(x, rangeMin [c], rangeMax [c], rangeStep [c]);
        class="type">int p = u.RNDminusOne(popSize);
        if (a [p].f > a [dCNT].f)
        {
          if (u.RNDprobab() < class="num">0.95) a [dCNT].c [c] = a [p].c [c];
        }
        else
        {
          a [dCNT].c [c] = x;
        }
      }
      dCNT++;
    }
    clouds [i].droplets += drops [i];
  }
}
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————

画得少,看得清

ACMO 这套群体优化思路,原始版靠云在高压区被推去低压区来躲局部极值,改版把种群内信息交换概率提到 95%,收敛性上去了,却也把陷进局部最优的概率抬了上来——核心矛盾一直是「别困死」和「找得准」之间的拉锯。 测试直方图里评分封顶是 100(理论最高),颜色等级 ≥0.99 的结果用白色标出,说明真跑到极优解的样本并不多;想稳一点,直接把代码里那 95% 的交换概率调小就行。 它参数多、实现重,但区域湿度规则、压力分布、云质量相关的加速度惯性这些物理 trick 确实给后续改算法留了底子。外汇与贵金属优化回测高风险,拿去跑 EA 前先在 MT5 策略测试器里用作者附的 ZIP 验一遍收敛曲线再谈实盘。

把重复劳动交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到多参数优化的收敛轨迹,你只需判断哪段云层移动更贴合行情结构。

常见问题

湿度高的区域代表历史搜索中潜力更好,按比例投放水滴能让云层间信息交换偏向优质解,降低随机漫游的浪费,但仍有概率陷入次优。
目前小布内置的是诊断与可视化,优化算法需自行在 MT5 部署;可将输出解作为阈值参考,由小布做盘口异动标记。
超熵偏高会加速云特征重置,可能跳过精细局部搜索,实测中倾向在后期衰减该值以平衡探索与利用。
外汇贵金属杠杆高、跳空频繁,回测优解实盘可能失效,任何参数组合都仅代表历史概率,实盘请控仓。