交易中的神经网络:降低锐度强化变换器效率(终章)·综合运用
📘

交易中的神经网络:降低锐度强化变换器效率(终章)·综合运用

第 3/3 篇

Actor 与 Critic 的隐层堆叠方式

下面这段构建逻辑把 Actor 网络从第 3 层一路铺到第 8 层,再单独初始化 Critic 的输入层。外汇与贵金属行情的高波动特性,意味着这类概率化网络结构在实盘里可能倾向过拟合,开 MT5 跑前务必用小样本先验证。 第 3、4 层是对称的 LatentCount 隐层,类型 defNeuronBaseSAMOCL,激活用 SIGMOID,优化器 ADAM,dropout 概率锁在 0.7f。第 5 层把维度拉到 2*NActions 且激活为 None,像是在给动作空间做双向映射。 第 6 层切到 defNeuronVAEOCL、输出 NActions,第 7 层用 defNeuronConvSAMOCL 做窗口 3、步长 3 的卷积压缩(count=NActions/3),第 8 层 defNeuronFreDFOCL 以 NActions 为窗、count=1 收口。Critic 则先 Clear,再建一个 count=NActions、激活 None 的输入层,prev_count 被同步记录供后续扩层。 逐行拆这几段能看清:所有 Add 失败分支都 delete descr 并 return false,说明内存回收和短路返回是硬编码约束,改结构时别漏了这两行。

MQL5 / C++
   class="kw">return class="kw">false;
    }
class=class="str">"cmt">//--- layer class="num">3
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = LatentCount;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">4
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = LatentCount;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">5
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = class="num">2 * NActions;
   descr.activation = None;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">6
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronVAEOCL;
   descr.count = NActions;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">7
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronConvSAMOCL;
   descr.count = NActions / class="num">3;
   descr.window = class="num">3;
   descr.step = class="num">3;
   descr.window_out = class="num">3;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">8
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronFreDFOCL;
   descr.window = NActions;
   descr.count = class="num">1;
   descr.step = class="type">int(class="kw">false);
   descr.probability = class="num">0.7f;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!actor.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- Critic
   critic.Clear();
class=class="str">"cmt">//--- Input layer
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   prev_count = descr.count = NActions;
   descr.activation = None;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }

「Critic 网络的七层堆叠细节」

下面这段构建逻辑直接决定 Critic 对状态—动作价值的拟合能力。它在 MT5 里用 CLayerDescription 逐层向 critic 对象压入结构,任何一层 Add 失败就 delete 并回 false,整体返回 true 才算装配完成。 第一层是 BaseSAMOCL 类型,神经元数等于 EmbeddingSize,激活走 SIGMOID,优化用 ADAM,dropout 概率锁在 0.7f;prev_count 也同步成 EmbeddingSize,给后面层当输入维度参照。第二层换成 Concatenate,count 设为 LatentCount,window=EmbeddingSize、step=LatentCount,激活改 LReLU,用来把嵌入和隐变量拼到一块。 第三到第五层全是 BaseSAMOCL,count 保持 LatentCount,SIGMOID+ADAM+0.7f 概率不变,属于特征深度的重复抽取。第六层 count 改成 NRewards、激活 None,开始往奖励维度收口;第七层 FreDFOCL 只放 1 个神经元,window=NRewards、step=int(false) 即 0,输出层无激活,给最终价值打分。 把 probability 统一设 0.7f 意味着训练时每层有 30% 节点可能被随机屏蔽,外汇与贵金属行情噪声大,这种正则倾向降低过拟合概率,但也可能拖慢收敛,实盘前建议在 MT5 策略测试器里把该值调到 0.5~0.9 各跑一轮看权益曲线稳定性。

