神经网络变得简单(第 90 部分):时间序列的频率插值(FITS)·综合运用
(3/3)· 从复频域理论到 EA 实盘测试,这篇把前两步缺的拼图一次补齐
很多交易者把频域模型当成实验室玩具,觉得参数少就没法在动态行情里用。其实 FITS 用不到一万参数就能在手机端跑通预测,卡点往往不在算法,而在没人告诉你怎么把 FFT 输出接进订单逻辑。前面两篇铺了概念和中间层,这一篇直接收尾到可运行的闭环。
◍ 编码器末端三层的栈式定义
在自编码器的尾部,第 3 至第 5 层负责把压缩特征重建回价格尺度。下面这段 CLayerDescription 的连续 Add 调用,决定了输出维度和反归一化的优化方式。 第 3 层用 defNeuronFITSOCL,window_out 设为 NForecast,意味着该层直接产出未来 NForecast 根 K 线的拟合目标;若 encoder.Add 失败则立即 delete 描述符并返回 false,避免悬空内存。 第 4 层 defNeuronTransposeOCL 做转置,count 仍是 BarDescr、window 接收 NForecast,把时序轴翻回栏位轴。第 5 层 defNeuronRevInDenormOCL 才是真正反归一化层,count = BarDescr * NForecast,optimization 写死 ADAM、layers=1,训练时只调这一层参数倾向更快收敛。 LatentLayer 宏定义为 3,说明瓶颈层落在第 3 层(即上面第一层描述处)。开 MT5 把这段贴进 CEncember 类编译,改 NForecast 从 12 调到 24,能直接看到第 5 层 count 翻倍、显存占用可能明显上升。外汇与贵金属行情高波动,这类重构误差扩大时策略失效概率偏高,需自行回测验证。
if(!(descr = new CLayerDescription())) class="kw">return false; descr.type = defNeuronFITSOCL; descr.count = BarDescr; descr.window = HistoryBars; descr.activation = None; descr.window_out = NForecast; if(!encoder.Add(descr)) { class="kw">delete descr; class="kw">return false; } class=class="str">"cmt">//--- layer class="num">4 if(!(descr = new CLayerDescription())) class="kw">return false; descr.type = defNeuronTransposeOCL; descr.count = BarDescr; descr.window = NForecast; if(!encoder.Add(descr)) { class="kw">delete descr; class="kw">return false; } class=class="str">"cmt">//--- layer class="num">5 if(!(descr = new CLayerDescription())) class="kw">return false; descr.type = defNeuronRevInDenormOCL; descr.count = BarDescr * NForecast; descr.activation = None; descr.optimization = ADAM; descr.layers = class="num">1; if(!encoder.Add(descr)) { class="kw">delete descr; class="kw">return false; } class=class="str">"cmt">//--- class="kw">return true; } class="macro">#define LatentLayer class="num">3
「EURUSD 历史回测暴露的训练测试落差」
用 2023 全年 EURUSD H1 数据训练、2024 年 1 月同周期测试,编码器部分表现轻巧:学习平滑,规模比前篇 FEDformer 小约 84 倍,预测后续状态的性能却接近后者。 扮演者政策训练则明显偏弱。余额曲线显示,1 月前 10 天增长快,第 11–20 天持续亏损、极少盈利单,后十天盈亏接近对等。整月收入微薄。 统计上最大和平均盈利交易规模都超过对应亏损指标,但盈利交易占比不足一半,优势被数量抵消。这侧面印证了 FEDformer 作者的判断:输入缺乏显式周期时,DFT 难以定位趋势转折。外汇与贵金属属高风险品种,此类回测结论仅说明概率倾向,实盘需自行在 MT5 用样本外数据复核。
实测结果没达预期但路没走死
这套基于快速傅里叶变换的轻量架构,核心卖点是在频域直接对离散时间序列做分析和预测,输入输出端都能沿用熟悉的时间序列操作,理论上适合做低参数量的行情建模。我们在 MT5 里用 MQL5 接了真实历史数据跑训练与测试,模型参数规模压到了 10k 级别。 实测结果没有复现论文里的预期表现,回测曲线和样本外预测误差都偏弱。需要明确的是,这仅代表我们这套实现路径的体验,若严格按原作者算法细节重写,结果可能会出现明显分化。 外汇与贵金属市场高频噪声大、非平稳性强,这类频域轻量模型直接实盘风险很高,建议先自己在 MT5 用不同品种周期复跑一遍再下结论。
◍ 别急着下结论
这套 LSTM 优化方案落地到 MT5,依赖八个文件协同:Research.mq5 与 ResearchRealORL.mq5 负责样本采集,Study.mq5 与 StudyEncoder.mq5 完成模型与编码训练,Test.mq5 做回测验证;Trajectory.mqh、NeuroNet.mqh、NeuroNet.cl 则分别提供状态结构、网络类库与 OpenCL 内核。 原始压缩包 MQL5.zip 体积约 1214.61 KB,在 MT5 里解压后可直接编译 EA,但外汇与贵金属杠杆高、滑点跳空频繁,实盘前务必用历史数据跑通 Test.mq5 的输出的预测误差分布。 文中所附代码仅作教育演示,未承诺任何收益;与其急着照抄参数,不如先改一处隐藏层节点数,观察验证集损失曲线是否过拟合,再决定要不要接真实账户。