第三代神经网络:深度网络·综合运用
(3/3)·多层感知器到栈式自编码器讲完,真正的坑在R语言训练、数据清洗和EA集成的最后一公里
堆叠自编码器三层训练的实际损耗与耗时
用 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 白跑。外汇与贵金属波动剧烈,此类小样本网络过拟合概率偏高,实盘前务必做样本外验证。
###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,只能模拟盘手测。
> 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 把同样预处理跑一遍周级别数据再下结论。
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 就能接着训,不必从头来过。
save(SAE, prepr, file="SAE.model")