交易中的神经网络:定向扩散模型(DDM)·综合运用
📘

交易中的神经网络:定向扩散模型(DDM)·综合运用

第 3/3 篇

「反向传播里的梯度链路与扩散层声明」

这段逻辑处在神经网络的反向计算阶段,每一层都依赖前一层的对象指针来算隐藏梯度,任意一步失败就直接 return false 中断。注意 cRevIn 的梯度先经过 SumAndNormilize 做归一化,权重系数传的是 1、normalize=false、偏移与缩放全为 0,意味着只做累加不做标准化。 链路顺序是从残差层 cResidual 往上走,经 cAttention[1]、cNeck、cMergeSplit[0]、cAttention[0] 一直到 cAddNoise,最后再把 cAddNoise 与 cResidual 的梯度合并写回。这种串行依赖决定了调参时若改了某一层的输出维度,后面所有 AsObject() 调用都可能拿到错位指针。 第二层网络用 CLayerDescription 显式建了一个扩散层:type=defNeuronDiffusion,count 与 window 都绑定 HistoryBars 和 BarDescr,layers=2、step=3。heads 数组写死为 {4},即 4 个注意力头;batch 设成 1e4,优化器选 ADAM,激活函数为 None。 在 MT5 里跑这类模型时,把 descr.batch 从 1e4 下调到 2e3 可能让显存占用明显下降,但收敛速度倾向变慢,外汇与贵金属行情高波动下过拟合概率会上升,需自行回测验证。

MQL5 / C++
if(!SumAndNormilize(cRevIn.getGradient(), Gradient, cRevIn.getGradient(), class="num">1, false, class="num">0, class="num">0, class="num">0, class="num">1))
   class="kw">return false;
if(!cResidual.calcHiddenGradients(cRevIn.AsObject()))
   class="kw">return false;
if(!cAttention[class="num">1].calcHiddenGradients(cMergeSplit[class="num">1].AsObject()))
   class="kw">return false;
if(!cNeck.calcHiddenGradients(cAttention[class="num">1].AsObject()))
   class="kw">return false;
if(!cMergeSplit[class="num">0].calcHiddenGradients(cNeck.AsObject()))
   class="kw">return false;
if(!cAttention[class="num">0].calcHiddenGradients(cMergeSplit[class="num">0].AsObject()))
   class="kw">return false;
if(!cAddNoise.calcHiddenGradients(cAttention[class="num">0].AsObject()))
   class="kw">return false;
if(!SumAndNormilize(cAddNoise.getGradient(), cResidual.getGradient(), cAddNoise.getGradient(), class="num">1,
                                                                             false, class="num">0, class="num">0, class="num">0, class="num">1))
   class="kw">return false;
   if(!prevLayer.calcHiddenGradients(cAddNoise.AsObject()))
       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 = defNeuronDiffusion;
   descr.count = HistoryBars;
   descr.window = BarDescr;
   descr.window_out = BarDescr;
   descr.layers=class="num">2;
   descr.step=class="num">3;
   {
       class="type">int temp[] = {class="num">4};                                        class=class="str">"cmt">// Heads
       if(ArrayCopy(descr.heads, temp) < (class="type">int)temp.Size())
         class="kw">return false;
   }
   descr.batch = class="num">1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!encoder.Add(descr))
     {
       class="kw">delete descr;
       class="kw">return false;
     }

EURUSD 实测:低频但盈亏比突出

我们用 EURUSD 的 2023 年真实数据在 H1 周期训练了按定向扩散思路搭的模型,并定期更新训练集以贴合参与者当前政策。测试参数与基线保持一致,跑的是 2024 年前三个月的行情。 测试期内模型只成交了 10 笔,频率极低;其中仅 4 笔盈利。不过盈利交易的平均和最大利润约为亏损交易的 5 倍,最终盈利因子落到 3.28。 外汇与贵金属属高风险品种,这种低频策略在外盘实盘可能因滑点、点差扩张而偏离回测。该结果说明模型盈亏比结构不错,但样本太少,下一步该在不牺牲品质的前提下抬升交易频率。

◍ 收束

把定向噪声塞进扩散过程,DDM 比传统各向同性模型更贴合金融市场的各向异性——外汇与贵金属受宏观驱动,方向性形态突出,高波动环境里也更容易捞出关键趋势,但这类品种杠杆高、跳空频繁,实盘前务必用小资金验证。 我们这套 MQL5 实现里,Research.mq5 到 Test.mq5 四个 EA 加上 Trajectory.mqh、NeuroNet.mqh、NeuroNet.cl 三个库,已能在 MT5 用真实历史跑通训练与样本外测试;当前版本只是证明了潜力,推理延迟和过拟合都还没压下去。 真要落地,先打开 Study.mq5 把 epoch 和定向噪声方差调一遍,看验证集损失什么时候开始抖——那一刻就是该停的边界。

常见问题

低频是DDM的特性,EURUSD实测中单周信号常低于5次但盈亏比突出;先确认扩散层声明与梯度链路连通,别盲目加频次。
梯度不回传时扩散层权重停滞,输出长期偏离;可在日志看loss是否flat,断链需检查层间声明是否漏写。
小布可加载你的品种页并内置AIGC诊断,自动标出梯度断链与扩散层异常,你只管看结论调参。
贵金属波动更跳,扩散层需调低噪声尺度;外汇贵金属均属高风险,实盘前用历史分段验证盈亏比。
连续两周信号胜率跌破基线且梯度方差异常放大,倾向停用以避过拟合;收束看回测衰减即可。