交易中的神经网络:具有相对编码的变换器·综合运用
📘

交易中的神经网络:具有相对编码的变换器·综合运用

第 3/3 篇

RMAT 神经元的初始化与层堆叠逻辑

CNeuronRMAT 是 MT5 中基于相对自注意力机制封装的神经网络层类,构造与析构为空实现,真正的资源分配放在 Init 里。 Init 接收 window、units_count、heads、layers 等参数,先调用基类 CNeuronBaseOCL::Init,输入维度被强制拉成 window * units_count,这一步决定了后续张量的内存布局。 核心循环按 layers 数量重复:每层先 new 一个 CNeuronRelativeSelfAttention,再 new 一个 CResidualConv,二者索引分别为 i*2 与 i*2+1,任一创建或初始化失败立即 delete 并返回 false。 循环结束后,把最后一层 conv 的输出与梯度指针透传给本神经元,作为前向传播出口。外汇与贵金属行情的高波动可能让这类深层结构过拟合,实盘前建议在 MT5 策略测试器里用 2020—2023 年 XAUUSD 的 M15 数据先跑一遍层数与 heads 的消融。 下面这段是 Init 的原文实现,逐行对应上文结构: CNeuronRMAT::Init 头部声明参数并转交基类初始化,窗口乘单元数即输入宽度。 for 循环里 attention 与 conv 成对加入 cLayers,索引错位避免冲突。 末尾 SetOutput / SetGradient 绑定卷积层张量,函数返回 true 表示整网就绪。

MQL5 / C++
class="type">bool CNeuronRMAT::Init(class="type">uint numOutputs, class="type">uint myIndex, COpenCLMy *open_cl,
                       class="type">uint window, class="type">uint window_key, class="type">uint units_count, class="type">uint heads,
                       class="type">uint layers, ENUM_OPTIMIZATION optimization_type, class="type">uint batch)
  {
  if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, window * units_count, optimization_type, batch))
     class="kw">return false;
   cLayers.SetOpenCL(OpenCL);
   CNeuronRelativeSelfAttention *attention = NULL;
   CResidualConv *conv = NULL;
   for(class="type">uint i = class="num">0; i < layers; i++)
     {
       attention = new CNeuronRelativeSelfAttention();
       if(!attention ||
          !attention.Init(class="num">0, i * class="num">2, OpenCL, window, window_key, units_count, heads, optimization, iBatch) ||
          !cLayers.Add(attention)
         )
         {
          class="kw">delete attention;
          class="kw">return false;
         }
       conv = new CResidualConv();
       if(!conv ||
          !conv.Init(class="num">0, i * class="num">2 + class="num">1, OpenCL, window, window, units_count, optimization, iBatch) ||
          !cLayers.Add(conv)
         )
         {
          class="kw">delete conv;
          class="kw">return false;
         }
     }
   SetOutput(conv.getOutput(), true);
   SetGradient(conv.getGradient(), true);
class=class="str">"cmt">//---
   class="kw">return true;
  }

◍ 逐行拆开前向传播与编码层配置

下面这段 MQL5 片段分两块:先是神经网络各层的前向传播串联,再是第二编码层的描述符填充。两者都在 OpenCL 环境下跑,任何一层 FeedForward 返回 false 都会直接中断构建,实战中若 MT5 终端报 false,优先查前一层张量维度是否对得上。 前向部分从 cLayers[0] 取首层神经元,调用 FeedForward 灌入 NeuronOCL;循环从 i=1 开始,每层都拿前一层 cLayers[i-1] 当输入。这种链式调用意味着第 3 层若失败,问题可能出在第 2 层输出形状,而不是第 3 层本身。 第二层描述符里有几个硬参数值得记:window_out 设为 EmbeddingSize/2,注释标明这是 Key Dimension;layers=5 代表堆叠层数,step=4 对应注意力头数,batch=1e4 即每批一万条样本。优化器选 ADAM、激活函数设 None,说明该层可能只做线性投影。若你在小布盯盘里复现,EmbeddingSize 建议先取 64,这样 window_out 自动落为 32,显存占用更可控。外汇与贵金属行情高波动,这类模型易过拟合,回测盈利不代表实盘概率占优。

