您应当知道的 MQL5 向导技术(第 34 部分):采用非常规 RBM 进行价格嵌入·综合运用
(3/3)·把 RBM 与 MLP 集成进 EA 回测,看非常规嵌入如何改写交易信号结构
◍ 把 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行:返回提取结果。 外汇与贵金属市场波动剧烈、杠杆风险高,任何模型输出都只是概率倾向,实盘前请用历史数据充分回测。
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 改一组输入源,比争论哪种网络更神来得实在。