种群优化算法:人工蜂群(ABC)(基础篇)
📘

种群优化算法:人工蜂群(ABC)(基础篇)

第 1/3 篇

用人工蜂群给 MT5 策略找参数

人工蜂群(ABC)属于种群优化算法,核心思路是模拟蜂群采蜜:雇佣蜂、观察蜂、侦察蜂三类角色在解空间里不断试探,用适应度函数淘汰差解、保留优解。在 MT5 里它常被拿来替代网格遍历,给 EA 做参数寻优。 这套方法不是玄学。2023 年 4 月一篇公开示例里,作者在 MT5 用修改版 ABC 跑了一组测试,样本标记显示约 2020 个评估点、2 轮显著迭代记录。数字不大,但足以说明:小样本下也能逼出比默认参数更稳的组合。 外汇与贵金属属高风险品种,ABC 寻优结果只代表历史样本上的概率倾向,实盘前务必在策略测试器里用自己的品种和周期重跑。

「蜂群舞蹈如何变成优化算法」

蜜蜂靠回巢后的即兴舞蹈传递食物方位,舞蹈越激烈代表花蜜越丰、距离越近。这种沟通机制在20世纪中叶由昆虫学家卡尔·冯·弗里施记录,证明单体无法完成的空间搜索可由群体通过简单信号协调。 2005年,Dervis Karaboga 发表学术论文,首次把蜂群觅食抽象成群体智能模型,命名为人工蜂群(ABC)。它把侦察蜂、跟随蜂的角色分配直接映射为候选解的勘探与开发,成为后续元启发式优化的一个分支。 对外汇与贵金属交易者而言,这类算法本质是高维参数空间的随机—导向混合搜索,MT5 优化器里的遗传算法与之思路相近但规则不同;拿 ABC 跑 EA 参数容易过拟合,属高风险实验。

◍ 蜂群怎么分活:工蜂与侦察蜂的排位逻辑

人工蜂群的实现差异主要在蜂巢管理原则和区域探索规则。本文采用经典算法的解释版本:蜜蜂先随机飞出当侦察员找花蜜,回巢后用舞蹈报告方向和数量,工蜂按花蜜量多少被派往对应区域——花蜜越多,派出的蜜蜂越多。 侦察蜂不会满搜索空间乱飞。多维空间里自由度几何级增长,纯随机侦察实际价值趋近于零,只对一两个维度有用,蜂巢资源会被白白浪费。经验上,把侦察兵派往已知区域的邻域更有效,坐标集中在可能的花蜜来源附近,而不是散开。 区域有动态排位:花蜜最多的区域等级最高,其中心可移位到浓度最高点;低等级区域被迫相对偏移,避免所有蜜蜂挤在狭窄区导致陷入局部极值。若区域中心距离小于两个半径(算法参数)即判定相交,低等级区被转移到两倍半径处,最佳坐标不动。 蜂之舞是资源分配核心。数字线上按各区域花蜜值差值画段,段长决定下次迭代选该区域的概率,遣派蜜蜂数与区域价值成正比。侦察蜂不跳舞,以相同概率在任意区域附近飞,保留搜索广度。 代码层面,蜜蜂是基本单元(坐标+隶属区域+花蜜量),区域由中心点和花蜜量定义,蜂巢用类封装搜索范围、最佳坐标和最大花蜜量。MarkUpAreas 方法里,未探索时全蜂随机均匀分布坐标;探索后复制最大浓度坐标到区域中心并做相交检测偏移;再用舞蹈标记做概率选域。 [CODE] // 检测区域相交并偏移低等级区域 double dist = Distance(area[i].center, area[best].center); if(dist < 2.0 * radius) { area[i].center = area[best].center + 2.0 * radius; } [/CODE] 上面片段即相交处理:算中心距,若小于两倍半径,把第 i 区域中心推到最佳区域中心加两倍半径处,最佳坐标保留。调 radius 参数直接改变区域分散程度,开 MT5 把这段塞进 EA 能直观看到区域互斥行为。外汇与贵金属优化用此算法属高风险,参数敏感,结果仅概率性倾向。

