一、什麼是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()
原創文章,作者:LJPY,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/131038.html