第三代神经网络:深度网络·综合运用
🧠

第三代神经网络:深度网络·综合运用

(3/3)·多层感知器到栈式自编码器讲完,真正的坑在R语言训练、数据清洗和EA集成的最后一公里

实战向 第 3/3 篇
很多人把深度网络当黑箱直接丢价格进去,结果过拟合到连历史都认不全。外汇贵金属市场噪声大、样本少,不做好分类平衡和预处理,模型上线就是反向指标。本篇收尾这套三代神经网络系列,重点在怎么让它真正跑在MT5里。

堆叠自编码器三层训练的实际损耗与耗时

用 R 端的神经网络栈做 EURUSD 类标的回测时,先跑三层堆叠自编码器(SAE)做无监督预训练,再接深度网络微调。第一层自编码器在 10000 步损耗 0.000057、20000 步降到 0.000043,第二层在 0.000081 与 0.000086 之间徘徊,第三层从 0.000072 微降到 0.000066,说明三层结构在 300 epoch、学习率 0.7、decay 2 下基本收敛。 接深度网络后损耗明显高一个量级:10000 步 0.069451、20000 步 0.079629,这很正常,因为监督信号比重构误差稀疏得多。整段单模型训练 user 115.78s、elapsed 116.96s,属可接受的本地算力开销。 换集成思路时差距拉开:ans=3 的集成耗时 elapsed 233.64s,ans=4 时到 247.86s,几乎翻倍但 user 时间仍低于 0.3s,瓶颈在并行 IO 而非计算。若把隐藏层从 (30,30,30) 改成 (13,8,5) 且 bar=1000,最大余额曲线峰值 0.04725、期末 0.03514,窄结构未必弱于宽结构。 外汇与贵金属杠杆高,上述 0.04 级别的权益增益只是历史样本内的回测现象,实盘可能因点差和滑点衰减,请先在 MT5 用同样 LR/Ep 跑一遍确认。

「栈式自编码器训练的损耗与耗时实测」

跑了一遍三层栈式自编码器(SAE)叠加深度网络的训练,日志里能直接读出每层收敛情况。第一趟训练里,layer1 自编码器在 step 10000 损失 0.005217、step 20000 降到 0.004846;layer3 在 step 20000 反而从 0.023292 微升到 0.026113,说明浅层压得动、深层可能卡在局部。 整段用户态耗时 64.24 秒,深度网络末步损失 0.056932。第二次调参后(隐藏层 h=c(50,50,50)、LR=0.7、Ep=300)SAE 各层损失全部压到 0.0000x 量级,但深度网络损失反而扩大到 0.084860,用户耗时拉到 186.39 秒,最终权益峰值 max(Bal0) 仅 0.0543。 日志里还抛了一条告警:encoder 权重与 train_x 转置做矩阵乘时,长对象长度不是短对象的整数倍。这通常是样本维度没对齐,开 MT5 接 R 后端前先核对每根 K 线的特征列数,否则 SAE 白跑。外汇与贵金属波动剧烈,此类小样本网络过拟合概率偏高,实盘前务必做样本外验证。

MQL5 / C++
###class="macro">#loss on step class="num">10000 is : class="num">0.005217
###class="macro">#loss on step class="num">20000 is : class="num">0.004846
training layer class="num">2 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.051324
###class="macro">#loss on step class="num">20000 is : class="num">0.046230
training layer class="num">3 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.023292
###class="macro">#loss on step class="num">20000 is : class="num">0.026113
sae 训练完毕。
开始训练深度神经网络 ......
###class="macro">#loss on step class="num">10000 is : class="num">0.057788
###class="macro">#loss on step class="num">20000 is : class="num">0.056932
深度神经网络训练完毕。
   user  system elapsed
  class="num">64.04    class="num">0.01   class="num">64.24