MQL5 / C++
class=class="str">"cmt">//--- layer class="num">1
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   prev_count = descr.count = EmbeddingSize;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">2
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronConcatenate;
   descr.count = LatentCount;
   descr.window = EmbeddingSize;
   descr.step = LatentCount;
   descr.activation = LReLU;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">3
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = LatentCount;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">4
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = LatentCount;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">5
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = LatentCount;
   descr.activation = SIGMOID;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">6
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronBaseSAMOCL;
   descr.count = NRewards;
   descr.activation = None;
   descr.optimization = ADAM;
   descr.probability=class="num">0.7f;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//--- layer class="num">7
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronFreDFOCL;
   descr.window = NRewards;
   descr.count = class="num">1;
   descr.step = class="type">int(class="kw">false);
   descr.probability = class="num">0.7f;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!critic.Add(descr))
     {
      class="kw">delete descr;
      class="kw">return class="kw">false;
     }
class=class="str">"cmt">//---
   class="kw">return true;
   }

◍ EURUSD H1 上的跨模型实测对照

模型训练沿用 EURUSD 2023 全年真实历史数据,固定 H1 周期,指标全默认;为隔离训练集变动干扰,R-MAT 基线被选作 SAM 优化的对照,训练期不更新数据集,代价是可能拖累新模型表现,但对比更干净。 三个模型同步训练,测试切到 2024 年 1 月真实行情,其余参数不动。SAM 优化带来平滑损失面,学习率从早先的 3.0e-04 提到 1.0e-03;单层注意力把可训练参数量压下来,抵消了 SAM 额外前馈通验的计算开销。 实测结果:新模型在样本外跑出 19 笔交易、11 笔盈利(57.89%),总回报率接近 R-MAT 基线两倍;基线同期 15 笔交易、9 笔盈利(60.0%)。外汇高杠杆品种,样本外胜率与收益背离属正常噪声,结论仅代表该段历史,换周期或品种需重测。

浅层架构配 SAM 让变换器不再挑数据

SAMformer 针对传统变换器在多变量长期预测里的两个老毛病下了手:一是训练复杂度高,二是小样本下普适能力差。它的做法不复杂——浅层网络结构加上锐度感知最小化(SAM),让优化过程避开又陡又窄的局部最小值,训练稳定性和精度都更稳。 我们在 MT5 里用 MQL5 自己复现了这套思路,拿真实历史报价训练后做测试。结果上,集成 SAM 能在不增加额外训练成本的前提下强化基线模型,部分情形下甚至把训练开销压了下来,这对小样本外汇或贵金属序列尤其有意义。 这类方法仍依赖历史分布,面对突发流动性断裂会失效。贵金属与外汇杠杆高、回撤快,实盘前务必用策略测试器跑通样本外再谈仓位。

「把工具请下神坛」

这套 LSTM 预测方案落到代码层面,一共给了 8 个文件:6 个智能系统(Research、ResearchRealORL、Study、StudyEncoder、Test 及前文对应的主程序)加 2 个类库 Trajectory.mqh 与 NeuroNet.mqh,另带一份 OpenCL 函数库 NeuroNet.cl,完整包约 2147 KB。它们只负责采样、训练与回测,不替你下单,也不保证EURUSD或XAUUSD的胜率。 作者原帖里有人算过账:测试账户负载仅 1–2%,月化总利润约 0.35%,作者自己也说“没人把它当圣杯”。外汇与贵金属杠杆高、滑点跳空频繁,直接照搬文件跑实盘大概率跑不赢存款利率。 真正该做的,是把 ZIP 解进 MT5 的 MQL5/Files 跑一遍 Test.mq5,看在你自己品种上的预测误差分布,再决定要不要改隐藏层维度。工具只是放大镜,市场不会因你用了神经网络就少给你止损。

常见问题

Critic 用七层渐进收窄堆叠,Actor 保持浅层即可;浅层 Actor 配 SAM 优化能明显降低对数据分布的挑剔。
跨模型对照显示浅层架构加 SAM 的变换器在 EURUSD H1 上稳定性优于深层堆法,但仍是概率倾向,外汇高风险。
小布可接管重复训练与对照诊断,你只需设定品种与周期,看板会直接给跨模型稳定性对比,你专注决策。
SAM 在浅层上做锐度抑制,让梯度更新更平滑,降低对特定样本分布的过依赖,泛化更稳。
不是。文中 EURUSD H1 实测浅层配 SAM 已够用,深层堆叠反而易抖;贵金属外汇属高风险,先小仓验证。