当前位置:   article > 正文

python arma_时间序列(三):python建立ARMA和ARIMA模型

建arma模型阶数为3,3

1. ARMA

ARMA与上期我们的AR模型有着相同的特征方程,该方程所有解的倒数称为该模型的特征根,如果所有的特征根的模都小于1,则该ARMA模型是平稳的。ARMA模型的应用对象应该为平稳序列! 我们下面的步骤都是建立在假设原序列平稳的条件下的。

2. 单位根检验(Dickey-Fuller test)

from statsmodels.tsa.stattools import adfuller

temp = np.array(data)

t = adfuller(temp) # ADF检验

output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=['value'])

output['value']['Test Statistic Value'] = t[0]

output['value']['p-value'] = t[1]

output['value']['Lags Used'] = t[2]

output['value']['Number of Observations Used'] = t[3]

output['value']['Critical Value(1%)'] = t[4]['1%']

output['value']['Critical Value(5%)'] = t[4]['5%']

output['value']['Critical Value(10%)'] = t[4]['10%']

outputp-value较高,序列具有单位根,即非平稳。

3. ARMA(p,q)模型阶次

1) 我们通过观察PACF和ACF截尾,分别判断p、q的值。

# ACF and PACF

from statsmodels.tsa.stattools import acf, pacf,plot_acf, plot_pacf

lag_acf = acf(data, nlags=20)

lag_pacf = pacf(data, nlags=20, method='ols')

fig, axes = plt.subplots(1,2, figsize=(20,5))

plot_acf(ts, lags=100, ax=axes[0])

plot_pacf(ts, lags=100, ax=axes[1])

plt.show()

2) 信息准则定阶

我们常用的是AIC准则,AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。所以优先考虑的模型应是AIC值最小的那一个模型。T是样本容量,似然函数最大值是at的方差,参数个数为惩罚

# 为了控制计算量,我们限制AR最大阶不超过6,MA最大阶不超过4。

sm.tsa.arma_order_select_ic(data,max_ar=6,max_ma=4,ic='aic')['aic_min_order'] # AIC

两种定阶的方法结果不一定一致,一般采用第一种,也可通过模型的效果进行取舍。

4. ARMA建模及预测

定阶(order)之后就能构建ARMA模型了。

# 模型阶次(3,3)来建立ARMA模型,最后10个数据用于预测。

from statsmodels.tsa import ARMA

order = (3,3)

train = data[:-10]

test = data[-10:]

tempModel = ARMA(train,order).fit()

拟合优度AdjR^2

delta = tempModel.fittedvalues - train # 残差

score = 1 - delta.var()/train.var()

# 它的值在0-1之间,越接近1,拟合效果越好

预测最后10个数据并与实际值比较

predicts = tempModel.predict(371, 380, dynamic=True)

print len(predicts)

comp = pd.DataFrame()

comp['original'] = test

comp['predict'] = predicts

comp.plot()

5. ARIAM

如果序列是非平稳的,就可以考虑使用ARIMA模型。

ARIMA比ARMA仅多了个"I",代表着其比ARMA多一层内涵:也就是差分。

通过考虑时间序列相邻两个值得变化量所构成的序列,把一个非平稳序列变成平稳序列,即差分的思想。称 Ct = Yt - Yt-1,为 Yt 的一阶差分序列。

一个非平稳序列经过d次差分后,可以转化为平稳时间序列。d具体的取值,我们得分被对差分1次后的序列进行平稳性检验,若果是非平稳的,则继续差分。直到d次后检验为平稳序列(一般一两次即可)。

ARIMA(p,d,q)模型阶次确定

经过上个步骤已经确定d值,p和q值可以按照ARMA模式用自相关和偏相关函数求,或用信息准则AIC确定。

ARIMA模型建立及预测

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(data, order=(2,1,2)).fit() # ARIMA = (2,1,2)

拟合优度

delta = model.fittedvalues - train

score = 1 - delta.var()/train[1:].var()

预测

start_index = datetime(1944, 6, 25)

end_index = datetime(1945, 5, 31)

forecast = model_fit.predict(start=start_index, end=end_index)

参考:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/91852
推荐阅读
相关标签
  

闽ICP备14008679号