神经网络变得轻松(第十四部分):数据聚类(基础篇)
📘

神经网络变得轻松(第十四部分):数据聚类(基础篇)

第 1/2 篇

「用无监督聚类给行情特征分堆」

在 MT5 里做价格行为分析,常遇到一堆高维特征(波动率、斜率、振幅)难以直接喂给监督模型。无监督聚类能把相似样本自动归并,帮交易者先看清市场处于哪一类状态,再决定用哪套策略。 MQL5 自带 CSeriesCollection 与基础向量运算,可以用欧氏距离做简单 K-Means 式分堆。下面这段演示了如何把最近 N 根 K 线的归一化特征塞进数组并初始化聚类中心。 [CODE]// 取最近 100 根收盘价做归一化 double close_array[100]; CopyClose(_Symbol,_Period,0,100,close_array); // 简单 min-max 归一化到 0~1 double min_c=close_array[0], max_c=close_array[0]; for(int i=0;i<100;i++){ if(close_array[i]<min_c) min_c=close_array[i]; if(close_array[i]>max_c) max_c=close_array[i]; } for(int i=0;i<100;i++) close_array[i]=(close_array[i]-min_c)/(max_c-min_c); // 初始化 3 个聚类中心 double centers[3]={0.2,0.5,0.8}; [/CODE] 代码逐行拆解:先 CopyClose 拉取百根收盘价;随后遍历求最小最大值,做 min-max 把量纲压到 0~1,避免价格绝对值干扰距离计算;最后手动设三个初始中心 0.2 / 0.5 / 0.8,对应低中高三种价位区间状态。 外汇与贵金属属高风险品种,聚类结果只描述历史样本分布,对后续走势仅具概率性参考,不能当作方向承诺。开 MT5 把上面数组长度改成 240,观察不同窗口下中心漂移,能直观感受样本量对聚类稳定性的影响。

MQL5 / C++
class=class="str">"cmt">// 取最近 class="num">100 根收盘价做归一化
class="type">class="kw">double close_array[class="num">100];
CopyClose(_Symbol,_Period,class="num">0,class="num">100,close_array);
class=class="str">"cmt">// 简单 min-max 归一化到 class="num">0~class="num">1
class="type">class="kw">double min_c=close_array[class="num">0], max_c=close_array[class="num">0];
for(class="type">int i=class="num">0;i<class="num">100;i++){
   if(close_array[i]<min_c) min_c=close_array[i];
   if(close_array[i]>max_c) max_c=close_array[i];
}
for(class="type">int i=class="num">0;i<class="num">100;i++) close_array[i]=(close_array[i]-min_c)/(max_c-min_c);
class=class="str">"cmt">// 初始化 class="num">3 个聚类中心
class="type">class="kw">double centers[class="num">3]={class="num">0.2,class="num">0.5,class="num">0.8};

用 k-均值把行情切成几类状态

无监督学习不依赖标签,直接按样本间的距离把数据归堆。对 MT5 导出的收盘价序列来说,这意味着能把杂乱的波动自动分成若干「状态簇」,比如窄幅震荡和单边推升会被分到不同组。 k-均值的核心是先用随机或指定方式放 k 个质心,再迭代:把每个样本指派到最近的质心,重新计算质心位置,直到质心基本不动。在价格行为里,k 取 3~5 通常够用,k 太大容易过拟合到噪声。 下面这段 MQL5 代码演示了如何读取最近 500 根收盘价并做最简单的两簇划分准备,实际跑之前你要在 MT5 里建个脚本并把数据打印出来观察。外汇与贵金属杠杆高,簇划分只描述历史分布,不预示下一步方向,请务必用小资金验证。

◍ 从监督学习切换到无监督的代价与空间

前面几篇把神经网络用在交易里,走的都是监督学习路子:喂历史数据,调权重,让模型输出贴着参考值走。实操里这套出结果最猛,但有个硬伤——除了行情历史,你还必须为每个系统状态准备参考结果。 手工标参考值意味着额外人力,而且很多状态根本给不出明确标签。这直接卡死了训练样本的规模上限,样本一大就没人手维护了。 无监督学习换了个逻辑:只灌原始数据,不提供参考值。标数据的人工成本掉下来,能喂给模型的输入量就上去了,样本规模不再被标注绑架。 不过别以为能无限堆数据,任务本身的复杂度膨胀也会反过来设限。本篇不会再用之前那种多层垂直神经网络,先把能落地的无监督算法拆开看怎么嵌进交易。

「无监督学习在图表形态识别里的落点」

监督学习要配对“状态-正确输出”的标签集,准备成本高,且很多系统状态根本找不到明确参考值。无监督学习反过来:手里有大量原始数据、却对它们了解甚少时,直接让模型自己从特征里概括结构,不依赖人工标注。 它能干的三类事和交易关系最紧:聚类、异常搜索、降维。聚类不是事先告诉模型“哪类归哪类”,而是给定一组描述状态的特征,让模型自主判定归属,连聚类数量都可当成超参数在训练里选。异常搜索负责捞出那些因外部因素仅以小概率出现的非典型状态。降维则是在最小信息损失下压缩数据,和监督卷积网络为特定任务挑特征不是一回事。 放到 MT5 行情里,双顶、头肩、旗形乃至两三根 K 线的小形态,用数学语言描述充满约定和冗余,人工判定也主观——同一张图不同人能读出反向预测。用无监督聚类把一段较长历史里的所有价格变化变体都归一遍,不需要标签,模型自己把“长得像一类”的走势聚出来,你可能就绕开了凭经验硬套形态的主观亏损区。 不过历史周期拉得越长,模型训练成本越高,外汇和贵金属又是高杠杆高风险品种,聚类结果只代表历史结构相似,不代表后续必然重复。先开 MT5 导一段日线或 H1 数据,用无标签方式跑个简单聚类,看看模型分出的簇和你肉眼画的形态重叠度有多少,比直接信形态教科书更靠谱。

常见问题

可用无监督聚类把历史特征向量分堆,每堆对应一种状态;切到对应品种周期跑一次聚类,看新K线落进哪堆即可粗略分类。
常见先试3到5类;类数过多会过拟合噪声,每类样本稀薄,实盘信号反而更跳,建议用轮廓系数挑拐点。
小布可在对应品种页直接给出聚类后的状态分堆与当前所属类别,你只需打开看结论,不必自己搭模型。
无监督不依赖标签,能挖出未定义形态,但初期解释性差;建议先用聚类探结构,再人工标注回流监督,互补更稳。
不能。聚类只描述概率性状态分布,贵金属杠杆高风险大,仅作过滤参考,下单仍须结合风控与人工确认。