交易中的神经网络:定向扩散模型(DDM)·综合运用
「反向传播里的梯度链路与扩散层声明」
这段逻辑处在神经网络的反向计算阶段,每一层都依赖前一层的对象指针来算隐藏梯度,任意一步失败就直接 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 可能让显存占用明显下降,但收敛速度倾向变慢,外汇与贵金属行情高波动下过拟合概率会上升,需自行回测验证。
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 和定向噪声方差调一遍,看验证集损失什么时候开始抖——那一刻就是该停的边界。