以 MQL5 实现 ARIMA 训练算法·综合运用
📈

以 MQL5 实现 ARIMA 训练算法·综合运用

(3/3)· 前兩篇铺好理论与类结构,这一篇用 CArima 类落地训练与模型设计,收束整个 ARIMA 系列

含代码示例实战向 第 3/3 篇
很多交易者把 ARIMA 当成黑箱指标直接加载,却没意识到差分次数 d 选错会让预测序列彻底失真。用 MQL5 自己实现训练循环,才能看清参数怎么从行情里学出来。这一篇我们把前面拆开的部分拼回可用系统。

用 CArima 跑一个纯 AR(2) 拟合实验

下面这段脚本能直接在 MT5 里建个确定性序列,再交给 CArima 做参数估算。它头文件引的是 Arima.mqh,输入数组长度 300,前两项置零后从下标 2 开始按递推式填值,可选叠加标准正态噪声。 模型声明成 CArima(2,0,0, …),也就是差分阶数为 0 的纯 AR(2),是否带常数项取决于 Const_Offset 是否非零。Fit() 吃进整个 inputs 数组,Summary() 把估算结果打到日志。 脚本分两次跑:Add_Noise=false 时算法能还原真实系数;Const_Offset 设为 0.625、递推系数 0.5 与 -0.3,无噪声下可精确复现。开启噪声后,恒定偏移和系数依然估算得相当接近,但金融序列里的噪声通常比这里 MathRandomNormal(0,1) 的幅度更凶,外汇与贵金属实盘属高风险,直接套用结论前务必自己跑一遍验证。

MQL5 / C++
class="macro">#include<Arima.mqh>
class="kw">input class="type">bool Add_Noise=false;
class="kw">input class="type">class="kw">double Const_Offset=class="num">0.625;
class="type">class="kw">double inputs[class="num">300];
  ArrayInitialize(inputs,class="num">0);
  class="type">int error_code;
  for(class="type">int i=class="num">2; i<ArraySize(inputs); i++)
    {
      inputs[i]= Const_Offset;
      inputs[i]+= class="num">0.5*inputs[i-class="num">1] - class="num">0.3*inputs[i-class="num">2];
      inputs[i]+=(Add_Noise)?MathRandomNormal(class="num">0,class="num">1,error_code):class="num">0;
    }
  CArima arima(class="num">2,class="num">0,class="num">0,Const_Offset!=class="num">0);
  if(arima.Fit(inputs))
      Print(arima.Summary());

◍ 用自相关图给 ARIMA 定阶

训练 ARIMA 只是体力活,真正麻烦的是定阶。判定 p、q 最直观的两把刀是自相关(ACF)和偏自相关(PACF)函数图。 拿四个假设序列看规律:y(t)=AR1*y(t-1)+E(t) 与 y(t)=E(t)-AR1*y(t-1) 是纯 AR(1),正负系数各一;y(t)=MA1*E(t-1)+E(t) 与 y(t)=E(t)-MA1*E(t-1) 是纯 MA(1)。AR(1) 的 ACF 随滞后增大而衰减,PACF 在滞后 1 之后直接截零——这是 AR 类的通用指纹。 反过来,MA(1) 的 ACF 长得和 AR(1) 的 PACF 一样:在滞后 1 处截零,而 PACF 随滞后缓慢衰减。所以经验法则很硬:PACF 截零、ACF 衰减 → 上纯 AR 到截零点;ACF 截零、PACF 衰减 → 上 MA 到截零点。外汇与贵金属序列波动聚集,截零点常不干净,需结合领域判断,杠杆品种高风险。 除看图外还有三条定量路径:AIC/BIC 信息准则横向比模型;网格搜索在同数据上扫不同 (p,d,q) 取最优;时间序列交叉验证切训练/测试集看测试误差。没有万能顺序,反复试错和样本特性才是常态。

「别急着下结论」

前面两节把 CArima 类的训练逻辑和 Powells 方法最小化拆开了讲,这一节给的是可直接落地的零件包。附件里 Arima.mqh 是 11.35 KB 的类定义,PowellsMethod.mqh 占 14.05 KB,TestArima.mq5 只有 1.4 KB,却演示了怎么拿它去拟合一段确定性序列,整套 zip 才 6.16 KB。 代码层面,核心调用就那一行 arima.fit(y,p,d,q,use_constant_offset)。y 是你要喂进去的序列数组,p、d、q 三个整数得自己按品种波动结构定,use_constant_offset 设 true 才带常数项;返回 true 代表模型建好能预测,false 就别拿去跑信号。 外汇和贵金属杠杆高、跳空频繁,ARIMA 拟合理顺的是历史结构,不是未来保证。开 MT5 把 TestArima 挂上 EURUSD 的 M1 跑一遍,先盯 fit 返回值和预测残差,再谈调参,比直接信任何结论都实在。

MQL5 / C++
class="type">class="kw">double y[];class=class="str">"cmt">//用系列数据填充 y-----
class=class="str">"cmt">//创建 CArima 实例
CArima arima; 
class=class="str">"cmt">//火车 
arima.fit(y,p,d,q,use_constant_offset); class=class="str">"cmt">// p, d 和 q 是你必须决定的模型参数,use_constant_offset 是一个布尔值,指定在模型中使用一个常量,方法成功时返回 true,如果返回 true,模型就建立了,然后就可以用来进行预测了。
把重复劳动交给小布
这些 ARIMA 参数诊断与差分稳态检查,小布盯盘的 AIGC 已内置,打开对应品种页即可看到,你只需判断信号是否值得跟。

常见问题

通常先指定 p、d、q 阶数和样本窗口,再绑定价格序列缓冲区;具体字段见本篇第一节代码示例。
小布盯盘内置了常见时间序列诊断,可读取你导出的参数做稳态提示,但训练本身需在 MQL5 端完成。
倾向用信息准则截断阶数,并对差分后序列做白噪声检验,阶数过高在样本外大概率退化。
跳空会放大差分方差,可能需加稳健缩放或换周线降频,外汇贵金属本身高风险,参数要保守。