跳到主要内容

ARIMA 模型

一、直观理解:先把趋势“扒掉”,再对平稳部分建模​

现实中的序列常常带趋势或随机游走特征,直接套 ARMA 会失败。ARIMA 的策略是:

  1. 做 dd 阶差分,使序列变平稳;
  2. 对差分后的序列建立 ARMA(p,qp,q);
  3. 预测时再把差分“积分”回去,得到原尺度路径。

模型记为 ARIMA(p,d,qp,d,q):

ϕ(B)(1−B)dyt=c+θ(B)εt\phi(B)(1-B)^d y_t = c + \theta(B)\varepsilon_t

例如日价格常近似随机游走,收益率(一阶差分或对数差分)才接近平稳——这就是 d=1d=1 的典型动机。

二、适用场景与优缺点​

类型说明
适用场景单变量、有趋势/单位根但差分后可 ARMA;需要标准短中期预测与区间;作为竞赛时间序列题的主基线。
核心优点处理非平稳的标准框架;工具链完整;可解释差分阶数;便于自动/半自动选阶。
局限与缺点不强建模复杂季节(要用 SARIMA);外生变量需 ARIMAX;结构断点需人工处理;dd 过大损失信息并可能过度差分。

三、核心原理​

1. 差分算子​

∇yt=(1−B)yt=yt−yt−1,∇d=(1−B)d\nabla y_t=(1-B)y_t=y_t-y_{t-1},\quad \nabla^d=(1-B)^d

d=1d=1 消除随机游走型非平稳;d=2d=2 有时用于“斜坡”更强的情况,但竞赛中 d≥2d\ge 2 要非常谨慎。

对数差分 ∇log⁡yt\nabla \log y_t 近似增长率,兼具稳定方差的作用。

2. 常数项含义​

在 d=1d=1 时,常数项与漂移有关:差分后的均值对应原序列的线性漂移。是否保留常数可用信息准则与残差均值检验。

3. 预测​

对差分序列做出 ARMA 预测后,经过 cumulative sum 还原。多步预测区间通常随 hh 增宽;若 d≥1d\ge 1,长期不确定性往往比平稳 ARMA 更大。

四、如何选择 d,p,qd,p,q​

选 dd:

  1. 时序图是否有趋势/水平漂移;
  2. ACF 是否极慢衰减;
  3. ADF/KPSS 等检验(注意功效与设定);
  4. 差分后相关图是否“正常”;
  5. 避免过度差分:过度差分会出现 MA 强负相关、方差变大。

选 p,qp,q: 在差分后的序列上按 ARMA 网格 + AIC/BIC + 残差诊断 + 测试误差。

常用小网格:d∈{0,1}d\in\{0,1\},p,q∈{0,1,2,3}p,q\in\{0,1,2,3\}。

五、MATLAB 示例​

%% 带漂移的随机游走 + 观测噪声,再拟合 ARIMA
rng(8);
n = 360;
e = randn(n,1);
y = cumsum(0.05 + e); % 含漂移单位根
T0 = 300;
yTrain = y(1:T0); yTest = y(T0+1:end);

figure;
subplot(2,1,1); plot(yTrain); title("原序列");
subplot(2,1,2); plot(diff(yTrain)); title("一阶差分");

[h0,p0] = adftest(yTrain);
[h1,p1] = adftest(diff(yTrain));
fprintf("ADF 原序列 h=%d p=%.4f; 差分后 h=%d p=%.4f\n", h0,p0,h1,p1);

% 网格
best = struct("aic",Inf);
for d = 0:1
for p = 0:3
for q = 0:3
if p==0 && q==0 && d==0, continue; end
try
md = arima(p,d,q);
est = estimate(md, yTrain, "Display","off");
[~,~,logL] = infer(est, yTrain);
k = p+q+1+(d>=0); % 粗略参数计数
aic = -2*logL + 2*(p+q+2);
if aic < best.aic
best = struct("aic",aic,"p",p,"d",d,"q",q,"est",est);
end
catch
end
end
end
end
fprintf("选用 ARIMA(%d,%d,%d)\n", best.p,best.d,best.q);
summarize(best.est);

res = infer(best.est, yTrain);
[hLB,pLB] = lbqtest(res,"Lags",12);
fprintf("残差 LB p=%.4f\n", pLB);

h = numel(yTest);
[yf,yMSE] = forecast(best.est, h, "Y0", yTrain);
rmse = sqrt(mean((yTest-yf).^2));

% 基线:随机游走(带最后漂移估计)
drift = mean(diff(yTrain));
yf0 = yTrain(end) + drift*(1:h)';
rmse0 = sqrt(mean((yTest-yf0).^2));
fprintf("测试 RMSE ARIMA=%.4f, 漂移RW=%.4f\n", rmse, rmse0);

figure;
plot(T0+1:T0+h,yTest,"k"); hold on;
plot(T0+1:T0+h,yf,"r","LineWidth",1.2);
plot(T0+1:T0+h,yf0,"b--");
legend("真实","ARIMA","漂移RW"); title("训练期外预测");

实际题目中务必把 forecast 的区间一并画出,并检查残差平方的 ACF(波动聚集时接 GARCH)。

六、如何解释结果​

报告清单:

  1. 为何需要差分(图 + 检验 + 差分前后 ACF);
  2. (p,d,q)(p,d,q) 选择表(AIC/BIC/测试 RMSE);
  3. 参数与常数项(漂移)解释;
  4. 残差白噪声与异方差检查;
  5. 训练期外误差、对比随机游走/季节朴素;
  6. 预测路径与 95% 区间;
  7. 适用期限:ARIMA 对短中期更可靠,超长外推需谨慎。

七、常见误区​

1. 看见趋势就 d=2d=2​

多数情况 d=1d=1 或先去线性势足够。过度差分有害。

2. 全样本选阶再“预测”全样本​

阶数与参数只能基于训练期;可用滚动原点做更稳的比较。

3. 只报告很高的拟合 R2R^2​

非平稳序列拟合 R2R^2 虚高。必须看差分后残差与测试误差。

4. 忽视季节​

月数据若 12 期相关突出,应 SARIMA,而不是把 pp 加到 12 的纯 ARIMA。

5. 预测前忘记还原变换​

对 log⁡y\log y 建模后要指数还原;若需要均值无偏还原,注意 Jensen 修正(竞赛中至少说明变换)。

八、小结​

ARIMA 的核心是:

通过适度差分获得平稳序列,再以 ARMA 刻画短期相关,并把预测积分回原尺度。

它是数学建模时间序列题的“默认基线”之一。规范流程是:图诊断 → 定 dd → 定 (p,q)(p,q) → 残差检验 → 训练期外与朴素模型比较。不要只看 R2R^2;能稳定打败随机游走/季节朴素,才有说服力。