0x02 ARIMA模型

AR模型

AR(Autoregressive, 自回归)模型, 描述的是当前值与历史值之间的关系:

Xt=c+i=1pφiXti+εiX_t=c+\sum\limits_{i=1}^p\varphi_iX_{t-i}+\varepsilon_i

其中εi\varepsilon_iAR模型拟合后的剩余部分(即其他因素造成的), 称为自回归部分的随机误差. 有如下的特征:

  • 所有时间点tt对应的εt\varepsilon_t都是一个期望值为0的正态分布, 但每个时间的对应正态分布的方差σt2\sigma^2_t不同

  • 不同时间点之间的εt\varepsilon_t, 相互之间没有任何联系

MA模型

MA(Moving Average, 移动平均)模型, 公式如下:

Xt=μ+εt+i=1qθiεtiX_t=\mu+\varepsilon_t+\sum\limits_{i=1}^{q}\theta_i\varepsilon_{t-i}

可以看出, MA模型描述的是自回归模型在每个时间点上的误差的累计模型. 之所以成为移动平均, 首先是每个当前值只考虑若干个之前的误差, 体现了移动; 另外, 由于每个时间点上自回归模型的误差如上面所说, 是独立的, 因此可以代表对应时间的序列, 对它们使用带权值的加和体现了平均的性质.

ARIMA模型

ARIMA(Autoregressive Integrated Moving Average model)模型就是将上面两个模型进行综合, 并在使用ARMA模型拟合之前, 进行差分(Integrated)操作.

Xt=φ0+i=1pφiXti+εtj=1qθjεtjX_t = \varphi_0 + \sum_{i=1}^p \varphi_i X_{t-i} + \varepsilon_t - \sum_{j=1}^q \theta_j \varepsilon_{t-j}

上式中的XtX_t是经过dd阶差分之后的序列, 这点需要注意, 差分并没有在公式中体现出来.

因此ARIMA的需要调整的参数为(p,d,q)(p, d, q), 对应于AR模型参数, 差分阶数, MA模型参数.

另外需要注意的是ARIMA模型是对平稳时间序列建模的工具, 因此需要通过差分, 将非平稳序列转换为平稳序列.

ARIMA模型参数的确定

  • 通过ACF(Autocorrelation Function, 自相关函数)PACF(Partial Autocorrelation Function, 偏自相关函数), 做出两张图, 根据ACF图和PACF的表现, 主观的确定

  • 评价函数衡量, 如使用AIC赤池信息量BIC贝叶斯信息量来衡量当前参数对应的ARIMA模型的拟合效果, 综合选取拟合效果更好的参数作为最优的参数组合. 类似于机器学习中的调参过程.

Python中的ARIMA模型

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(ts_log, order=(2, 1, 2))  
results_ARIMA = model.fit(disp=-1)  
plt.plot(ts_log_diff)
plt.plot(results_ARIMA.fittedvalues, color='red')
plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))

ARIMA模型的初始化参数有:

ARIMA(endog, order, exog=None, dates=None, freq=None, missing='none')
  • endog: 现有的时间序列

  • order: 模型参数, 以(p, d, q)组成的三元tuple形式传递

  • exog: 外部变量, 作为时间变量之外的参数为拟合模型所使用. 如果使用外部变量, 模型就变为了ARIMAX, X指的是外部变量

ARIMA模型通过.fit()方法进行拟合训练. .fit()函数接受的参数为:

fit(self, start_params=None, trend='c', method="css-mle",
            transparams=True, solver='lbfgs', maxiter=500, full_output=1,
            disp=5, callback=None, start_ar_lags=None, **kwargs)
  • disp: 打印轮数, 如果disp<0, 则不打印信息

.fit()方法返回一个statsmodels.tsa.arima.ARIMAResults对象, 作为拟合的结果. 该对象包含了多种信息:

  • ARIMAResults.fittedvalues: 拟合历史的结果

以及通过.predict()方法预测时间序列的未来:

predict(self, params, start=None, end=None, exog=None, typ='linear', dynamic=False)

最后更新于

这有帮助吗?