数据科学和机器学习(第 13 部分):配合主成分分析(PCA)改善您的金融市场分析·综合运用
(3/3)·从标准化到协方差,再到优劣权衡,把 PCA 真正落到 MT5 策略诊断里
NAS100小时图的相关性矩阵实测
在 MT5 策略测试器里跑 PCA 诊断脚本,对 NAS100 的 H1 周期取 10 个变量做标准化,日志在 18:03:44.405 一次性吐出了完整的 10×10 相关系数矩阵(对称阵,对角线恒为 1)。 从打印值看,第 2 列(索引 1)与多数变量正相关偏高,例如与第 8 列(索引 7)相关系数 0.8439、与第 9 列(索引 8)0.8288;而第 1 列(索引 0)与第 2 列呈 -0.0165 的弱负相关,与第 5 列(索引 4)则为正 0.2933。这种结构说明原始特征里存在明显共线簇,直接喂给回归类 EA 可能放大噪声。 外汇与贵金属品种同样会出现这类隐藏共线性,杠杆环境下误用高度相关输入会放大回撤风险,建议先降维再进信号层。 代码层就是先建矩阵对象再提成分: pca = new Cpca(ind_Matrix); matrix pca_matrix = pca.ExtractComponents(ENUM_CRITERION); 把 ENUM_CRITERION 换成你自己的阈值规则,重新跑一遍就能在日志里比对降维后的载荷变化。
pca = new Cpca(ind_Matrix); matrix pca_matrix = pca.ExtractComponents(ENUM_CRITERION);
◍ NAS100 小时图的主成分投影样本
在 NAS100 的 H1 周期上跑主成分分析,终端会在同一时间戳(15:03:30.992)连续吐出多行投影坐标,每行对应一个样本在三个主成分轴上的位置。 从抓到的片段看,第一主成分(PC1)取值从约 -1.82 到 -3.81 不等,第二主成分(PC2)在 0.44 到 1.18 之间摆动,第三主成分(PC3)则集中在 -0.74 到 -0.12 附近,说明这段窗口的样本沿 PC1 离散度最大。 这类输出直接喂给散点矩阵绘制函数就能可视化:把投影矩阵传进去,横轴标 'var'、图例标 'PCA',即可在 MT5 里看到各主成分平面的聚类形态。外汇与贵金属品种做同样处理时波动更剧烈,属于高风险验证,结论仅具概率意义。
CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) PCA&class="macro">#x27;S CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [[-class="num">2.297373513063062,class="num">0.8489493134565058,class="num">0.02832445955171548] CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [-class="num">2.370488225540198,class="num">0.9122356709081817,-class="num">0.1170316144060158] CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [-class="num">2.728297784013197,class="num">1.066014896296926,-class="num">0.2859442064697605] CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [-class="num">1.818906988827231,class="num">1.177846546204641,-class="num">0.748128826146959] ... ... CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [-class="num">3.26602969252589,class="num">0.4816995789189212,-class="num">0.7408982990360158] CS class="num">0 class="num">15:class="num">03:class="num">30.992 PCA Test(NAS100,H1) [-class="num">3.810781495417407,class="num">0.4426824869307094,-class="num">0.5737277071364888…] plt.ScatterCurvePlotsMatrix("pca&class="macro">#x27;s ",pca_matrix,"var","PCA");
「PCA 在行情特征工程里的五个实在用处」
把 10 个振荡器直接丢进模型,MT5 里回测一轮往往卡在维度爆炸上;PCA 先把变量投影到少数主成分,保留方差最大的方向,变量数砍掉一大半,可视化散点也看得清了。 数据压缩这块对做跨品种贵金属联动的人有用:小时级样本累积到几万根 K 线,主成分存成少量列,本地存储和信号传输都轻。 降噪是肉眼能验的——把 RSI、CCI、MACD 等 10 个振荡器做 PCA,前 2 个主成分通常吃掉 60%~80% 方差,剩下分量里多是随机扰动,删掉后曲线毛刺少一截。 外汇与贵金属杠杆高、滑点跳空频繁,纯靠降维信号下单仍属高风险;PCA 只是把尺度统一到单位方差,削弱量纲差异对统计模型的干扰,不等于过滤了行情风险。 主成分轴有特征向量可查,在 MT5 里用矩阵算完打印出来,哪个原始指标权重高一眼能读,比黑箱网络好排错。
PCA 落地的五个坑
做降维前先认清 PCA 的边界,否则在 MT5 里跑完因子矩阵也读不出信号。 信息丢失是最直接的代价:你若丢弃太多主成分,或留下的成分没覆盖原始数据的相关波动,模型就砍掉了真正驱动价格的结构。保留比例建议从累积方差 95% 起调,再回看成分载荷。 主成分的解释很烦人——它们只是重构出的变量,没有天然含义。当原始指标高度共线、或成分数拉得很大时,你很难反推哪根线对应动量还是波动率。 异常值会撕裂算法。单根极端影线就能把协方差矩阵拽偏,结果整体漂移,和多数 ML 方法一样脆弱。 计算侧也并非免费:大样本下求解特征分解可能卡死或复现数值问题,实盘前先用小周期切片验证。 它默认数据线性、成分不相关。外汇与贵金属属高波动高风险品种,这一假设常被打破,硬套会得到误导性投影。
◍ 一点提醒
PCA 在 MT5 里不是黑箱魔法,它把多维指标矩阵压成少数主成分,留住方差最大的方向,让你看出市场底层结构哪根线在驱动。工程与生物领域早用烂了,外汇和贵金属这种高杠杆品种上跑,务必先认清回测漂移和过拟合风险。 仓库里那几个 mqh 才是落点:matrix_utils 管矩阵运算,pca 是核心库,plots 画向量,preprocessing 做缩放,PCA Test 是把前文所有东西装进一个 EA 里跑。直接拖进 MT5 的 MQL5/Include 和 Scripts 里编译,换品种换周期看主成分权重怎么变。 它不会替你下单,只是把噪声削掉。真要拿去辅助决策,先用 EURUSD 的 H1 跑一遍 PCA Test,观察前两个主成分解释方差比例是否稳定超过 70%,再谈别的。