MQL5 / C++
  CNeuronBaseOCL *neuron = cLayers[class="num">0];
  if(!neuron.FeedForward(NeuronOCL))
    class="kw">return false;
  for(class="type">int i = class="num">1; i < cLayers.Total(); i++)
    {
     neuron = cLayers[i];
     if(!neuron.FeedForward(cLayers[i - class="num">1]))
       class="kw">return false;
    }
class=class="str">"cmt">//---
  class="kw">return true;
  }
class=class="str">"cmt">//--- layer class="num">2
  if(!(descr = new CLayerDescription()))
    class="kw">return false;
  descr.type = defNeuronRMAT;
  descr.window=BarDescr;
  descr.count=HistoryBars;
  descr.window_out = EmbeddingSize/class="num">2;                    class=class="str">"cmt">// Key Dimension
  descr.layers = class="num">5;                                     class=class="str">"cmt">// Layers
  descr.step = class="num">4;                                       class=class="str">"cmt">// Heads
  descr.batch = class="num">1e4;
  descr.activation = None;
  descr.optimization = ADAM;
  if(!encoder.Add(descr))
    {
     class="kw">delete descr;
     class="kw">return false;
    }

「EURUSD 上跑出来的 60% 胜率样本」

R-MAT 框架里三个模型——账户状态编码器、参与者、评论者——按前文算法同步训练:编码器负责把市场状态翻成可输入表示,参与者出交易动作,评论者给动作打分并指调整方向。训练数据取 EURUSD 2023 全年 H1 真实历史,指标全用默认值,迭代训练并周期性刷新数据集。 验证切到 2024 年 1 月历史:政策胜率 60%,平均与最大盈利均高于对应亏损。但整段测试只跑了 15 笔,余额曲线月初拉升后走平。外汇与贵金属属高风险品种,这种小样本结果只能看作潜力信号,远未到可长期托管的程度。 想自己复现,把训练窗口和测试窗口按上述切分丢进 MT5 策略测试器,重点看 15 笔之后的曲线是否还活着——若仍走平,说明策略对后续 regime 没捕捉能力,得回编码器和奖励函数里动刀。

把这条线请下神坛

R-MAT 把市场因素的相对距离和时态依赖塞进同一套注意力结构,理论上能抓到传统线性模型漏掉的非独立关系。我们在 MQL5 里落地了从样本采集(Research.mq5 / ResearchRealORL.mq5)到训练(Study.mq5)、测试(Test.mq5)的全链,配套 NeuroNet.mqh 与 OpenCL 的 NeuroNet.cl 跑通了真实数据回测,结果只说明它有进一步优调的空间,而非可直接上线的圣杯。 外汇与贵金属属高风险品种,任何神经网络预测都只是概率倾向,实盘前至少把 Test.mq5 在 MT5 策略测试器用近 3 年数据重跑一遍,观察夏普与最大回撤再决定。 模型文件总包 1976.95 KB,下载后先单步调 Trajectory.mqh 里的状态字段,确认和你的品种 tick 结构对得上,再谈训练——别把论文潜力当成账户余额。

常见问题

建议用服从均匀分布的微小随机值做初始化,范围控制在 [-0.05, 0.05],层堆叠不超过 4 层以免梯度消失。
原文样本在 EURUSD 特定时段回测约 60% 胜率,属概率倾向而非保证,外汇高风险实盘需自验。
小布盯盘的 AIGC 已内置这类诊断,打开对应品种页即可看到编码层输出与信号倾向,不用自己写代码。
常见坑是相对位置索引没归一化,导致数值尺度爆炸;逐行拆代码时先确认输入已做标准化。
样本胜率依赖历史分布,换周期或品种可能失效;把它当概率工具而非必涨依据,才不易亏在过拟合。