以 MQL5 实现 ARIMA 训练算法·综合运用
(3/3)· 前兩篇铺好理论与类结构,这一篇用 CArima 类落地训练与模型设计,收束整个 ARIMA 系列
用 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) 的幅度更凶,外汇与贵金属实盘属高风险,直接套用结论前务必自己跑一遍验证。
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 返回值和预测残差,再谈调参,比直接信任何结论都实在。
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,模型就建立了,然后就可以用来进行预测了。