您的位置:

SARIMAX模型的全面解析

一、什么是SARIMAX模型

SARIMAX(Seasonal Autoregressive Integrated Moving Average with Exogenous Variables)是ARIMA模型的拓展版本,在ARIMA模型基础上加入了外生变量(Exogenous Variables)的影响因素,用于解决ARIMA模型无法解释的影响因素。SARIMAX模型常用于时间序列的预测和分析。

SARIMAX模型的数学表达式如下:

    SARIMAX(p,d,q)x(P,D,Q)m

其中,p、d、q、P、D、Q分别代表模型中的自回归(AR)、差分(I)、移动平均(MA)和季节性自回归、季节性差分、季节性移动平均的阶数,m则代表季节性因素的周期。

二、如何建立SARIMAX模型

建立SARIMAX模型的关键是选择合适的p、d、q、P、D、Q和m参数。常见的建模方法一般包括如下几个步骤:

1.数据处理

首先对数据进行处理和预处理,例如平稳化、去趋势等,以保证模型的建立和预测的准确性。

2.确定模型阶数

采用ACF和PACF图确定自回归(AR)和移动平均(MA)的阶数,采用差分法确定差分(I)的阶数,采用季节性差分法和ACF、PACF进行模型初步筛选。

3.建立初步模型

根据初步筛选的结果,建立初步模型,利用贝叶斯信息准则(BIC)或赤池信息准则(AIC)对模型进行评价和筛选,选择最优模型。

4.残差检验

对模型建立后的残差进行检验,排除残差不符合正态性、平稳性和独立性等假设的情况,以保证模型的有效性和准确性。

5.预测

基于建立好的SARIMAX模型,进行预测和分析,得到对应的结果或结论。

三、SARIMAX模型的优缺点

1.优点

SARIMAX模型具有较强的适应性和预测能力,能够对时间序列数据进行有效建模和预测,也可以加入外生变量的影响因素进行分析和预测。此外,SARIMAX模型具有较高的可解释性和可视化性,易于分析和理解。

2.缺点

SARIMAX模型需要基于时间序列数据建立模型,因此对于无法获取时间序列数据的问题,该模型的应用范围会受到限制。此外,如果外生变量的数据量较大,模型的建立和分析就会变得较为繁琐和复杂。

四、代码示例

1.数据预处理

import pandas as pd
from datetime import datetime
import matplotlib.pylab as plt

#读取数据
data=pd.read_csv('data.csv')
dateparse=lambda dates:datetime.strptime(dates,'%Y-%m')
data=pd.read_csv('data.csv',parse_dates=['Month'],index_col='Month',date_parser=dateparse)
print(data.head())

#数据平稳化
fig=plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
plt.plot(data)
ax1.set_xlabel('Date')
ax1.set_ylabel('Data')
ax1.set_title('Original Data')

ax2=fig.add_subplot(212)
plt.plot(data.diff())
ax2.set_xlabel('Date')
ax2.set_ylabel('Data')
ax2.set_title('Differenced Data')
plt.show()

2.模型建立

import statsmodels.api as sm

#模型阶数估计
fig=plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig=sm.graphics.tsa.plot_acf(data.diff().dropna(),lags=40,ax=ax1)
ax2=fig.add_subplot(212)
fig=sm.graphics.tsa.plot_pacf(data.diff().dropna(),lags=40,ax=ax2)

#模型拟合
model=sm.tsa.statespace.SARIMAX(data,order=(1,1,1),seasonal_order=(1,1,1,12),enforce_stationarity=False,enforce_invertibility=False)
results=model.fit()
print(results.summary())

3.模型检验和预测

#残差检验
results.plot_diagnostics(figsize=(16,8))
plt.show()

#模型预测
pred=results.get_prediction(start=pd.to_datetime('2019-01'),dynamic=False)
pred_ci=pred.conf_int()
ax=data['2014':].plot(label='observed')
pred.predicted_mean.plot(ax=ax,label='One-step ahead Forecast',alpha=.7,figsize=(14,7))
ax.fill_between(pred_ci.index,pred_ci.iloc[:,0],pred_ci.iloc[:,1],color='k',alpha=.2)
ax.set_xlabel('Date')
ax.set_ylabel('Data')
plt.legend()
plt.show()