交易中的神经网络:时空神经网络(STNN)·综合运用
(3/3)· 前两篇铺垫了理论与结构,这一篇把编码器-解码器真正落到回测与实盘诊断
自编码器训练循环里的反向传播与超时打印
这段逻辑处在自编码器离线训练的主循环尾部,负责把目标状态灌入解码器做反向传播,并顺带把编码器的梯度回传清零。任何一步 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() 自卸脚本。外汇与贵金属历史样本训练涉及极高杠杆风险,模型误差低不代表实盘能规避回撤,验证前先用小额或模拟盘跑通整链。
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 里复现,先把这八个文件原样丢进对应目录,缺任意一个都会编译报错。 外汇与贵金属市场高杠杆、高波动,这类神经网络方案仅提供概率倾向,实盘前务必用历史数据自测,别直接挂真金白银。