时序arima

arima模型是结合ar模型,ma模型,差分的模型。
在用arima模型之前需要对单列数据进行一系列的处理,才可以进行arima分析。

1.白噪声检验

由于时序数据可能存在噪声,在对时序数据分析之前可以通过Ljung_Box检验,该检验首先假设序列为白噪声,根据假设求得的 P 值如果小于阈值 0.05,那么假设不成立。

2.平稳性adf检验

时序数据需要研究数据在时间上的相关性,研究前后数据的变动关系。所以数据要具有平稳性,本文检验平稳性的方法是利用adf检验。一般情况下,如果p值小于0.05则认为在序列平稳的显著性水平在95%以上,可以认为序列平稳。(在经过多次实验之后发现越平稳,arima模型越能学到其中的变动。当然差分建议做一次或者两次即可)

3.平稳性处理

如果adf检验在0.05以上或者左右,可以做取对数、一阶差分和二阶差分对数据处理。

4.自相关图和偏相关图的查看

通过自相关图(acf图)和偏相关图(pacf图)对数据的相关性进行查看。
自相关系数:当前时刻与此后时刻数据的相关性
偏相关系数:当前时刻与此后时刻再见的相关性,但是只是单单研究两个时刻的相关性,剔除了其他时刻的影响
如果在第p个时间后落于蓝色自信区间内,说明第p个时间之后对当前时间的数据影响很小。所以可以根据这两个图对arima模型的参数定阶。arima(p,d,q),其中p看pacf图,q看acf图,pq的取值一般取较小,pq的取值看落入蓝色区间的前一时刻。

5.bic和aic准则

bic和aic准则为arima模型的参数选择进行了量化。这两个准则算出来的值越小,理论上模型效果越好。

6.arima分析

通过上述的对时序数据的检验和模型参数的选择,我们就可以通过历史数据预测未来。随着时间的推移,arima模型的效果会大大下降。可以采取预测添加,训练再预测的方法为模型提供最新时刻的数据。

7.python代码

#导包
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_model import ARIMA
import numpy as np
import statsmodels.api as sm

from sklearn.metrics import mean_squared_error

import statsmodels.tsa.stattools as ts
df = pd.read_csv('缺失值处理_拆借回购利率.csv',encoding='gbk')

df['指标名称'] = pd.to_datetime(df['指标名称'])
df = df.set_index('指标名称')
df = df.resample('M').mean().interpolate()#日数据转化成月数据
df.tail()
#读取后的数据格式如下:

			#存款类机构信用拆借加权利率:7天
#指标名称 	
#2022-05-31 	1.696865
#2022-06-30 	1.773314
#2022-07-31 	1.615943
#2022-08-31 	1.486583
#2022-09-30 	1.706325
# adf检验
dftest = ts.adfuller(df['存款类机构信用拆借加权利率:7天'],autolag='AIC')
if dftest[1]>0.05:
    print(dftest)
    print("当前序列不平稳")
else:
    print(dftest[1])
    print(dftest)
    print("当前序列平稳")
# 平稳性处理
# 差分处理
g_diff = df['存款类机构信用拆借加权利率:7天'].diff(1) #二阶差分1改为2
g_diff2 = g_diff.dropna()

plt.figure(figsize=(12,8))
plt.ylabel('存款类机构信用拆借加权利率:7天')
plt.title('一阶差分时序图')
g_diff2.plot()
plt.show()
#acf和pacf
fig = plt.figure(figsize=(10,8))
ax1 = fig.add_subplot(211)
fig = plot_acf(g_diff2, lags=20, ax=ax1)
plt.title('ACF')
 
ax2 = fig.add_subplot(212)
fig =  plot_pacf(g_diff2, lags=20, ax=ax2)
plt.title('PACF')

plt.show()
# 模型效果评估,利用mse,以为平稳序列呈现比较动荡的状态,
# 利用均方误差进行评估比较合理
ratio=0.25
testsize=int(len(g_diff2)*ratio) #0.25
trainsize=len(g_diff2)-testsize  #0.75
test=g_diff2[-testsize:].values  
train=g_diff2[:trainsize].values
history=list(train)
predictions=list()
#预测添加,训练再预测
for t in range(len(test)):
    model=ARIMA(history,order=(3,0,2))
    model_fit=model.fit()
    output=model_fit.forecast()
    yhat=output[0]
    predictions.append(yhat)
    history.append(yhat)
mse = mean_squared_error(test,predictions)
print("mse",mse)
print(testsize)
x1 = df.index[-testsize:].values
plt.plot(x1,test,label='真实值')
plt.plot(x1,predictions,color='red',label='预测值')
plt.legend()
plt.title('模型评估')
plt.show()
#预测长度需要根据具体时间修改
prediction1=model_fit.forecast(63)[0]
#差分还原
diff_shift_2 = df['存款类机构信用拆借加权利率:7天'].shift(63).values  #这里和下面的63都是预测的长度
diff_shift_2= np.append(diff_shift_2,df['存款类机构信用拆借加权利率:7天'][-63:])[1:] #一阶差分从1开始,2阶差分从2开始
diff_s2_pre = np.append(g_diff2,prediction1)
print(len(diff_shift_2),len(diff_s2_pre)) #两者要一样
diff_recover = diff_s2_pre+diff_shift_2
# 绘图
rng = pd.date_range('2015-01-31', '2027-12-31', freq = '1M')# 文件开始时间加上差分1个月到未来预测的最后时间2027-12-31,原来时间是2014-12-31
print(len(rng))
plt.figure(dpi=200)
history_len = len(diff_recover[:-63]) #少了前两年的历史数据的长度  65
plt.plot(rng[:-63],diff_recover[:-63],label='历史数据')
plt.plot(rng[-63:],diff_recover[-63:],label='未来5年数据')
plt.legend(loc='upper right')
plt.axvline(x=rng[-63], c='r',linestyle='--')

不足之处

本文假设数据是白噪声序列,所以没有进行白噪声检验。

转载需标明原址,本文为参加大湾区杯总结所写

大湾区比赛

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值