赞
踩
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)
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。