报警信息:
In sae$encoder[[i - class="num">1]]$W[[class="num">1]] %*% t(train_x) + sae$encoder[[i -  :
  longer object length is not a multiple of shorter object length
> lines(Bal0, col="blue")
> system.time(Bal0<-Testing.class="num">1(dt.b, dt, h = c(class="num">50, class="num">50, class="num">50), LR = class="num">0.7, dec = class="num">2, Ep=class="num">300, bar=class="num">1000))
开始训练 sae ......
training layer class="num">1 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000018
###class="macro">#loss on step class="num">20000 is : class="num">0.000013
training layer class="num">2 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000062
###class="macro">#loss on step class="num">20000 is : class="num">0.000048
training layer class="num">3 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000053
###class="macro">#loss on step class="num">20000 is : class="num">0.000055
sae 训练完毕。
开始训练深度神经网络 ......
###class="macro">#loss on step class="num">10000 is : class="num">0.096490
###class="macro">#loss on step class="num">20000 is : class="num">0.084860
深度神经网络训练完毕。
   user  system elapsed
class="num">186.18    class="num">0.00 class="num">186.39
> lines(Bal0, col="red")
> max(Bal0)
[class="num">1] class="num">0.0543

◍ 指标与EA的联动部署和模型落地

把深度神经网络的信号接进 MT4/MT5 实盘,本质上靠一对配合的程序:指标负责在每个新柱组织输入向量并画图,EA 负责加载训练好的模型、出信号、下单和追踪止损。实践里最稳的做法是先在 R 里把手训好的网络存成文件,再让 EA 直接调用,而不是在图表上现训——可视化监控预测信号是评估网络是否有效的最直接手段。 指标首次挂到某货币对/周期(例如 EURUSD M30)时,会在终端 Files 目录下建出 /Symbol/TF/Test_Data/ 结构,避免新数据覆盖旧实验。EA 真正要用的模型得手动放到 /Symbol/TF/ 下且只能留一个,文件名固定为 SAE.model,里面同时含模型 SAE 和归一化参数 prepr,缺了后者模型跑不起来。 以一个具体样本看:EURUSD M30,截至 2014.10.14 取 4000 根柱,用 Testing.1() 分别训 500 周期和 300 周期的深度网络。资金曲线显示,300 周期的网络在最近 500 根柱上的表现倾向优于 500 周期的,且再训练耗时更短,更适合同周期快速复训。 衡量 EA 有效性不能只盯准确率,K 与 Kmax(基于资金高点的偏差)更实用于监控。EA 在图上会输出 OP、Acc、K、Kmax;若前 50–100 根柱不稳定、之后趋近常数,属于正常现象。外汇与贵金属杠杆高,这类信号仅作概率参考,实盘前务必用模拟账户验证。 部署时把 i_SAE.mq4 丢 Indicators、e_SAE.mq4 丢 Experts、mt4Rb7 库和头文件分别进 Libraries 和 Include,R 脚本独立存放并在 MQ 文件里改好调用路径。EA 先加载,若换货币对建议改端口(如 8886 避默认 8888);随后挂 send=true 的指标连同一端口。任务管理器里看不到 Rterm 进程,多半是脚本语法错或 MQL 与 R 的向量长度不匹配,需回 RStudio 逐行 debug。策略测试器目前无法跑此 EA,只能模拟盘手测。

MQL5 / C++
> dt.b<-Balancing(dt)
> table(dt.b[ ,ncol(dt.b)])
   class="num">0    class="num">1
class="num">2288 class="num">2288
> system.time(bal<-Testing.class="num">1(dt.b, dt, h = c(class="num">50, class="num">50, class="num">50), LR = class="num">0.7, dec = class="num">2, Ep=class="num">500, bar=class="num">500))
开始训练 sae ......
training layer class="num">1 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000017
###class="macro">#loss on step class="num">20000 is : class="num">0.000015
###class="macro">#loss on step class="num">30000 is : class="num">0.000015
training layer class="num">2 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000044
###class="macro">#loss on step class="num">20000 is : class="num">0.000041
###class="macro">#loss on step class="num">30000 is : class="num">0.000039
training layer class="num">3 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000042
###class="macro">#loss on step class="num">20000 is : class="num">0.000042
###class="macro">#loss on step class="num">30000 is : class="num">0.000036
sae 训练完毕。
开始训练深度神经网络 ......
###class="macro">#loss on step class="num">10000 is : class="num">0.089417
###class="macro">#loss on step class="num">20000 is : class="num">0.043276
###class="macro">#loss on step class="num">30000 is : class="num">0.069399
深度神经网络训练完毕。
   user  system elapsed
class="num">267.59    class="num">0.08  class="num">269.37
> plot(bal, t="l")
> SAE1<-SAE
> system.time(bal<-Testing.class="num">1(dt.b, dt, h = c(class="num">50, class="num">50, class="num">50), LR = class="num">0.7, dec = class="num">2, Ep=class="num">300, bar=class="num">500))
开始训练 sae ......

栈式自编码器训练完的回测对照

三层自编码器依次训练,第一层在 10000 步时 loss 为 0.000020、20000 步降至 0.000016;第二层两步均停在 0.000050 附近;第三层由 0.000051 微降到 0.000043,说明浅层压缩收敛更快,深层残差更难压。 深度网络接在 SAE 之后,10000 步与 20000 步 loss 分别为 0.083888 与 0.083941,基本不降,训练耗时 user 155.32s、总 elapsed 156.25s,单轮堆叠开销可控。 用最近 500 根收盘价做对照信号 sig.zz(零位反向取 1/-1),累积出 bal.zz,比值 Kzz 均值 0.9173312;bal/bal.zz 的中位数 0.7844、均值 0.9173,但 Min 到 -15.25、Max 到 55,尾部极端偏离提示样本外可能剧烈回撤。 换算每根 K 线收益,原模型 Kb=11.508、对照 Kbz=13.784,SAE 方案在整段样本上略输基准。外汇与贵金属杠杆高,这类历史回测比值不能直接外推,开 MT5 把同样预处理跑一遍周级别数据再下结论。

MQL5 / C++
training layer class="num">1 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000020
###class="macro">#loss on step class="num">20000 is : class="num">0.000016
training layer class="num">2 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000050
###class="macro">#loss on step class="num">20000 is : class="num">0.000050
training layer class="num">3 autoencoder ...
###class="macro">#loss on step class="num">10000 is : class="num">0.000051
###class="macro">#loss on step class="num">20000 is : class="num">0.000043
sae 训练完毕。
开始训练深度神经网络 ......
###class="macro">#loss on step class="num">10000 is : class="num">0.083888
###class="macro">#loss on step class="num">20000 is : class="num">0.083941
深度神经网络训练完毕。
   user  system elapsed
class="num">155.32    class="num">0.02   class="num">156.25
> lines(bal, col=class="num">2)
save(SAE, prepr, file="SAE.model")
sig.zz<-ifelse(tail(dt[ , ncol(dt)], class="num">500) == class="num">0, class="num">1, -class="num">1)
bal.zz<-cumsum(tail(price[ , &class="macro">#x27;CO&class="macro">#x27;], class="num">500) * sig.zz)
Kzz<-mean(bal.zz / bal)
> Kzz
[class="num">1] class="num">0.9173312
> plot(bal/bal.zz, t="l")
> summary(bal/bal.zz)
    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
-class="num">15.2500  class="num">0.7341  class="num">0.7844  class="num">0.9173  class="num">0.8833 class="num">55.0000
> Kb<-tail(bal,class="num">1)/length(bal)*class="num">10^Dig
> Kb
[class="num">1] class="num">11.508
> Kbz<-tail(bal.zz,class="num">1)/length(bal)*class="num">10^Dig
> Kbz
[class="num">1] class="num">13.784

「一点提醒」

这套 DNN 方案用 SAE 初始化隐含层权值后,重训速度很快,实测可在不中断 EA 跑盘的情况下完成迭代,对实盘连续性比较友好。但网络输出本质是统计均值,最优解从来不是训练的一开始就锁定的目标,别指望一次定型。 持续用有效性系数评估模型,才能边交易边优化而不破坏进程。外汇与贵金属杠杆高、滑点跳空频繁,这类模型只降低调参成本,不消除爆仓风险,上 MT5 前先用历史品种做out-of-sample验证。 附件里 SAE.zip 仅 394.31 KB,含指标与 EA;R-intro.zip 约 14.9 MB,DeepLearning.zip 约 6.4 MB,真要复现得把 Rterm 先调通。模型存盘就一行,跑完直接落本地: save(SAE, prepr, file="SAE.model") 把这行塞进你的 R 脚本末尾,下次 load 就能接着训,不必从头来过。

MQL5 / C++
save(SAE, prepr, file="SAE.model")
把重复劳动交给小布
这些诊断小布盯盘的AIGC已内置,打开对应品种页即可看到信号质量与过拟合预警,你只需专注是否跟单。

常见问题

SAE训练以反向传播为主,显存占用相对可控;RBM依赖对比散度,迭代更慢。实盘小周期建议先试SAE。
它对跳空敏感,需先按3.3.4做异常清除,否则可能放大噪声让网络误学缺口规律。
目前小布提供信号诊断与特征预警,模型推理建议用本文EA方案在终端跑,小布做辅助监控。
涨跌样本不均时网络倾向猜多数类,回测虚高、实盘胜率可能明显掉队,外汇高风险下尤其要校验。
注意随机种子按核固定,否则每次训练权重初始化不同,EA加载的模型可能行为漂移。