在 MetaTrader 5 中使用自组织特征映射(Kohonen 映射)
一、什么是自组织特征映射(SOM)
自组织特征映射(Self-Organizing Map,SOM)由芬兰教授 Teuvo Kohonen 在 1982 年提出,是一种无监督神经网络。它不需要输入数据与目标输出一一对应,而是把高维输入空间非线性地映射到一个规则的低维网格上,让相似的数据点落在相邻节点。换句话说,SOM 生成的是输入数据的一张「相似性地图」——你喂进去一组高维样本,它吐出来一张二维网格,颜色或位置相近的节点代表特征相近的样本。这在交易里特别适合做品种聚类、市场状态分层、异常检测。
和多数神经网络不同,SOM 的训练没有「标准答案」监督。它靠竞争学习自动找出数据的内在拓扑结构:训练集里靠近的样本,在地图上也会靠近。这种「拓扑保持」特性,是 K-means 这类硬聚类做不到的——K-means 只给标签,SOM 还给邻居关系,方便你顺着地图看过渡带。
二、网络架构与学习算法
最简单的 SOM 是一个 N×N 节点网格(文中用 4×4、15×20 等),每个节点持有一个与输入向量同维的权重向量,以及网格坐标 (x,y)。学习分几步循环:1) 用随机值初始化所有节点权重;2) 从训练集随机抽一个样本向量;3) 计算每个节点权重与样本的欧氏距离,最靠近的那个节点叫最佳匹配单元 BMU(Best Matching Unit);4) 以 BMU 为中心、按当前邻域半径,调整邻域内所有节点的权重,让它们更靠近样本,越靠近 BMU 调整越多;5) 邻域半径和学习率随迭代逐步缩小;6) 重复第 2 步 N 次。多次迭代后,网格会演化成稳定的特征分区,每个区域就像一个特征分类器。
两个超参数决定训练质量:迭代次数(文中用 10000 次,地图约在 2400 步后成形)和邻域半径(初始为整张网格半径,逐步衰减到 1)。迭代太少地图没定型,太多则浪费算力;半径衰减太快容易碎成孤岛,太慢则过渡带模糊。实际调参时先小网格试跑、看训练动态图,再放大。
三、MQL5 实现:CSOMNode 与 CSOM 类
文中用面向对象方式实现。CSOMNode 是每个网格节点的类,保存坐标和权重向量,提供 CalculateDistance(算到某向量的平方距离)和 AdjustWeights(按学习率和影响因子调权重)。CSOM 是整个网络类,内部用 cIntBMP 库把训练结果画成 BMP 图像,对外暴露 InitParameters(迭代次数, 横向节点数, 纵向节点数, 图像宽, 高)、BestMatchingNode、Train、Render、ShowBMP 等方法。使用时先 MathSrand 固定随机种子保证可复现,InitParameters 建网,AddTrainPattern 加样本,Train 训练,Render 出图,ShowBMP 贴到图表上。
CSOM KohonenMap;
void OnInit() {
MathSrand(200);
KohonenMap.InitParameters(10000, 15, 20, 400, 400);
KohonenMap.AddTrainPattern(255,0,0); // Red
KohonenMap.AddTrainPattern(0,128,0); // Green
// ... 共 8 种颜色
KohonenMap.Train();
KohonenMap.Render();
KohonenMap.ShowBMP(false);
}
四、经典示例:颜色聚类可视化
SOM 最直观的入门例子是颜色聚类:把 8 种 RGB 颜色当作三维向量喂进去,训练后地图上相同/相近颜色会聚成一团,肉眼就能验证「拓扑保持」。文中把 15×20 节点的网格渲染成 400×400 的 BMP,每个节点按自身权重着色,结果是一片平滑过渡的色块地图。进一步把网格改成 300 节点的六边形单元格(HexagonalCell=true),并通过 ShowBorders 开关控制是否画边框,就得到另一种更贴近学术文献的可视化风格。
这个例子虽小,却把 SOM 的全部机制走了一遍:向量化输入、BMU 竞争、邻域平滑、结果可视化。它证明即使只有三维输入,SOM 也能把「谁和谁像」画出来——这正是我们后面拿去处理行情特征的基础。
五、扩展到 Web 颜色与六边形网格
文中从 CSOM 派生出 CSOMWeb,新增 AddTrainColor(颜色常量) 和 ShowColor(颜色, 名字) 两个方法,内部自动把 MQL5 的 Web 颜色常量(如 clrRed、clrBlue)拆成 RGB 三维向量再加进训练集。这样你不用手写 (255,0,0),直接传 clrRed 即可,处理 132 种预定义 Web 颜色时尤其方便。可视化上,通过 input 参数切换六边形单元格和边框显示,得到不同观感的地图——实用价值在于:当颜色很多、彼此色差很小时,正方形网格会出现「边界锯齿」,六边形网格的过渡更自然。
六、在交易中能做什么:品种聚类与状态识别
SOM 在量化里最自然的应用是「把高维行情特征压成一张可解释的地图」。例如把每个交易品种在某段时间里的波动率、动量、相关性、买卖盘失衡等十几个指标拼成向量,训练一张 SOM,地图上相邻节点就代表「市场状态相近」的品种组合——你可以据此做板块聚类、找替代品种、识别系统性风险集中在哪一片区域。另一个用法是单品种的状态分层:把不同行情阶段(趋势/震荡/突破)的特征喂进去,地图不同区域对应不同 regime,EA 就能按「当前落在哪个节点附近」切换策略参数。
相比纯统计阈值,SOM 的优势是「见过全样本后自己归纳拓扑」,不会漏掉你没显式定义的过渡态。代价是结果偏黑盒、需要 Render 出图人工解读,且对特征工程和迭代次数敏感。稳健做法是先小网格试跑看训练动态,确认地图稳定后再放大节点数投入实盘监控。
七、小结
Kohonen 映射是无监督神经网络,用 BMU 竞争 + 邻域平滑把高维样本压成一张「相似性地图」,拓扑保持是它区别于 K-means 的核心。MQL5 里用 CSOMNode/CSOM 类配合 cIntBMP 就能训练并渲染,经典颜色聚类例子帮你快速验证机制。交易中可拿它做品种聚类、市场状态识别、异常检测——前提是先标准化特征、调好迭代与邻域,并把结果 Render 出来人工复核。它不替代监督模型,但是一张极好的「全样本特征全景图」。