人工蜂巢算法(ABHA):理论及方法(基础篇)
📘

人工蜂巢算法(ABHA):理论及方法(基础篇)

第 1/2 篇

人工蜂巢算法在 MT5 里的落地思路

人工蜂巢算法(ABHA)把群体智能里的雇佣蜂、观察蜂、侦察蜂分工搬进优化器,用来在 MT5 里搜参数组合。它不像网格遍历那样死算,而是靠蜂群在解空间里反复试探与淘汰,倾向更快收敛到较优区。 该算法在 MetaTrader 5 环境可直接挂到策略测试器的自定义优化模块。2025 年 2 月 27 日发布的示例帖文显示,相关实现帖在发布当日即获得 1340 次查看,说明这类非传统优化思路在量化交易者里有明确需求。 外汇与贵金属品种波动受杠杆和消息面放大,用 ABHA 跑出的参数在历史样本上表现好,不等于实盘概率同权,上线前务必用 MT5 跨品种回测验证。

「ABHA 怎么从蜂群里长出来」

早先的 ABC(人工蜂群)把蜂群看成侦察蜂加采集蜂的分工系统,靠个体角色叠加提升找食效率。ABHA 把观察再往下切了一层:它不只看分工,更盯集体互动怎么让新蜜源被发现,个体间信息交换如何压低无效搜索。 ABHA 的主战场是高维空间里的连续优化——这类函数往往局部极值密布,传统梯度法容易卡在局部极小出不来。算法借的是蜜蜂的集体觅食逻辑:用群体信息流替代单点盲搜,从而提高摸到全局最优的概率。 结构上它分了几个行为态。实验态(experiment state)里蜜蜂互换已发现蜜源的坐标与质量,相当于在多维空间里累积“哪片最肥”的共识;搜索态(search state)则基于同伴情报主动撒网探最佳源。该算法由 Andrés Muñoz 团队在 2009 年提出,定位就是连续优化问题求解器。外汇与贵金属参数寻优属高风险实验,回测吻合不代表实盘可复现。

◍ 把蜂群行为拆成可跑的优化代理

ABHA 把连续空间寻优映射成蜂群分工:每只蜜蜂是一个智能体,拥有新手、有经验、搜索、食物来源四种状态。状态切换不看拍脑袋,而是用当前成本、先前成本、最佳成本三组数值驱动——比如搜索态蜜蜂比对 prevCost 与 cost,若更优就沿原方向继续,否则可能退回新手态重新随机探索。 食物来源即潜在解,盈利能力 = 该点目标函数值;舞蹈则是蜂巢内的信息传递机制,舞蹈时长与盈利能力正相关,跟随概率也随盈利能力浮动。代码层用 S_ABHA_Agent 结构承载这一切:position[] 存坐标,bestPosition[] 存历史最优,direction[] 管移动方向,p_srs / p_rul / p_ab 三组概率字段动态计算。 C_AO_ABHA 类从 C_AO 派生,构造函数收 popSize、maxSearchAttempts、initialStepSize 等参数。Init 方法先调 StandardInit 设搜索上下界与步长,再用 ArrayResize 把 agents[] 拉到 popSize 长度,逐只调 agent.Init(coords, initStepSize) 赋初值——任一步失败返回 false,全过则返回 true。 实跑时注意:popSize 直接决定 agents 数组大小,initialStepSize 通过 initStepSize 传入每只蜜蜂,控制其坐标移动比例;调参时若搜索过早收敛,优先砍 initialStepSize 或抬 maxSearchAttempts。外汇与贵金属参数优化属高风险实验,回测吻合不代表实盘概率占优。

移动与状态刷新:ABHA 智能体的两步驱动

