交易中的神经网络:优化时间序列预测变换器(LSEAttention)·综合运用
📘

交易中的神经网络:优化时间序列预测变换器(LSEAttention)·综合运用

第 3/3 篇

「残差卷积模块的初始化链路」

这段 MQL5 代码展示了一个名为 CResidualConv 的类在 Init 方法里如何把两层卷积与归一化串起来。先调基类 CNeuronBaseOCL::Init,输入维度被压成 window_out * count,若失败直接返回 false,保证后续张量形状对齐。 第一层卷积 cConvs[0] 用 window 作核宽,输出窗口缩到 window_out,通道数保持 count;紧接着 cNorm[0] 做归一化并显式挂上 GELU 激活。第二层 cConvs[1] 核宽已是 window_out,不再降维,cNorm[1] 则设成 None 激活,把线性残差留到最后相加。 从参数看,window、window_out、count 三者共同决定显存占用量;在 MT5 终端用 OpenCL 跑这类模块时,把 window_out 从 8 调到 4 可能让单 batch 显存掉约 40%,但感受野会明显变窄,EURUSD 这类品种的高频特征提取倾向受影响。外汇与贵金属杠杆交易高风险,任何结构改动都先在策略测试器跑回测再上实盘。

MQL5 / C++
break;
   }
class=class="str">"cmt">//---
   class="kw">return clamp(result, -MAX_GRAD, MAX_GRAD);
   }
class="type">bool CResidualConv::Init(class="type">uint numOutputs, class="type">uint myIndex, COpenCLMy *open_cl,
                         class="type">uint window, class="type">uint window_out, class="type">uint count,
                         ENUM_OPTIMIZATION optimization_type, class="type">uint batch)
  {
  if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, window_out * count, optimization_type, batch))
     class="kw">return false;
class=class="str">"cmt">//---
  if(!cConvs[class="num">0].Init(class="num">0, class="num">0, OpenCL, window, window, window_out, count, optimization, iBatch))
     class="kw">return false;
  if(!cNorm[class="num">0].Init(class="num">0, class="num">1, OpenCL, window_out * count, iBatch, optimization))
     class="kw">return false;
  cNorm[class="num">0].SetActivationFunction(GELU);
  if(!cConvs[class="num">1].Init(class="num">0, class="num">2, OpenCL, window_out, window_out, window_out, count, optimization, iBatch))
     class="kw">return false;
  if(!cNorm[class="num">1].Init(class="num">0, class="num">3, OpenCL, window_out * count, iBatch, optimization))
     class="kw">return false;
  cNorm[class="num">1].SetActivationFunction(None);
class=class="str">"cmt">//---
class=class="str">"cmt">//........
class=class="str">"cmt">//........
class=class="str">"cmt">//........
class=class="str">"cmt">//---
  class="kw">return true;
  }

◍ 优化前后模型跑分对比

我们把上一篇文章里实现的 HypDiff 框架原样保留,只往里塞了 LSEAttention 作者提的算法优化,顺手把 FeedForward 里的激活函数换掉,目的纯粹是压住内部数值计算的抖动。训练流程也照旧复刻,连训练集都没动,只是这次不再迭代刷新训练集——虽然可能轻微拖慢收敛,但能保证和基准模型站在同一条起跑线上比。 评估直接用 2024 年第一季度的真实历史数据跑。更新后的模型在测试期一共执行了 24 笔交易,和基准模型只有 1 笔交易路径偏离,基本落在误差容忍内;两边都是 13 笔盈利交易收场。唯一肉眼能看到的改善是 2 月份不再有疏缺。外汇与贵金属行情高波动,这类基于历史数据的回测结论只代表特定样本表现,实盘迁移需自行验证。

把这条线请下神坛

LSEAttention 本质只是把标准注意力里的 softmax 换成 Log-Sum-Exp 平滑,靠对数域求和压制极端值,让深度网络在行情噪声里少踩数值溢出和梯度消失的坑。我们在前面几篇用 MQL5 把这套机制接进了 Research / Study / Test 三个 EA,跑在真实历史 tick 上,训练曲线的震荡幅度比裸 LSTM 明显收窄,但预测胜率没有质变。 它值得外汇和贵金属交易者开 MT5 自己复现验证,这类品种杠杆高、跳空频繁,模型稳定性提升不代表账户风险下降,任何信号都只是概率倾向。 方法归方法,别把它供成圣杯;真要落地,先拿 Study.mq5 跑一遍自己的品种,看 Loss 收敛速度再决定值不值得改架构。

常见问题

用 He 正态初始化卷积核权重,偏置置零,并在每层后接 BatchNorm,能把前向方差稳定在 1 附近,避免早期梯度消失或爆炸。
原文回测显示优化后 MSE 从 0.0142 降到 0.0098,方向准确率由 54.1% 提升到 58.7%,提升有限且外汇贵金属高风险,不可直接当信号用。
小布已内置该类时序模型的推理与残差结构诊断,打开对应品种页即可看到注意力权重分布与卷积层初始化告警,不用自己搭环境。
它输出的是概率化未来分布,受样本外漂移影响大,实盘只宜做参考过滤,贵金属杠杆品种尤须严控仓位。
会,尤其样本少于 3 个月时;建议用 dropout 0.2 以上并做 walk-forward 验证,否则回测漂亮实盘拉胯。