神经网络变得轻松(第二十七部分):深度 Q-学习(DQN)·综合运用
「奖励回填与双网络权重同步」
这段逻辑处在强化学习训练循环的收口位置,先把本轮三笔动作奖励写回 Rewards 容器,再触发反向传播。注意第一分支里负奖励叠加了 DiscountFactor 乘以后视窗口第 3 格(越界时取 0)的折现值,第二分支则对三笔奖励分别用 2*reward、−reward、reward 加权,并各自挂接 TargetNet 的 0、1、3 号状态值。 若任意一次 Rewards.Add 返回失败就直接 return,不继续 backProp,避免脏梯度污染 StudyNet。backProp 拿到指针后只跑一次,说明奖励向量与网络输出维度严格对齐。 训练末段把 StudyNet 存成 .nnw 文件,紧接着用 TargetNet.Load 读回同一文件完成目标网络同步;PrintFormat 打出 Iteration 与 loss 五位小数,方便在 MT5 专家日志里观察收敛。外汇与贵金属行情高波动,这类自学习参数在实盘前须用历史数据充分回测,过拟合概率不低。
!Rewards.Add((class="type">class="kw">float)(-reward + (use_target ? DiscountFactor * TempData.At(TempData.Maximum(class="num">0, class="num">3)) : class="num">0))) class="kw">return; } else if(!Rewards.Add((class="type">class="kw">float)(class="num">2 * reward + (use_target ? DiscountFactor * TempData.At(class="num">0) : class="num">0))) || !Rewards.Add((class="type">class="kw">float)(-reward + (use_target ? DiscountFactor * TempData.At(class="num">1) : class="num">0))) || !Rewards.Add((class="type">class="kw">float)(reward + (use_target ? DiscountFactor * TempData.At(TempData.Maximum(class="num">0, class="num">3)) : class="num">0)))) class="kw">return; if(!StudyNet.backProp(GetPointer(Rewards))) class="kw">return; } if(!StudyNet.Save(FileName + ".nnw", StudyNet.getRecentAverageError(), class="num">0, class="num">0, Rates[i].time, class="kw">false)) class="kw">return; class="type">class="kw">float temp1, temp2; if(!TargetNet.Load(FileName + ".nnw", dError, temp1, temp2, dtStudied, class="kw">false)) class="kw">return; use_target = true; PrintFormat("Iteration %d, loss %.5f", iter, StudyNet.getRecentAverageError()); } Comment(""); class=class="str">"cmt">//--- ExpertRemove(); }
◍ EURUSD 两小时帧上的卷积验证
把前面那套卷积思路直接压到 EURUSD 的 H1 数据上跑了两轮完整年度,指标全部走默认参数,避免人为调参带来的过拟合错觉。 网络骨架是这样搭的:首层吃 240 个输入(20 根蜡烛 × 每根 12 个特征),随后四层卷积窗口从 24 一路缩到 3,步长同步收窄,滤波器数量控制在 2~6 个;再叠两层 1000 节点的全连接,最后用 3 节点出层对应三种操作。第 2 到第 7 层用 sigmoid,输出层换 tanh。 误差曲线最有说服力:训练刚开始预期奖励的预测误差掉得很快,500 次迭代后就贴近 0 轴,整个 1000 次训练收在 0.00105。外汇和贵金属属高风险品种,这个误差只说明历史样本内拟合程度,实盘迁移要先开 MT5 用默认参数复跑再谈。
深度 Q 学习在 MT5 里的可行性落点
DeepMind 在 2013 年提出的深度 Q 学习,第一次让单一模型架构在不改结构、不动超参数的前提下,跨任务训出可用策略。这相比传统 EA 的显式规则,是训练范式层面的切换,外汇与贵金属这类高波动品种上,策略失效概率仍偏高,需实盘前充分回测。 我们在 MQL5 里已经跑通了这套方法的骨架,测试输出证明用深度强化学习构建可工作的交易模型是可能的,而不是停留在论文层面。下一步可接着看 Atari 控制任务里的价值函数逼近细节,再迁移到 tick 级决策。 相关延伸可顺手翻两篇:用深度强化学习玩 Atari 的入门实现,以及迁移学习在第二十五、二十六部分的实战拆解,前者帮你建立环境奖励设计直觉,后者直接给可抄的神经网络组装代码。
「随包附带的三个程序文件」
这套强化学习示例在 MT5 里落地,靠的是三个文件协同:Q-learning.mq5 是训练用的智能系统(EA),NeuroNet.mqh 是封装神经网络结构的类库,NeuroNet.cl 则是跑在 GPU 上的 OpenCL 核心代码库。想直接复现,去下载原 ZIP(约 66.7 KB)解压进 MQL5 目录即可。 有读者在 XAUUSD_t 的 H1 周期上跑 Q-learning EA,迭代 980 次后损失降到 0.75659,但测试器加载时因 OnInit 返回非零码 1 而停止——典型原因是网络文件未随 EA 正确保存或路径不匹配。外汇与贵金属杠杆高、模型过拟合风险大,回测亮眼不代表实盘能复现。 源数据层作者确认就是普通全连接层,不必纠结 240 神经元是否卷积。代码能编译通只是第一步,OpenCL 设备兼容性常卡掉不少人,建议先在本机用 NetCreater 生成小网络验证管线,再谈调参。