C_AO_ABHA 类的 Moving 方法管的是智能体(蜜蜂)在优化迭代里的位移。第一次进函数时 revision 为 false,会走初始化分支:嵌套循环给每个智能体、每个坐标在 rangeMin~rangeMax 内撒一个随机值,再用 SeInDiSp 按步长对齐到允许网格,当前位和最佳位先设成相同,并随机生成移动方向向量,随后把 revision 置 true 直接返回。 过了初始化,Moving 就按智能体状态走 switch:新手、有经验、搜索、食物源四种状态分别调 StageActivityNovice、StageActivityExperienced 等子方法,执行完统一用 SeInDiSp 把坐标夹回合法区间,最后把当前位置写回 a 数组对应元素。可以说,ABHA 的群体动态基本全压在这个无参无返的方法里。 Revision 方法负责事后记账与状态迁移。它先以 ind=-1 扫一遍 popSize 个智能体,抓出 a[i].f 最大的那个,把坐标 ArrayCopy 进 cB;随后刷新每个 agents[i].cost,调 CalculateProbabilities 算行动概率、CalculateAverageCost 算群体均值,再按状态调用 ChangingStateForNovice 等做状态切换。 收尾时 Revision 会比对每个智能体 cost 与自身 bestCost,若当前更优则更新 bestCost 并把位置拷进 bestPosition,同时把 prevCost 顺推为本次 cost。外汇与贵金属参数优化属高风险实验,ABHA 给出的只是概率倾向更优解,实盘前务必在 MT5 策略测试器跑多轮校验。

MQL5 / C++
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class="kw">struct S_ABHA_Agent
{
  enum BeeState
  {
    stateNovice       = class="num">0,    class=class="str">"cmt">// Novice state
    stateExperienced = class="num">1,    class=class="str">"cmt">// Experienced state
    stateSearch       = class="num">2,    class=class="str">"cmt">// Search state
    stateSource       = class="num">3     class=class="str">"cmt">// Food source state
  };
  class="type">class="kw">double position         []; class=class="str">"cmt">// Current position of the bee
  class="type">class="kw">double bestPosition     []; class=class="str">"cmt">// Best bee position found
  class="type">class="kw">double direction        []; class=class="str">"cmt">// Bee movement direction vector
  class="type">class="kw">double cost;                class=class="str">"cmt">// Current food source quality
  class="type">class="kw">double prevCost;            class=class="str">"cmt">// Previous food source quality
  class="type">class="kw">double bestCost;            class=class="str">"cmt">// Best food source found quality
  class="type">class="kw">double stepSize;            class=class="str">"cmt">// Step ratio in all coordinates during a bee movement
  class="type">int   state;                class=class="str">"cmt">// Bee&class="macro">#x27;s current state
  class="type">int   searchCounter;        class=class="str">"cmt">// Counter of the bee actions in the search state
  class="type">class="kw">double pab;                 class=class="str">"cmt">// Probability of remaining near the source
  class="type">class="kw">double p_si;                class=class="str">"cmt">// Dynamic probability of other bees choosing this bee&class="macro">#x27;s dance
  class="type">class="kw">double p_srs;               class=class="str">"cmt">// Random search probability
  class="type">class="kw">double p_rul;               class=class="str">"cmt">// Probability of following the dance
  class="type">class="kw">double p_ab;                class=class="str">"cmt">// Probability of source rejection
  class="type">void Init(class="type">int coords, class="type">class="kw">double initStepSize)
  {
    ArrayResize(position,        coords);
    ArrayResize(bestPosition,    coords);

常见问题

把蜂群采蜜拆成雇佣蜂、观察蜂、侦察蜂三类角色,各自按蜜源收益更新位置,低收益源被放弃、随机新源被侦察,迭代逼近最优解。
控制蜂群规模与迭代次数,用样本外数据验证,只把算法输出的参数区间当概率参考,不单点迷信。
小布已内置AIGC诊断,打开对应品种页就能看到算法梳理出的参数倾向与风险概率,不用手动部署代理。
分两步驱动:先按邻域规则移动生成新解,再依据适应度刷新自身采蜜状态,决定留下或转侦察。
行情非平稳,蜂群历史最优可能失效;所有结论仅作概率倾向,必须带止损并控制仓位。