MQL5 / C++
class=class="str">"cmt">// 检测区域相交并偏移低等级区域
class="type">class="kw">double dist = Distance(area[i].center, area[best].center);
if(dist < class="num">2.0 * radius) {
   area[i].center = area[best].center + class="num">2.0 * radius;
}

蜂群算法在 EURUSD 回测里的收敛表现

在 MT5 策略测试器跑 Test_AO_ABC1(EURUSD, M1)时,单组蜂群(Skin)规模 1 的情况下,函数迭代 1000 次耗时 14.02、10000 次 14.06,Score2 达到 1.00000;规模扩到 500 时,1000 次耗时降到 4.69、10000 次 4.84,Score2 仅 0.49823。 森林(Forest)目标函数下,1 个蜂群 10000 次迭代 Score2 为 0.99755,但 500 个蜂群时暴跌到 0.08077,耗时也只剩 1.29。Megacity 函数更极端:500 蜂群 10000 次迭代 Score2 只有 0.04379,整体 C_AO_ABC 综合分 0.49447。 该算法对这两类双变量测试函数都表现出完全收敛倾向,是值得关注的收敛性指标;但不同景观函数(Skin/Forest/Megacity)得分差异极大,现在下其他结论还早。 真要比较,建议把上面数字落进表格,跟遗传或粒子群在同等迭代次数下横评,再谈实盘适配——外汇与贵金属杠杆高,回测分数不直接等于实盘胜率。

MQL5 / C++
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class="kw">struct</span> S_Bee
{
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> c []; <span class="comment">class=class="str">"cmt">//coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="type">int</span>&nbsp;&nbsp;&nbsp;&nbsp;aInd; <span class="comment">class=class="str">"cmt">//area index</span>
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> n;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//nectar</span>
};
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class="kw">struct</span> S_Area
{
&nbsp;&nbsp;<span class="keyword">class="type">void</span> Init(<span class="keyword">class="type">int</span> coordinatesNumber)
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;n = -<span class="macro">DBL_MAX</span>;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="functions">ArrayResize</span> (cC, coordinatesNumber);
&nbsp;&nbsp;&nbsp;&nbsp;<span class="functions">ArrayResize</span> (cB, coordinatesNumber);
&nbsp;&nbsp;}
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> cC&nbsp;&nbsp; []; <span class="comment">class=class="str">"cmt">//center coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> cB&nbsp;&nbsp; []; <span class="comment">class=class="str">"cmt">//best coordinates</span>
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">class=class="str">"cmt">//nectarAmount</span>
};
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class="kw">struct</span> S_BeeDance
{
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> start;
&nbsp;&nbsp;<span class="keyword">class="type">class="kw">double</span> end;
};
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="comment">class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————</span>
<span class="keyword">class</span> C_AO_ABC <span class="comment">class=class="str">"cmt">//Bees Hive</span>
{
&nbsp;&nbsp;<span class="comment">class=class="str">"cmt">//============================================================================</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: S_Area areas&nbsp;&nbsp;&nbsp;&nbsp; []; <span class="comment">class=class="str">"cmt">//nectar collection areas</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMax&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//maximum search range</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeMin&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//manimum search range</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> rangeStep []; <span class="comment">class=class="str">"cmt">//step search</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: S_Bee&nbsp;&nbsp;bees&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//all the bees of the hive</span>
&nbsp;&nbsp;<span class="keyword">class="kw">public</span>: <span class="keyword">class="type">class="kw">double</span> cB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]; <span class="comment">class=class="str">"cmt">//best coordinates</span>

常见问题

工蜂在已知好位置附近细搜,侦察蜂随机撒网防卡死;排位上工蜂占大头,侦察蜂少量保多样性。
舞蹈里的方向距离映射为候选解偏移,跟随蜂按蜜源质量概率选工蜂,迭代更新最优参数组合。
可以,小布内置 AIGC 优化流程,你选品种和指标范围,它自动出收敛后的参数建议供你回测。
常见 50~150 代内趋稳,因引导式搜索通常快于盲网格,但受种群规模与维度影响。
高风险品种易过拟合;建议跨周期验证、控制参数个数,并看蜂群多run稳定性再上实盘。