一、什么是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()