本节摘要:ACF 和 PACF 是 ARIMA 阶数选择的"罗塞塔石碑"。本节教你怎么从 ACF / PACF 图的"截尾"或"拖尾"模式,反推 p、d、q 的合适值,并演示一个完整 ARIMA(p,d,q) 拟合流程。
阅读完本节,你应当能够:
pmdarima.auto_arima 或手工根据 ACF / PACF 选定 p、q。本节把 4.2 讲的 ACF 进一步延伸到 PACF,给出 ARIMA 阶数选择的统计依据。读完后你能从 ACF / PACF 图的"截尾 / 拖尾"反推 p、d、q 的合适值。
ACF(自相关函数):度量 y(t) 和 y(t+k) 的总相关。包含了中间 lag 的"传递影响"——比如 lag=3 的 ACF 包含 lag=1、lag=2 的间接影响。
PACF(偏自相关函数):在排除中间 lag 的影响后,y(t) 和 y(t+k) 的"纯"相关。衡量"如果中间 lag 都被解释掉,y(t-k) 对 y(t) 还有多少独立解释力"。
直观上:
| ACF 模式 | PACF 模式 | 建议模型 |
|---|---|---|
| 拖尾(指数或正弦衰减) | 截尾(lag p 之后为 0) | AR(p) |
| 截尾(lag q 之后为 0) | 拖尾(指数或正弦衰减) | MA(q) |
| 拖尾 | 拖尾 | ARMA(p, q) |
| 全部衰减很慢 | 全部衰减很慢 | 序列不平稳,需要差分 |
"截尾"指 lag 大于某值后,系数突然落到置信区间内;"拖尾"指系数连续衰减而不突然归零。
import numpy as np import pandas as pd from statsmodels.tsa.arima.model import ARIMA from statsmodels.graphics.tsaplots import plot_acf, plot_pacf import matplotlib.pyplot as plt rng = np.random.default_rng(0) # AR(2): y(t) = 0.6 y(t-1) - 0.3 y(t-2) + ε n = 500 y = np.zeros(n) eps = rng.normal(0, 1, n) for t in range(2, n): y[t] = 0.6 * y[t-1] - 0.3 * y[t-2] + eps[t] s = pd.Series(y) fig, axes = plt.subplots(1, 2, figsize=(10, 3.5)) plot_acf(s, lags=20, ax=axes[0]) plot_pacf(s, lags=20, ax=axes[1], method="ywm") plt.tight_layout()
预期结果:
按表格判读:AR(2) 是合适模型。
如果序列有 m=12 的季节性:
这告诉模型需要"季节项":SARIMA(p,d,q)(P,D,Q,12) 中的 P、Q。
手工看 ACF / PACF 在实战中容易判错(特别是 lag 边界)。pmdarima.auto_arima 通过网格搜索自动选 p、d、q:
import pmdarima as pm auto_model = pm.auto_arima( s.values, start_p=0, start_q=0, max_p=5, max_q=5, seasonal=True, m=12, # 月度季节性 d=None, D=None, # 自动选差分阶数 trace=True, # 打印搜索过程 error_action="ignore", suppress_warnings=True, stepwise=True # 启发式搜索,比全网格快 ) print(auto_model.summary())
auto_arima 输出最优 (p,d,q)(P,D,Q,m) 组合。业务上这是一个"够用"的起点,但仍然建议人工 review——auto_arima 选出的模型可能在残差诊断上不如手工选的。
某电商月度销量,48 个月数据:
候选模型:SARIMA(1,1,1)(1,1,1,12) 或 SARIMA(1,1,2)(0,1,1,12)。两个都跑,对比 AIC 和测试集 MAE 选优。