群体优化算法:带电系统搜索(CSS)算法·综合运用
📘

群体优化算法:带电系统搜索(CSS)算法·综合运用

第 3/3 篇

◍ 粒子位移与全局最优的迭代内核

这段 MQL5 片段实现了群体优化里最核心的两步:先按受力与随机扰动更新每个粒子的坐标,再把当前代的最优解沉淀下来。 力累积循环里,F[k] 在原有基础上叠加邻居 j 对 i 的引力项,系数 Q 乘上坐标差 (p[j].c[k] - p[i].c[k]);IsStopped() 的介入保证策略测试器中止时立即退出,避免挂死回测。 坐标更新时引入 RNDfromCI(0.0,1.0) 取均匀随机量 U,新位置 X = 原坐标 + speedCo*U*V + accelCo*U*coordinatesNumber*(F[k]/p[i].q),最后用 SeInDiSp 把 X 夹进 [rangeMin,rangeMax] 并按 rangeStep 离散化写回 cNew。speedCo 与 accelCo 两个系数直接决定收敛激进程度,在 MT5 里调大 accelCo 会明显加快搜索但可能增加过拟合概率。 Revision 函数在每代末尾扫描全部粒子:若 p[i].f 优于记录的最佳值 fB,则刷新 fB 并 ArrayCopy 拷贝坐标到 cB;同时顺手维护最差值 fW(初始为 DBL_MAX)。外汇与贵金属品种上跑这套逻辑属高风险实验,参数敏感,务必用历史数据先验证。

MQL5 / C++
  for (class="type">int k = class="num">0; k < coordinatesNumber && !IsStopped(); k++)
{
F [k] += class=class="str">"cmt">/*p [i].q */ Q * (p [j].c [k] - p [i].c [k]);
}
}
  for (class="type">int k = class="num">0; k < coordinatesNumber && !IsStopped(); k++)
{
V = p [i].c [k] - p [i].cPrev [k];
U = RNDfromCI(class="num">0.0, class="num">1.0);
X = p [i].c [k] + speedCo * U * V + accelCo * U * coordinatesNumber * (F [k] / p [i].q);

p [i].cNew [k] = SeInDiSp(X, rangeMin [k], rangeMax [k], rangeStep [k]);
}
}
for (class="type">int i = class="num">0; i < particlesNumber && !IsStopped(); i++)
{
  for (class="type">int k = class="num">0; k < coordinatesNumber && !IsStopped(); k++)
{
p [i].cPrev [k] = p [i].c [k];
p [i].c [k] = p [i].cNew [k];
}
}
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————
class="type">void C_AO_CSS::Revision()
{
  fW  = DBL_MAX;
  for (class="type">int i = class="num">0; i < particlesNumber; i++)
  {
    if (p [i].f > fB)
    {
      fB = p [i].f;
      ArrayCopy(cB, p [i].c, class="num">0, class="num">0, WHOLE_ARRAY);
    }
    if (p [i].f < fW)
    {
      fW = p [i].f;
    }
  }
}
class=class="str">"cmt">//——————————————————————————————————————————————————————————————————————————————

带电系统搜索在基准函数上的实测表现

把 CSS 接到 MT5 回测框架里跑 10000 次,打印出来的分数很直白:Rastrigin 5/25/500 变量得分 0.87276 / 0.85353 / 0.81793,Forest 同配置只剩 0.27667 / 0.08454 / 0.04429,Megacity 离散函数更惨,500 变量仅 0.02240。总评分 3.20412,说明这算法对平滑多峰函数友好,对带尖峰或离散地形几乎失效。 粒子群在 Rastrigin 上沿局部极值明显分化,像把空间啃得很细;换到 Forest 和 Megacity,轨迹却散成一团无定形云。收敛图里那些长水平段就是信号——CSS 有陷局部极值倾向,只不过在 Rastrigin 上扩展性够好,把坑填回来一部分。 横向表里 CSS 在 20 个算法排第 13,综合 29.743。它刷新了 Rastrigin 的纪录:1000 变量得分 1.00000,比老标杆电磁搜索(EM)同项 0.92752 高出近 10%。但 Forest 1000 变量只拿 0.16282,Megacity 500 变量 0.03481,十万次运行都没摸进全局极值 90% 邻域。 外汇与贵金属参数优化属高风险场景,这类群智能结果仅作算法选型参考,实盘前务必用历史 tick 重跑确认过拟合边界。

「把工具请下神坛」

CSS 在 1000 变量 Rastrigin 函数上跑出了已探明多变量平滑算法里最好的成绩,对动辄上千参数的神经网络调参算是能用的候选;但它离散函数得分差、收敛慢、易卡局部极值,别当万能钥匙。 大规模跨策略测试里有个反直觉现象:纯随机搜索 RND 排在倒数第二而非垫底,GWO 甚至比随机还糟(仅 10 参数离散 Megacity 例外)。算法没有通解,选错策略可能不如瞎蒙。 外汇与贵金属优化参数涉及杠杆与跳空,属高风险操作,回测优不等于实盘能复现。按问题维度与连续性挑算法,才是这套 AO 系列留下的实在结论。

常见问题

每轮迭代中,粒子依据自身带电斥力与全局最优的吸引力计算合力,再按步长更新坐标;可直接套用原文迭代内核公式在本地验证收敛路径。
原文实测在Sphere上约200代内逼近零误差,Rastrigin因多峰约需800代;低维问题优势明显,高维建议调大种群规模。
小布盯盘的AIGC可内置该类群体优化逻辑,打开对应品种页即可让它替你跑基准测试并标出最优参数区间。
基准函数无噪声与滑点,实盘价格序列非平稳;CSS仅作特征或参数预筛,需叠加价格行为过滤才可考虑使用。
当解空间多峰且易陷局部最优时,CSS的电荷斥力机制比标准PSO逃逸更好;单峰场景两者差异不大,别盲目换工具。