我最近在使用 VAE.mqh 时遇到了一些问题,发现以下方法能很好地解决这个问题。
bool CVAE::calcInputGradients(CNeuronBaseOCL *NeuronOCL) { if(!OpenCL || !NeuronOCL) return false; //--- if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_input, NeuronOCL.getOutput().GetIndex())) return false; if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_inp_grad, NeuronOCL.getGradient().GetIndex())) return false; if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_random, m_cRandom.GetIndex())) return false; if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_gradient, Gradient.GetIndex())) return false; if(!OpenCL.SetArgument(def_k_VAECalcHiddenGradient, def_k_vaehg_kld_mult, m_fKLD_Mult)) return false; // 计算合适的作业规模 uint neurons_count = (uint)Neurons(); uint local_size = 64; // 或 32、128、256,具体取决于您的显卡 // 将全局大小向上取整,使其能被本地大小整除 uint global_size = ((neurons_count + local_size - 1) / local_size) * local_size; uint work_offset[] = {0}; uint work_size[] = {global_size}; uint local_work_size[] = {local_size}; if(!OpenCL.Execute(def_k_VAECalcHiddenGradient, 1, work_offset, work_size, local_work_size)) return false; //--- return true; }
我也尝试了相同的测试流程:首先使用Study基于历史数据进行了1000000次学习,并生成了相应的nnw文件;随后使用StudyOnline学习了一年的数据(此时没有任何收益,10000美元的账户很快就耗尽了,运行结束后更新了部分nnw文件)。最后使用Test进行测试,结果与StudyOnline基本一致(没有任何盈利)
新文章 神经网络在交易中的应用:时间序列的概率预测(结论)已发布:
如前所述,该模型分两个连续阶段进行训练。首先,我们使用 EURUSD 货币对在 H1 时间周期上的 15 年历史数据进行离线训练。该数据集涵盖了所有类型的市场状况:从长期横盘整理到急剧趋势,从平静期到波动性飙升。正因如此,该模型才能学习到市场行为的多样性。Encoder 学会了识别关键模式,并将市场状态转换为简洁而信息丰富的表示,这成为 Agent 进行决策的基础。与此同时,Actor 利用 Critic 和 Director 的反馈,制定了一套能够在各种条件下有效发挥作用的稳健策略。
接下来是第二阶段 — 使用 2024 年数据在 MetaTrader 5 策略测试器中进行的在线训练。在这里,该模型以近乎实时的方式运行,一次分析一根 K 线,从而分析市场。它遇到了实时市场特有的噪音、随机波动和失真。这种方法不仅可以对模型进行微调,还可以使其行为适应现实世界的动态变化,改进其策略,并增强其在不确定性面前的鲁棒性。
训练完成后,我们在新数据(2025 年1 月至 3 月的报价)上测试了该模型,同时保持训练期间使用的所有参数不变。测试结果如下所示。
测试结果表明,该模型在选定的历史时期内实现了盈利。初始存款为 $100.0,总净利润达到 $821.90,表明资本有所增长。然而,值得注意的是,利润因子为 1.06,表明利润仅略高于亏损。
作者:Dmitriy Gizlyk