您应当知道的 MQL5 向导技术(第 34 部分):采用非常规 RBM 进行价格嵌入·综合运用
🧠

您应当知道的 MQL5 向导技术(第 34 部分):采用非常规 RBM 进行价格嵌入·综合运用

(3/3)·把 RBM 与 MLP 集成进 EA 回测,看非常规嵌入如何改写交易信号结构

实战向进阶 第 3/3 篇
多数人把 RBM 当成只能靠吉布斯采样的概率玩具,不敢塞进 MQL5 向导做实盘原型。其实在 GPU 算力下用反向传播训 RBM,反而能绕开对比散度的近似偏差。本篇把前两次的铺垫收口成可回测的集成方案。

◍ 把 RBM 隐藏分布喂给 MLP 的 Extractor 实现

RBM 训练完权重后,拿到的是价格数据的概率分布,也就是所谓的价格嵌入,而不是原始的价格变化量。这个嵌入在 Extractor 函数里被直接转交给 MLP;如果此时带有标签(目标值),MLP 会同步训练,否则只做前向推理。 关键点在训练边界的控制。最近的价格变化不能当成标签,所以必须持续跟踪是否还在训练集内。Extractor 的第三个输入参数是布尔量 Train,默认 true;一旦跑完训练集且没有标签,就置为 false,停止反向传播。 RBM 结构偏分类器(有激活和损失函数),但 MLP 在这里更适合当回归器:它的单浮点输出可为负,所以用 soft-sign 激活加 Huber 损失。两个网络目前都没精细调参——它们共用初始权重和乖离、学习率固定、且并发训练(一个会话训两个网)。更合理的做法可能是先训完 RBM 再单独训 MLP,或给两者不同规模会话与自适应学习率,这些留给你在 MT5 里验证。 下面这段是 Extractor 的 MQL5 源码,返回向量 _extraction,实际只取下一次价格变化那一个值: //+------------------------------------------------------------------+

//

//+------------------------------------------------------------------+ vector CSignalEmbedding::Extractor(vector &Embedding, vector &Labels, bool Train = true) { vector _extraction; _extraction.Init(MLP.output.Size()); m_learning.rate = m_learning_rate; for(int i = 1; i <= m_epochs; i++) { MLP.LearningType(m_learning, i); MLP.Set(Embedding); MLP.Forward(); _extraction = MLP.output; if(Train) { MLP.Get(Labels); MLP.Backward(m_learning, i); } } return(_extraction); } 逐行拆解: 第1行:定义 Extractor 成员函数,接收嵌入向量、标签向量和训练开关(默认开)。 第3行:声明返回向量 _extraction。 第4行:按 MLP 输出尺寸初始化提取向量。 第5行:把类内学习率赋给本次训练用学习率。 第6行:按 epoch 数循环训练。 第8行:设置 MLP 当前轮次的学习类型。 第9行:把嵌入向量塞进 MLP 输入。 第10行:前向计算拿输出。 第11行:把 MLP 输出存到提取向量。 第12行:若 Train 为真才进训练分支。 第14行:把标签灌给 MLP。 第15行:反向传播更新权重。 第18行:返回提取结果。 外汇与贵金属市场波动剧烈、杠杆风险高,任何模型输出都只是概率倾向,实盘前请用历史数据充分回测。

MQL5 / C++
vector CSignalEmbedding::Extractor(vector &Embedding, vector &Labels, class="type">bool Train = true)
{  vector _extraction;
   _extraction.Init(MLP.output.Size());
   m_learning.rate = m_learning_rate;
   for(class="type">int i = class="num">1; i <= m_epochs; i++)
   { MLP.LearningType(m_learning, i);
     MLP.Set(Embedding);
     MLP.Forward();
     _extraction = MLP.output;
     if(Train)
     { MLP.Get(Labels);
       MLP.Backward(m_learning, i);
     }
   }
   class="kw">return(_extraction);
}

「GBPUSD 日线神经网络权重与阈值的优化实况」

我们拿 GBPUSD 的 2023 年日线数据跑了一遍优化,目标只有两个:找到两个神经网络的理想初始权重与乖离,以及自定义信号类里 LongCondition / ShortCondition 的开关仓阈值和以点数为单位的止盈。注意,这两个网络各自只暴露一个输入参数,结构上并不算充裕,调参空间天然受限。 这轮跑的只是非穷举式的若干次运行,向导拼出来的智能系统确实能下单,但样本仅覆盖单年日线。要确认稳健性,还得拉长历史回测并做前向游走(walk-forward)通验,靠单次优化直接信得过的概率偏低。 外汇与贵金属属高风险品种,神经网络信号尤其吃权重与偏差设定。实操上务必把两套网络的权重和偏差做版本化记录与保存,否则换环境重跑优化会直接丢失已得的信号逻辑。

把工具请下神坛

衡量 RBM 作为价格嵌入器的有效性,最直接的办法是拉一个纯 MLP 信号做对照组:它吃原始先验价格变化,用和本文 MLP 相同的锚点类做二手训练去预测下一帧价格变化。这套对照搭建成本不高,跑一年回测就能看出嵌入器是否真把信噪比拉开了。 把 RBM 直接喂进 MLP、而非绕路预处理,分类器与回归器协同的实测表现通常更好。回归器大多吐单个浮点值(可负),借分类输入做配对在逻辑上站得住;后续扩展建议并行排多个 RBM 当变换器提示,而不是堆深度——深度分类器比深度回归器更适合做专业化。 价格变化不是唯一的嵌入素材。蜡烛形态、指标值、经济日历新闻都能塞给 MLP 找嵌入,但每种源的外汇与贵金属测试结果差异极大,且杠杆品种高风险,须由你按自己盯盘习惯定制。文件包里 Cmlp-.mqh 与 C_u_rbm.mqh 已给出可编译骨架,开 MT5 挂上 wz_34.mq5 改一组输入源,比争论哪种网络更神来得实在。

把嵌入诊断交给小布盯盘
这些 RBM 降维后的价格嵌入分布,小布盯盘的 AIGC 已内置可视化,打开对应品种页即可看到隐含层激活是否钝化,你只管判断信号可信度。

常见问题

RBM 虽仅显层与隐层两层,但每层神经元规模大且无层内连接限制外的全互联,反向传播时梯度需跨整层协同更新,等价于深宽网络的计算负担。
倾向先用 RBM 做无监督降维冻结隐层,再接 MLP 做有监督输出;回测中用 walk-forward 切分降低曲线依赖,概率上更稳。
可以,小布盯盘的 AIGC 模块支持导入向导导出的嵌入向量,对异动品种标出隐层重构误差,省去手动跑脚本。
吉布斯采样依赖分区函数近似,在金属外汇高频跳空下偏差放大;反向传播逐参优化更适配当前 GPU 环境,重构误差可能更低。
有,非常规 RBM 嵌入本质是造出一族低相关信号源,缓解系列开篇提的证券间正相关困境,外汇贵金属高风险下尤需注意仓位。