数据科学和机器学习(第 26 部分):时间序列预测的终极之战  LSTM 对比 GRU 神经网络·综合运用
📘

数据科学和机器学习(第 26 部分):时间序列预测的终极之战 LSTM 对比 GRU 神经网络·综合运用

第 3/3 篇

两个循环网络的特征权重差异

LSTM 分类器的特征重要性分布,和此前简单 RNN 模型得到的结论接近:越远时间步的变量权重越低,最近时间步的收盘价类信息权重最高。直观理解就是,当前柱线的方向变化,主要由刚收盘的那根 K 线数据驱动。 GRU 分类器给出的排序则明显不同,它把『前 7 天的星期几』列为影响最大的变量,而最新一根 K 线的开高低收被排到中间档,贡献度相对平均。这种分布大概率源于 GRU 模型本身精度偏低,权重估计不可靠。 在 MT5 里跑完两套模型后,可用下面两行直接取出各自的特征重要性序列,对照列名排查哪类特征被模型倚重。外汇与贵金属品种波动受宏观扰动,此类权重仅反映样本内倾向,实盘高风险。

MQL5 / C++
feature_importance = lstm_clf.check_feature_importance(X.columns)
feature_importance = gru_clf.check_feature_importance(X.columns)

◍ 策略测试器上的 LSTM 与 GRU 分类器

训练后不久,LSTM 和 GRU 分类器模型都保存为 ONNX 格式。 LSTM | Python GRU | Python 将 ONNX 模型及其定标器文件保存在 MQL5\Files 目录下之后,我们可将文件作为资源文件添加到两个智能系统当中。 LSTM GRU 智能系统的其余代码与 我们曾讨论的 相同。 使用自 本系列文章的第 24 部分 以来一直使用的默认设置,我们从时间序列预测开始。 止损:500,止盈:700,滑点:50。 再次,由于数据是在日线时间帧上收集而来,因此在较低的时间帧上对其进行测试可能是个好主意,以遍避免在“ 休市错误 ”时出现错误,因为我们正在新柱线开盘时寻找交易信号。我们还可以将建模类型设置为“开盘价”,从而加快测试速度。 LSTM 智能系统结果 GRU 智能系统结果 我们可以从策略测试器结果中学到什么 尽管模型的准确度较低,只有 44.98%,但基于 LSTM 的智能系统是最有利可图的,净盈利为 138 美元,其次是基于 GRU 的智能系统,尽管总净盈利为 120 美元,但在 45.25% 的时间里盈利。 在这种情况下,LSTM 在 盈利方面 显然是胜者。尽管 LSTM 在技术上比其它同类 RNN 更聪明,但可能是很多因素导致的这种情况,所有递归模型都很不错,并且在某些状况下可以优于其它模型,请随意使用本文和上一篇文章中讨论的任何模型。 [CODE] lstm_clf.build_compile_and_train(best_params, verbose=<span class="number">1</span>) <span class="preprocessor"># </span>best_params = best parameters obtained after optimization lstm_clf.save_onnx_model(<span class="string">"lstm.EURUSD.D1.onnx"</span>) gru_clf.build_compile_and_train(best_params, verbose=<span class="number">1</span>) gru_clf.save_onnx_model(<span class="string">"gru.EURUSD.D1.onnx"</span>) # best_params = best parameters obtained after optimization <span class="preprocessor">#resource </span><span class="string">"\\Files\\lstm.EURUSD.D1.onnx"</span> <span class="keyword">as</span> <span class="keyword">uchar</span> onnx_model[]; <span class="comment">//lstm model in onnx format</span> <span class="preprocessor">#resource </span><span class="string">"\\Files\\lstm.EURUSD.D1.standard_scaler_mean.bin"</span> <span class="keyword">as</span> <span class="keyword">double</

「选 LSTM 还是 GRU:门控结构与代价的实情」

LSTM 与 GRU 同属门控循环网络,但内部机理差出一层。LSTM 用输入、遗忘、输出三个门加一条单元状态通道,能在每个时间步精确决定保留或丢弃什么;GRU 只靠重置门和更新门两个开关,结构更浅,代码层面也更好落地。 训练开销上,LSTM 因多一组门和单元状态,反向传播要更新的参数更多,典型任务里单轮耗时明显高于 GRU。若你在 MT5 用 Python 桥接做日内序列训练,GRU 往往在同等 batch 下快 20%~40%,这对贵金属 1 分钟线滚动训练很关键。 性能边界要看问题长度。捕获超长期依赖(如跨周会话节律)时,LSTM 凭借单元状态通常略占优;但多数短线外汇波动建模中,GRU 与 LSTM 的回测误差常落在同一数量级。内存方面,LSTM 额外参数在显存受限的老显卡上可能直接 OOM,GRU 则更适配资源紧的环境。外汇与贵金属杠杆高,模型仅作概率辅助,实盘前务必小资金验证。

画得少,看得清

LSTM 与 GRU 在 EURUSD D1 上的 ONNX 模型已随文附出,gru.EURUSD.D1.onnx 与 lstm.EURUSD.D1.onnx 各配了 standard_scaler 的 mean/scale 二进制文件,preprocessing.mqh 里封装了还原尺度的函数。实际部署时,EA 只做一件事:读 ONNX 输出下一根 K 的回归值,不堆砌多层特征。 外汇与贵金属属高杠杆品种,深度学习模型在样本外仅具概率优势,实盘前务必用 MT5 策略测试器以 634.47 KB 的 ZIP 内 EA 跑一遍 2020–2023 年数据。 若你改了gru.EURUSD.D1.standard_scaler_scale.bin里的缩放系数,EA 预测会整体偏移,这是调参时最先排查的点。

常见问题

GRU 参数更少、门控更简单,样本外通常比 LSTM 更稳;先用 GRU 跑基线,再决定是否上 LSTM。
看两者特征重要性输出里成交量维度的排序差;GRU 常把权重更均匀铺开,LSTM 会更集中少数维度。
可以。小布盯盘的 AIGC 已内置这类诊断,打开对应品种页就能直接看两个网络的分类倾向与权重差异。
建议不少于 2000 根且覆盖一段明显趋势加一段震荡;少于此量,门控结构差异基本被噪声淹没。
只留 GRU 分类概率带和关键支撑阻力;画得少,看得清,把重复劳动交给小布你专注决策。