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

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)

参考:

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值