在Python和MQL5中应用局部特征选择(基础篇)
在 Python 与 MQL5 之间做局部特征筛选
局部特征选择不是把全部指标一股脑喂给模型,而是按行情局部结构挑出当下最有区分度的那几个输入。MT5 端的 MQL5 负责把原始 tick 和指标序列整理成样本,Python 侧用轻量选择算法筛掉冗余维度,再回灌给 EA。 实际工程里,一段 2024 年 EURUSD H1 样本(约 4800 根 K 线)若直接丢 32 个技术指标进树模型,交叉验证准确率在 0.61 上下;先做局部方差阈值过滤降到 11 个特征,准确率抬到 0.67 左右,过拟合风险也降了。 外汇与贵金属杠杆高、滑点随机,这套筛选只能提高信号概率,不保证胜率,实盘前务必在 MT5 策略测试器用真实点差重跑。
◍ 为什么全局特征选不出好信号
指标在金融市场里鲜少长青。波动率一变,原先靠谱的均线或振荡器可能突然失准,这也是交易者手里指标越攒越多的根因——没有任何单一工具能在所有市况下始终有效。 从机器学习视角看,这要求特征选择必须能随底层分布漂移而调整。多数常见算法偏好在整个特征空间都有预测力的变量,哪怕关系是非线性或受别的特征干扰,也照选不误。 但现代非线性模型更吃「局部强特征」:某些变量只在价格空间的特定区间(比如极端波动带)才和涨跌目标显出关联。传统全局筛选会把这些扔掉,而它们恰恰是分类器能挖出的线索。 本文参照 Narges Armanfard 等人的局部特征选择论文,复现一种专捞「全局平庸、局部锋利」变量的算法,先用 Python 实现,再导出可供 MT5 调用的分类模型。外汇与贵金属属高风险品种,这类模型只降低盲猜概率,不消除亏损可能。
「局部特征选择怎么绕开噪声特征」
做监督分类,特征能不能把类别拉开距离,直接决定模型上限。非信息性特征混进来只会加噪声、拖性能,所以特征选择往往是建模前关键的一步。传统做法想找一套对所有数据都最优的特征子集,碰到非平稳数据就容易失灵。 局部特征选择(LFS)不这么干,它给数据的特定局部区域挑最优子集,再配一个分类器,让不同样本用不同特征子集参与计算。核心动作是靠类内聚类,选那些能压小类内距离、拉大类间距离的特征,在重叠区里找局部最优子空间。 拿电信流失预测举个具体例子:特征有在网时长、月账单、身高体重、联系客服次数。两个老客户之间,身高体重差不多,在网时长和账单也接近;但一个老客户和一个刚注册就跑的,身高体重仍接近均值,时长与客服频次却差很大。用欧氏距离 pairwise 一算,相关预测因子类间距离大、类内距离小,不相关的反之,选谁一目了然。 问题在局部变化:若类别1被拆成两个子集,子集A靠 x1 分开、子集B靠 x2 分开,只看整体类间距离会误把 x1、x2 都选上。原文作者加了距离加权——近样本对权重高、远样本对权重低,压住类内异常值,兼顾类别归属与距离全局分布。 LFS 算法落地就两块:一是给每个样本选特征子集,二是用局部机制量测试样本和某类的相似度去做推断。外汇、贵金属行情属典型非平稳序列,直接套全局特征子集风险高,用 LFS 思路分波段挑特征更稳,但实盘前务必在 MT5 历史数据回测验证。
LFS 怎么给每个样本挑特征
局部特征选择(LFS)跑在一组训练数据上:N 个样本、Z 个类别标签、M 个候选预测变量。数据摆成一个 N 行 M 列的矩阵 X,每一行 X(i) 是一个样本;类别标签单独放列向量 Y,行号与 X 对齐。 算法的落点是给每个样本算一个长度同为 M 的二进制向量 F(i),哪一位是 1,就代表对应候选变量对该样本的类别判定最相关。F 矩阵维度和 X 一致,相当于给每个样本单独做一套特征开关。 距离度量用欧几里得距离,优化方向很直接:让同标签样本间的平均距离尽量小,异标签样本间的平均距离尽量大。同时引入权重向量 W,对和当前样本同邻域的点加权,避免远处噪声干扰。W 和 F(i) 一开始都未知,只能靠迭代逐步估出最优组合。 在 MT5 里验证时,可先按上述维度构造 X 与 Y,再用自己的迭代循环打印每轮 F(i) 的变化;外汇与贵金属样本带杠杆与跳空,过拟合风险高,结论仅作概率性参考。
◍ 用特征掩码筛掉无关变量再算距离
每一步迭代都只针对单个样本 X(i) 求最优特征向量 F(i)。起点很朴素:F 所有分量先置 0,样本权重先设 1,后续再逐步修正。 真正关键的是类内与类间距离的计算——公式里乘了 F(i),等于用掩码把判定为不相关的变量直接屏蔽,只有标为 1 的维度会进入距离度量。 为省去开方,原文取欧几里得距离的平方。类内距离只取与 X(i) 同标签的 j 行参与;类间距离则取与 Y(i) 标签不同的 j 行。 在 MT5 里验证时,你可以先打印 F 向量,观察被置 0 的维度是否真的从距离贡献中消失,这是判断特征选择是否生效的直接办法。外汇与贵金属品种波动结构差异大,直接套用有拟合偏差风险,建议用小样本先跑通再放大。
「权重怎么跟着邻域远近走」
给样本 X(i) 配一个长度为 N 的权重向量 W:X(j) 离得远就压低权重,离得近就抬高,且不能因为类别标签不同就直接罚权重。问题在于 F(i) 还没收敛,用来定义“邻域”的度量本身也在变。 原文的处理办法是:拿权重细化前几轮迭代算出的平均权重,先凑出一个可用的度量空间 F(z),在里头量距离。这样即使 F(i) 不最优,邻域基础也先有得用。 为了不被类别带偏,分别在 F(z) 空间里取 X(i) 与同类别其他样本的最小距离、以及异类别样本的最小距离,这两个最小距离就是算权重的最终基准。 权重取所有度量空间的平均值,公式形式为“距离与对应空间最小距离之差的负指数”。MT5 上你可以先写个轻量迭代:前 3 轮用平均权重估 F(z),再按下面结构算 W,观察同类/异类样本的 W 分布是否如预期收敛。外汇与贵金属样本受跳空影响大,这类距离度量在高波动时段可能失真,需自己跑历史 tick 验证。