一般处理时间序列的基本过程:
目录
一、Python处理
1.1.step1:平稳性检验与白噪音检验
1.1.1平稳性检验:ADF检验
1.1.2差分修正:
1.1.3白噪音检验:L-B统计量/Q统计量
1.2.step2:模型识别与定阶
1.2.1法一:观察ACF与PACF的拖尾与截尾
1.2.2法二:AIC与BIC信息准则
1.3.step3:模型构建与预报
1.3.4step4:模型检验
二、Eviews处理
2.1.step1:平稳性检验与白噪音检验
2.2.step2:模型识别与定阶
2.3.step3:模型构建与预报
2.3.1模型构建:
2.3.2模型预报:
三、Python实践过程
以《应用时间序列分析》王燕,第四版中p94-p96页中17题数据为例
基础介绍:
重点参考文章:
时间序列模型(ARIMA和ARMA)完整步骤详述_Foneone的博客-CSDN博客_arma_order_select_ic
首先可以绘制线图直接观察数据走势粗略判断平稳性,既无趋势也无周期;
df.plot(color='blue',title='data-17') #绘制时间序列的线图
· 检验假设:H0:存在单位根 vs H1:不存在单位根
如果序列平稳,则不应存在单位根,所以我们希望能拒绝原假设
· python代码:adfuller
from statsmodels.tsa.stattools import adfuller
adftest = adfuller(x, autolag='AIC') #ADF检验
检验结果如下:
adftest[0]:ADF检验的t值; adftest[1]:ADF检验的t值的p值; adftest[4:6]:ADF检验对应三个置信度(1%,5%,10%)的t值,可以直接将 adftest[0]与这三个值做比较;
由本输出结果来看-5.7185显著小于后面三个t值,且p值接近为0,因而在1%的显著水平下拒绝原假设,认为该序列平稳;
若不平稳可以考虑做差分运算修正为平稳序列
· python代码:timeseries.diff( )
#### 差分运算
def diff(timeseries):
d1_sale=timeseries.diff(periods=1).dropna()#dropna删除NaN
d1_sale.plot(color='orange',title='diff1')
return d1_sale
· 检验假设与统计量:
(上图a.中的“残差”应当替换为“序列”)通常m取【n/10】or【根号n】若观测量较小也可以取【n/4】;若拒绝原假设则认为不是白噪音检验
· python代码:acorr_ljungbox
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
test_value = acorr_ljungbox(timeseries, lags=1)
检验结果如下:
test_value[1]为p值,所以可以在5%的显著水平下认为该序列不是一个白噪音序列
· python代码:
plot_acf(timeseries,lags) #lags:延迟阶数
plot_pacf(timeseries,lags)
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
def determinate_order_acf(timeseries):
plot_acf(timeseries,lags=30) #自己定延迟数
plot_pacf(timeseries,lags=30)
plt.show()
输出结果如下:
迭代不同p与q的取值下的估计,选取AIC与BIC最小的参数p与q;
注:AIC可能高估阶数,BIC可能低估阶数
· python代码:sm.tsa.arma_order_select_ic
#AIC
AIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=4,max_ma=0,ic='aic')
#BIC
BIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=4,max_ma=0,ic='bic')
输出结果:
如果想直接得到AIC与BIC最小的阶数则直接加入索引:['aic_min_order']
#AIC
AIC=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,
ic='aic')['aic_min_order']
#BIC
BIC=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,
ic='bic')['bic_min_order']
print('the AIC is{},\nthe BIC is{}\n'.format(AIC,BIC))
· 模型构建:arma_model = ARMA(train_data,order).fit()
· 模型预报:arma_model.forecast(pred_end)
#### 模型构建:利用机器学习的知识(?
def ARMA_model(train_data,order,pred_end): # train_data:(训练数据,测试数据)拟合数据,order:所定阶数
arma_model = ARMA(train_data,order).fit()#ARMA模型训练器
#拟合结果
print(arma_model.summary())
#给出一个残差序列的方差 尝试作为sigma的估计值(不确定对不对
print('随机扰动项的标准差sigma估计:',np.std(arma_model.resid))
#out_sample_pred = arma_model.predict(start=len(train_data),end = len(train_data)+pred_end-1,dynamic=True)
#print(out_sample_pred)
print('预测未来{}天,其预测结果\n{}\n标准误差\n{}\n置信区间如下:\n{}'.format(pred_end,
arma_model.forecast(pred_end)[0],
arma_model.forecast(pred_end)[1],
arma_model.forecast(pred_end)[2]))
缺点:ARMA模型训练器的结果似乎没有含随机扰动项服从方差的估计(输出残差序列arma_model.resid尝试计算其方差来替代)使用ARIMA模型似乎可以得到sigma的估计值(?不确定 ARIMA的操作还没学www)
输出结果:
把残差序列再做一次白噪音检验;其余还有qq图检验正态性等(待补充)
2.1.1平稳性检验:ADF检验:UnitRoot Test
2.1.2白噪音检验:Correlogram 直接观察ACF的Q检验统计量与p值。本题输出结果如下图,可以拒绝原假设,即是一个非随机序列。如果p值较大,接受原假设,认为是白噪音序列(但此时要注意观察序列线图,有没有存在异方差问题,如果存在异方差,则也不能认为是白噪音)
法一:观察ACF与PACF的拖尾与截尾:Correlogram 直接观察即可。
法二:AIC与BIC准则:eviews内部没有自动迭代检测最小AIC与BIC的方法,只能自行选取几个备选模型分别做拟合,得到的结果中含有AIC的值,自己人工比较;
补一些建模指令:
MA(1)模型:ls x c ma(1)
生成一阶差分:genr->d(x)或x-x(-1)
关于随机扰动项服从标准差的估计值:利用resid序列的统计学描述,选取Std.Dev.作为估计值;
先expand序列的长度,再在拟合的模型上点击forecast,选取预测范围,得到的新的序列内即含有预测的结果;
注:eviews不会提供预报的误差具体值,只会提供一个置信区间的图;
残差的白噪音检验:选择数据框内的r(残差序列)继续:Correlogram 观察ACF的Q检验统计量与p值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #画图
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #ACF与PACF
from statsmodels.tsa.stattools import adfuller #ADF检验
from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
from statsmodels.tsa.arima_model import ARMA #ARMA模型
from statsmodels.tsa.arima_model import ARIMA #ARIMA模型
step1:平稳性检验与白噪音检验
#### 平稳性检验
def ADF_test(timeseries):
x = np.array(timeseries) #转为一维数组
adftest = adfuller(x, autolag='AIC') #ADF检验
print (adftest)
if adftest[0] < adftest[4]["1%"] and adftest[1] < 10**(-6):
# 对比Adf结果和10%的时的假设检验 以及 P-value是否非常接近0(越小越好)
print("序列平稳")
return True
else:
print("非平稳序列")
return False
#### 随机性检验(白噪声检验)
def random_test(timeseries) :
p_value = acorr_ljungbox(timeseries, lags=1) # p_value 返回二维数组,第二维为P值
#print(p_value)
if p_value[1] < 0.05:
print("非随机性序列")
return True
else:
print("随机性序列,即白噪声序列")
return False
"""
————————————————
版权声明:本文为CSDN博主「Foneone」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/foneone/article/details/90141213
"""
注:我在实际使用上述ADF检验时会出现与eviews的ADF检验输出的统计量结果相差很多的情况,暂时不知道问题出在了哪里。
差分运算:
#### 差分运算
def diff(timeseries):
d1_sale=timeseries.diff(periods=1).dropna()#dropna删除NaN
d1_sale.plot(color='orange',title='diff1')
return d1_sale
step2:模型选择与定阶
模型选择:绘制ACF与PACF
#### 绘制ACF与PACF的图像
def plot_acf_pacf(timeseries): #利用ACF和PACF判断模型阶数
plot_acf(timeseries,lags=30) #延迟数
plot_pacf(timeseries,lags=30)
plt.show()
AIC与BIC定阶:两种方法
#法一:利用自带函数:ARIMA模型则需要用差分后的序列带入。
#法二:迭代调优
法二参考文章:时间序列分析ARIMA及其Python实现_木星健谈能手的博客-CSDN博客_arima python实现
#### AIC与BIC定阶
#法一:利用自带函数
def detetminante_order(timeseries,ar_max,ma_max): #信息准则定阶:AIC、BIC
#AIC
AIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,ic='aic')
#BIC
BIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,ic='bic')
print('the AIC is{},\nthe BIC is{}\n'.format(AIC_summary.['aic_min_order'],BIC.['bic_min_order']))
print(AIC_summary,'\n',BIC_summary)
#法二:迭代调优
def determine_aic_arima(train_data,pmax,I,qmax):
aic_matrix=[]
for p in range(pmax+1):
tmp=[]
for q in range(qmax+1):
try:
tmp.append(ARIMA(train_data,order=(p,I,q)).fit().aic)
except:
tmp.append(None)
aic_matrix.append(tmp)
aic_matrix=pd.DataFrame(aic_matrix)
p,q=aic_matrix.stack().idxmin() #最小值的索引
print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))
def determine_bic_arima(train_data,pmax,I,qmax):
bic_matrix=[]
for p in range(pmax+1):
tmp=[]
for q in range(qmax+1):
try:
tmp.append(ARIMA(train_data,order=(p,I,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
p,q=bic_matrix.stack().idxmin() #最小值的索引
print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))
step3:模型构建与预报
如果需要拟合ARIMA,则只需要替换为ARIMA(train_data,order).fit()即可
#### 模型构建:利用机器学习的知识(?
def ARMA_model(train_data,order,pred_end): # train_data:(训练数据,测试数据)拟合数据,order:所定阶数
arma_model = ARMA(train_data,order).fit()#ARMA模型训练器
print(arma_model.summary()) #拟合结果
print('随机扰动项的标准差sigma估计:',np.std(arma_model.resid))#给出一个残差序列的方差 尝试作为sigma的估计值(不确定对不对
print('预测未来{}天,其预测结果\n{}\n标准误差\n{}\n置信区间如下:\n{}'.format(pred_end,
arma_model.forecast(pred_end)[0],
arma_model.forecast(pred_end)[1],
arma_model.forecast(pred_end)[2]))
正式过程:
df1=pd.read_excel(r'F:\个人嘿嘿嘿\北师大BNU\研一上-课业资料\时间序列\作业2\timeseries17.xlsx')
df17=df1['cq']
df17.plot(color='blue',title='data-17') #绘制时间序列的线图
plot_acf_pacf(df17) #绘制时间序列的ACF与PACF
ADF_test(df17) #平稳性检验
random_test(df17) #白噪音检验
detetminante_order(df17,4,0) #AIC,BIC定阶
ARMA_model(df17,(1,0),5) #模型拟合和预报