您应当知道的 MQL5 向导技术(第 31 部分):选择损失函数(基础篇)
📘

您应当知道的 MQL5 向导技术(第 31 部分):选择损失函数(基础篇)

第 1/2 篇

◍ 向导建模先挑损失函数

MQL5 向导在生成交易系统骨架时,并不只靠指标堆叠,背后是一套监督式模型训练逻辑。2025 年 5 月 5 日发布的第 31 部分技术文指出,损失函数的选择直接决定模型对“错判”的惩罚倾向,进而影响信号过滤的激进程度。 默认配置多用均方误差(MSE),它对离群样本敏感,容易在贵金属跳空行情里过度拟合噪声。换成平均绝对误差(MAE)或分位数损失,模型对极端影线更钝感,回测曲线可能更平滑,但入场延迟会上升。 外汇与贵金属属高杠杆高风险品种,任何损失函数调整都只是改变误差分配,不承诺胜率提升。打开 MT5 的向导高级选项,把 Loss Function 从 MSE 切到 Quantile,跑同一段 2024 年 XAUUSD 日线,对比信号触发次数即可验证差异。

损失函数不止一种写法

在 MT5 的 MQL5 向导里,损失函数从来不是单选项。翻一下 ENUM_LOSS_FUNCTION 枚举,里面直接列了 14 种可用项,而且官方列表本身就不算穷尽。这意味着你没法靠一个固定损失函数通吃所有网络结构,细微的格式差异往往决定训练走向。 神经网络可能是回归器也可能是分类器,可能是监督也可能是无监督,强化学习还常要 multiplex 地用损失。损失函数的核心活儿,是量化测试参数和预期目标的偏差——这一步就是监督学习的主轴。 别以为无监督就能甩开损失函数。像 Kohonen 映射或聚类,衡量多维数据的距离间隙时,仍要一个标准化量值,损失函数正好补上这个空档。外汇与贵金属市场高波动、高杠杆,任何训练设定都只是概率倾向,实盘前务必在 MT5 用历史数据回测验证。

「MT5 里 14 种损失梯度的实战取舍」

MT5 的向量类型内建了 14 种损失函数量化方法,本小节先过其中 8 种核心逻辑。需要提醒的是,外汇与贵金属杠杆交易属高风险,以下仅作技术验证参考,不预示任何收益。

均方误差(MSE)取预测向量 y^ 与目标向量 y 之差的平方均值,公式 1/n·Σ(y^ᵢ−yᵢ)²。它对大误差平方惩罚重、梯度平滑,适合梯度下降,但异常值会扭曲训练。平均绝对误差(MAE)去掉平方,公式为 1/n·Σy^ᵢ−yᵢ,单位与目标一致、对异常值钝感,但微分输出在 +1/−1/0 间跳变,回归收敛不如 MSE 顺。

类别交叉熵(CCE)永远输出多维向量,衡量预测概率分布 p 与实际独热编码 y 的差距:−Σ y·log(p)。它配 Soft-Max 输出各类概率,对数项重罚「高置信但错判」,类别过多易过拟合。二元交叉熵(BCE)是其两类特例,输出 0~1 概率,宜配 hard-sigmoid,内建返回正负类两个概率的向量。 Kullback-Leibler 散度 Σ P·log(P/Q) 衡量预测 P 与真实 Q 的发散,0 表无偏、上不封顶;它对零概率敏感(遇零则另一项趋无穷),且不对称,迁移学习吃亏。余弦相似性走方向路线:A·B/(‖A‖·‖B‖),尺度不变、算力低,适合文本嵌入类高维数据,但范数为零则未定,也不满足三角不等式,不能当严格量值。 泊松损失针对可数离散数据,梯度为 y^ᵢ−yᵢ 的向量形式,可投喂蜡烛涨跌类型让网络预测未来 N 根中某类蜡烛数;要求均值≈方差,否则表现差,且仅限正值。Huber 损失由 Delta 切分线性和二次区:小误差似 MAE、大误差似 MSE,鲁棒回归首选,但分段公式与理想 Delta 判定偏繁琐,MQL5 标准库未公开其增量算细节,建议配线性激活。 下面这段脚本可直接在 MT5 跑,切换 __loss 输入就能观察不同损失梯度。把 _a 当预测、_b 当目标,例如 {1,2,4} 对 {4,12,36} 在 LOSS_HUBER 下的梯度与标量损失会一并打印,验证上面说的分段行为。

MQL5 / C++
class="macro">#class="kw">property  script_show_inputs
input ENUM_LOSS_FUNCTION __loss = LOSS_HUBER;
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Script program start function                                    |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
  {
class=class="str">"cmt">//---
   vector _a = {class="num">1.0, class="num">2.0, class="num">4.0};
   vector _b = {class="num">4.0, class="num">12.0, class="num">36.0 };
   
   vector _loss = _a.LossGradient(_b,__loss); 
   
   printf(__FUNCSIG__+" for: "+EnumToString(__loss));
   Print(" loss gradient is: ",_loss);
   PrintFormat(" class="kw">while loss is: %.5f. ",_a.Loss(_b,__loss));
  }
class=class="str">"cmt">//+------------------------------------------------------------------+

◍ 回归网络该配什么损失与输出

做回归网络,目标不是分类型别而是吐出一串连续实数,输出跨度往往很宽。要让优化器把预测值和真实值之间的大偏差压下去,MSE 是首选:它对误差是二次惩罚,大错立刻被放大,梯度下降会快速把偏差收窄,而且函数平滑、好求导,契合连续数据。 但回归网络最怕异常值把权重带偏。MSE 的二次惩罚在这里反而吃亏,MAE 改成线性惩罚,对离群点明显更钝感,在嘈杂行情序列里更稳,给出的平均误差量值也更具鲁棒性。 想在灵敏和耐造之间取平衡,Huber-损失把两套性质揉在一起,小误差走二次、大误差走线性,还保留平滑可微。至于输出层激活,常规建议用线性或恒等激活,不约束量级以保留数据可变性;但我更信有约束输出,Soft-Sign 和 TANH 能把正负实数都吃进 -1.0 到 +1.0 的区间,反向传播时不容易梯度膨胀或消失,这俩毛病在 MT5 上跑神经网络最头疼。 外汇与贵金属波动烈度高、跳空频繁,用这类网络做价格回归务必用小样本先做离线与在线一致性校验,异常值处理不当模型可能直接失真。

常见问题

建议先根据任务类型选损失函数,再倒推网络输出层和结构,避免后面改起来返工。
不能混用。回归常用均方误差类损失,分类用交叉熵类,输出层激活也要配套改。
可以。小布能根据你是做回归还是分类、数据分布特征,给出损失函数与输出层搭配建议。
有影响。带正则项的损失梯度更平滑,泛化倾向更好,纯基础写法在噪声数据上更易过拟合。
多数场景用 MSE、MAE、Huber 和交叉熵四种就能覆盖,其余按极端分布再取舍。