首页 / 交易学院 / 生长型神经气 GNG:MQL5 中的聚类与可视化
生长型神经气 GNG:MQL5 中的聚类与可视化
📈

生长型神经气 GNG:MQL5 中的聚类与可视化

交易策略 难度 · 高阶 2013 14 分钟阅读
神经网络聚类GNG

GNG(生长型神经气)是什么

GNG 是一种自组织神经网络,用“神经元(顶点)+ 边(连接)”来逼近输入数据的分布。它从 2 个神经元开始,训练过程中不断在误差最大的区域插入新顶点、删除过老的边,最终长成贴合数据密度的拓扑结构。文章用它把 RSI 的二维特征点聚类,区分不同市场状态。

相比 K-means / SOFM 的优势

MQL5 实现:类结构与关键函数

用标准库 CList/CObject 组织动态顶点与边(链表比数组更适合反复增删)。CGNGNeuron 含权重向量、局部误差 E、唯一 ID;CGNGConnection 含 uid1/uid2/age;CGNGAlgorithm 是主类,ProcessVector 即原文的训练步进。

训练一步在做什么

每输入一个向量:找最近(赢家)和次近(次优)两个神经元;赢家局部误差累加、向输入平移 eps_w,近邻平移 eps_w 的小比例;赢家所有连接 age++,赢家与次优若已连则 age 归零否则建连;age>age_max 删边、无连边的孤立神经元删除;每 lambda 步在误差最大的 u,v 中间插新顶点 r,用 u-r、v-r 替换 u-v;最后所有神经元误差乘 (1-beta) 衰减。

输入数据与可视化

文章取当前柱与前一柱的 RSI 配对成二维特征(隔 3 柱取样降低关联),用 CopyBuffer 取 RSI 值、归一化到 0~100,样本数约 1000。可视化用 OBJ_ARROW 画神经元(赢家 Lime、次优 Green、其他 Red)、OBJ_TREND 黄虚线画边、OBJ_LABEL 显示样本数与神经元数,每步 ChartRedraw 刷新。

坑与局限

⚠ 别指望它万能
1) 计算量:找赢家 O(N),max_nodes 大时耗资源,死节点也占算料。2) 收敛:能跟踪缓慢漂移,但不具备跟踪快速跳跃分布的能力,信号跳变后老拓扑变“死区”。3) 参数敏感:lambda 过高产生孤立死节点、过低聚类粗糙;age_max 影响拓扑稳定。4) 停止条件需自定(平均误差/验证集),原文未实装。

最小可运行骨架

下面是文章 CGNGNeuron / CGNGAlgorithm 的精简骨架,展示“顶点-边”结构与一步训练在做什么。真实工程用 CList 管理动态增删:

class CGNGNeuron
  {
   public: double w[]; double E; int uid;
   double ProcessVector(double &in[], int dim)
     { double e=0; for(int i=0;i<dim;i++) e+=(in[i]-w[i])*(in[i]-w[i]); return(e); }
   void Adapt(double &in[], double eps, int dim)
     { for(int i=0;i<dim;i++) w[i]+=eps*(in[i]-w[i]); }
  };

// 一步训练(ProcessVector 精简)
void Step(double &in[], int dim)
  {
   // 1) 找最近(winner)与次近(second)
   // 2) winner.E += winner.error; winner.Adapt(in, eps_w); second.Adapt(in, eps_n);
   // 3) 赢家所有边 age++;赢家-次近若已连 age=0 否则建连
   // 4) age>age_max 删边,无连边顶点删除
   // 5) 每 lambda 步在最大误差的 u,v 中间插新顶点 r
   // 6) 所有顶点 E *= (1-beta)
  }

落地到交易的两种姿势

姿势一:状态监测。把近期 RSI(或价格斜率)打成二维点喂给网络,网络自适应覆盖密度;某个区域没有神经元覆盖,说明市场处于罕见状态,可作为异常预警。姿势二:作为特征工程前端,把“当前点最近的神经元 ID / 到它的距离”当作新特征,喂给后续分类或信号逻辑,比原始价格序列更平滑、信息更浓缩。

常见问题

K-means 要你先指定簇数 K,且聚类中心是固定点、不保留拓扑关系。GNG 从 2 个神经元自动生长,不需要预设簇数,还能用“边”表达神经元之间的邻近拓扑,更适合覆盖密度不均、形状不规则的数据分布。
相邻柱的 RSI 高度相关,几乎提供不了新信息。隔几柱取样能降低特征间的相关性,让二维点更均匀地铺在特征空间里,聚类结果更能反映不同的市场状态,而不是挤成一团。
文章只演示了算法与可视化,没做完整 EA。它的价值在于“把市场状态聚类”——低密度区无神经元覆盖可视为异常。要落地交易,需要把聚类结果(当前点落在哪个区域、离哪个神经元最近)映射成状态标签,再接你的信号逻辑。