交易中的神经网络:时空神经网络(STNN)·综合运用
🧠

交易中的神经网络:时空神经网络(STNN)·综合运用

(3/3)· 前两篇铺垫了理论与结构,这一篇把编码器-解码器真正落到回测与实盘诊断

进阶 第 3/3 篇
不少人把 STNN 当黑箱直接接行情,却忽略目标变量必须来自输入多元序列本身,否则解码器拿不到时态演变信息。短期窗口选错,维度诅咒会让预测塌成噪声。先弄清数据投喂路径,再谈训练。

自编码器训练循环里的反向传播与超时打印

这段逻辑处在自编码器离线训练的主循环尾部,负责把目标状态灌入解码器做反向传播,并顺带把编码器的梯度回传清零。任何一步 AssignArray 或 backProp 失败,就置 Stop 并 break,避免脏权重写回模型。 Decoder.backProp(Result, GetPointer(Encoder)) 与 Encoder.backPropGradient((CBufferFloat*)NULL) 是前后脚调用的:前者用编码器的指针更新解码器误差,后者以空梯度缓冲收尾编码器侧计算。若返回 false,立即 PrintFormat 打出函数名与行号,方便在 MT5 Experts 日志里定位断层。 训练进度不是每次迭代都刷,而是用 GetTickCount() 做节流——距上次打印超过 500 毫秒才更新。此时按 iter / Iterations 算百分比,用 Comment 在图表左上角显示形如「Decoder 12.34% -> Error 0.00123456」的字符串,实盘跑时眼睛不用切到日志窗。 循环结束清掉 Comment(""),随后 PrintFormat 输出最终 Decoder 平均误差(精度 10.7f),并调 ExpertRemove() 自卸脚本。外汇与贵金属历史样本训练涉及极高杠杆风险,模型误差低不代表实盘能规避回撤,验证前先用小额或模拟盘跑通整链。

MQL5 / C++
        break;
      }
      class=class="str">"cmt">//--- Collect target data
      mstate.Assign(Buffer[tr].States[i + NForecast].state);
      mstate.Reshape(HistoryBars, BarDescr);
      mstate.Resize(NForecast, ForecastBarDescr);
      if(!Result.AssignArray(mstate))
         class="kw">continue;
      if(!Decoder.backProp(Result, GetPointer(Encoder)))
        {
         PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
         Stop = true;
         break;
        }
      if(!Encoder.backPropGradient((CBufferFloat*)NULL))
        {
         PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
         Stop = true;
         break;
        }
      if(GetTickCount() - ticks > class="num">500)
        {
         class="type">class="kw">double percent = class="type">class="kw">double(iter) * class="num">100.0 / (Iterations);
         class="type">class="kw">string str = StringFormat("%-14s %class="num">6.2f%% -> Error %class="num">15.8f\n", "Decoder",
percent, Decoder.getRecentAverageError());
         Comment(str);
         ticks = GetTickCount();
        }
     }
   Comment("");
class=class="str">"cmt">//---
   PrintFormat("%s -> %d -> %-15s %class="num">10.7f", __FUNCTION__, __LINE__, "Decoder", Decoder.getRecentAverageError());
   ExpertRemove();
class=class="str">"cmt">//---
   }

「EURUSD 实盘前测:STNN 在 H1 上的落空」

我们用 EURUSD 2023 全年 H1 历史数据训练时空信息 STNN 模型,再取 2024 年 1 月数据在 MT5 策略测试器里做测试。测试段紧接训练段之后,尽量贴近真实推断环境。 训练只吃历史价格与指标序列,不掺个体动作,所以环境编码器无需反复刷新数据集。跑到预测误差走平就停,但结果挺尴尬:模型只勉强指出趋势大方向,数值上的微小波动小到图表根本画不出来。 这就引出个硬问题——这种幅度的波动,够不够给参与者搭出能盈利的策略?我们按周期更新训练集,迭代训参与者和评论者,本意是压住策略偏移,但测试集上始终没训出持续盈利的参与者策略。 外汇与贵金属属高风险品种,模型回测失手不代表某种方法无效,但至少这套实现和原论文偏差不小,可能直接拖累了结果。开 MT5 用同段数据复跑,比看结论更有用。

◍ 实盘前必须知道的实现偏差

STNN 把多维变量的空间信息通过 STI 方程压进目标变量的时间维度,等价于把样本量做厚,对短周期数据稀薄的问题有一定缓解作用。持续注意力机制负责让模型在多层特征里挑重点,而不是平均对待每一维输入。 我们在 MT5 里用 MQL5 落地了这一思路,但必须点明:当前版本和原始论文算法存在重大偏差,回测或实盘看到的数值,不能直接等同于学术基准下的表现。 外汇与贵金属杠杆高、滑点跳空频繁,任何神经网络预测都只是概率倾向,建议先开 MT5 用历史数据跑通代码再谈仓位。

随包附带的八个文件各管什么

这套 LSTM 预测方案不是只给一段脚本,而是把样本采集、训练、推理拆成了可独立运行的模块。下载的 MQL5.zip(1473.08 KB)里一共 8 个文件,前 5 个是 EA,后 3 个是类库与 OpenCL 内核。 Research.mq5 与 ResearchRealORL.mq5 都是样本收集 EA,区别在后者用 Real ORL 方法处理样本;Study.mq5 做模型训练,StudyEncoder.mq5 单独训编码器;Test.mq5 负责把训好的模型跑测试。 类库层面,Trajectory.mqh 定义系统状态描述结构,NeuroNet.mqh 封装建网逻辑,NeuroNet.cl 则是 OpenCL 端的算核。想在 MT5 里复现,先把这八个文件原样丢进对应目录,缺任意一个都会编译报错。 外汇与贵金属市场高杠杆、高波动,这类神经网络方案仅提供概率倾向,实盘前务必用历史数据自测,别直接挂真金白银。

把重复劳动交给小布
这些 STNN 回测与相空间重造的诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到多变量时空注意力热力,你只管判断信号可信度。

常见问题

它同时过滤输入多元序列里的噪声,为后续连续空间自注意力层提取有效空间信息做准备,避免脏数据放大维度诅咒。
因为 STI 方程把空间信息变换到目标变量的时态,解码器需要目标变量自身的历史片段来组合时空信息,外部变量破坏相空间重造逻辑。
它针对数值预测做了连续性建模修正,缓解离散注意力在短期多步预测里的累积偏移,提高步长外推准确度。
可以,知识库内的 AIGC 模块已封装对应 EA 与指标脚本入口,绑定品种后自动跑文末程序同构的诊断流程,不需手动编译。
会收束 STI 方程与变换器结合的有效性、持续注意力增益,以及实盘高波动下样本量扩增仍受窗口长度约束,完整跨篇脉络见《交易中的神经网络:时空神经网络(STNN)·基础篇》。