当前位置:   article > 正文

时间序列基础操作:使用python与eviews对AR与ARMA模型进行定阶与预报_sm.tsa.arma_order_select_ic

sm.tsa.arma_order_select_ic

一般处理时间序列的基本过程:(无季节趋势)

处理时间序列的简单过程(无季节趋势)

注:上图中LB检验的统计量纠正:n*(n+2),而不是n*(n-2)

 几种基础时间序列模型(模型的具体形式补充见文末):

目录

一、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模型预报:

2.4.step4:模型检验

2.5ARCH模型的检验和建立

ARCH效应检验:LM检验

对残差建立ARCH模型

三、Python实践过程 


以《应用时间序列分析》王燕,第四版中p94-p96页中17题数据为例

基础介绍:

一、Python处理

重点参考文章:

时间序列模型(ARIMA和ARMA)完整步骤详述_Foneone的博客-CSDN博客_arma_order_select_ic

1.1.step1:平稳性检验与白噪音检验

首先可以绘制线图直接观察数据走势粗略判断平稳性,既无趋势也无周期;

df.plot(color='blue',title='data-17') #绘制时间序列的线图

1.1.1平稳性检验:ADF检验

· 检验假设:H0:存在单位根 vs H1:不存在单位根

如果序列平稳,则不应存在单位根,所以我们希望能拒绝原假设

· python代码:adfuller

  1. from statsmodels.tsa.stattools import adfuller
  2. 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%的显著水平下拒绝原假设,认为该序列平稳;

1.1.2差分修正:

若不平稳可以考虑做差分运算修正为平稳序列。若差分后平稳,则对原序列建立ARIMA模型。

· python代码:timeseries.diff( )

  1. #### 差分运算
  2. def diff(timeseries):
  3. d1_sale=timeseries.diff(periods=1).dropna()#dropna删除NaN
  4. d1_sale.plot(color='orange',title='diff1')
  5. return d1_sale

1.1.3白噪音检验:L-B统计量/Q统计量

· 检验假设与统计量:

(上图a.中的“残差”应当替换为“序列”)通常m取【n/10】or【根号n】若观测量较小也可以取【n/4】;若拒绝原假设则认为不是白噪音检验

· python代码:acorr_ljungbox

  1. from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
  2. test_value = acorr_ljungbox(timeseries, lags=1)

检验结果如下:

 test_value[1]为p值,所以可以在5%的显著水平下认为该序列不是一个白噪音序列

1.2.step2:模型识别与定阶

1.2.1法一:观察ACF与PACF的拖尾与截尾

· python代码:

plot_acf(timeseries,lags) #lags:延迟阶数

plot_pacf(timeseries,lags)

  1. import statsmodels.api as sm
  2. from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
  3. def determinate_order_acf(timeseries):
  4. plot_acf(timeseries,lags=30) #自己定延迟数
  5. plot_pacf(timeseries,lags=30)
  6. plt.show()

输出结果如下:

1.2.2法二:AIC与BIC信息准则

迭代不同p与q的取值下的估计,选取AIC与BIC最小的参数p与q;

注:AIC可能高估阶数,BIC可能低估阶数

· python代码:sm.tsa.arma_order_select_ic

  1. #AIC
  2. AIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=4,max_ma=0,ic='aic')
  3. #BIC
  4. BIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=4,max_ma=0,ic='bic')

输出结果:

如果想直接得到AIC与BIC最小的阶数则直接加入索引:['aic_min_order']

  1. #AIC
  2. AIC=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,
  3. ic='aic')['aic_min_order']
  4. #BIC
  5. BIC=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,
  6. ic='bic')['bic_min_order']
  7. print('the AIC is{},\nthe BIC is{}\n'.format(AIC,BIC))

1.3.step3:模型构建与预报

· 模型构建:arma_model = ARMA(train_data,order).fit()

· 模型预报:arma_model.forecast(pred_end)

  1. #### 模型构建:利用机器学习的知识(?
  2. def ARMA_model(train_data,order,pred_end): # train_data:(训练数据,测试数据)拟合数据,order:所定阶数
  3. arma_model = ARMA(train_data,order).fit()#ARMA模型训练器
  4. #拟合结果
  5. print(arma_model.summary())
  6. #给出一个残差序列的方差 尝试作为sigma的估计值(不确定对不对
  7. print('随机扰动项的标准差sigma估计:',np.std(arma_model.resid))
  8. #out_sample_pred = arma_model.predict(start=len(train_data),end = len(train_data)+pred_end-1,dynamic=True)
  9. #print(out_sample_pred)
  10. print('预测未来{}天,其预测结果\n{}\n标准误差\n{}\n置信区间如下:\n{}'.format(pred_end,
  11. arma_model.forecast(pred_end)[0],
  12. arma_model.forecast(pred_end)[1],
  13. arma_model.forecast(pred_end)[2]))

缺点:ARMA模型训练器的结果似乎没有含随机扰动项服从方差的估计(输出残差序列arma_model.resid尝试计算其方差来替代)使用ARIMA模型似乎可以得到sigma的估计值(?不确定 ARIMA的操作还没学www)

输出结果:

1.3.4step4:模型检验

把残差序列再做一次白噪音检验;其余还有qq图检验正态性等(待补充)

二、Eviews处理

2.1.step1:平稳性检验与白噪音检验

2.1.1平稳性检验:ADF检验:UnitRoot Test

2.1.2白噪音检验:Correlogram 直接观察ACF的Q检验统计量与p值。本题输出结果如下图,可以拒绝原假设,即是一个非随机序列。如果p值较大,接受原假设,认为是白噪音序列(但此时要注意观察序列线图,有没有存在异方差问题,如果存在异方差,则也不能认为是白噪音)

2.2.step2:模型识别与定阶

法一:观察ACF与PACF的拖尾与截尾:Correlogram 直接观察即可。

法二:AIC与BIC准则:eviews内部没有自动迭代检测最小AIC与BIC的方法,只能自行选取几个备选模型分别做拟合,得到的结果中含有AIC的值,自己人工比较;

2.3.step3:模型构建与预报

2.3.1模型构建:

补一些建模指令:

MA(1)模型:ls x c ma(1)

生成一阶差分:genr->d(x)或x-x(-1)

 关于随机扰动项服从标准差的估计值:利用resid序列的统计学描述,选取Std.Dev.作为估计值;

2.3.2模型预报:

 先expand序列的长度,再在拟合的模型上点击forecast,选取预测范围,得到的新的序列内即含有预测的结果;

注:eviews不会提供预报的误差具体值,只会提供一个置信区间的图;

2.4.step4:模型检验

残差的白噪音检验:选择数据框内的r(残差序列)继续:Correlogram 观察ACF的Q检验统计量与p值。

2.5ARCH模型的检验和建立

(此处使用的是一组新数据)

ARCH模型的形式:

step1:按照前面的方式建立合适的主回归模型

step2:ARCH效应检验:LM检验

对主模型的残差做ARCH效应的LM检验

View→Residual Diagnostics→Heteroskedasticity Tests→ARCH 然后再lags处自己定延迟阶数

 LM检验:H0不存在ARCH效应的异方差问题

观察检验的p值:若p值很小,则拒绝原假设,认为残差具有异方差问题,存在ARCH效应。

 step3:对残差建立ARCH模型

三、Python实践过程 

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt #画图
  4. import statsmodels.api as sm
  5. from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #ACF与PACF
  6. from statsmodels.tsa.stattools import adfuller #ADF检验
  7. from statsmodels.stats.diagnostic import acorr_ljungbox #白噪声检验
  8. from statsmodels.tsa.arima_model import ARMA #ARMA模型
  9. from statsmodels.tsa.arima_model import ARIMA #ARIMA模型

step1:平稳性检验与白噪音检验

  1. #### 平稳性检验
  2. def ADF_test(timeseries):
  3. x = np.array(timeseries) #转为一维数组
  4. adftest = adfuller(x, autolag='AIC') #ADF检验
  5. print (adftest)
  6. if adftest[0] < adftest[4]["1%"] and adftest[1] < 10**(-6):
  7. # 对比Adf结果和10%的时的假设检验 以及 P-value是否非常接近0(越小越好)
  8. print("序列平稳")
  9. return True
  10. else:
  11. print("非平稳序列")
  12. return False
  13. #### 随机性检验(白噪声检验)
  14. def random_test(timeseries) :
  15. p_value = acorr_ljungbox(timeseries, lags=1) # p_value 返回二维数组,第二维为P值
  16. #print(p_value)
  17. if p_value[1] < 0.05:
  18. print("非随机性序列")
  19. return True
  20. else:
  21. print("随机性序列,即白噪声序列")
  22. return False
  23. """
  24. ————————————————
  25. 版权声明:本文为CSDN博主「Foneone」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  26. 原文链接:https://blog.csdn.net/foneone/article/details/90141213
  27. """

注:我在实际使用上述ADF检验时会出现与eviews的ADF检验输出的统计量结果相差很多的情况,暂时不知道问题出在了哪里。

 差分运算:

  1. #### 差分运算
  2. def diff(timeseries):
  3. d1_sale=timeseries.diff(periods=1).dropna()#dropna删除NaN
  4. d1_sale.plot(color='orange',title='diff1')
  5. return d1_sale

 step2:模型选择与定阶

模型选择:绘制ACF与PACF

  1. #### 绘制ACF与PACF的图像
  2. def plot_acf_pacf(timeseries): #利用ACF和PACF判断模型阶数
  3. plot_acf(timeseries,lags=30) #延迟数
  4. plot_pacf(timeseries,lags=30)
  5. plt.show()

 AIC与BIC定阶:两种方法

#法一:利用自带函数:ARIMA模型则需要用差分后的序列带入。

#法二:迭代调优

法二参考文章:时间序列分析ARIMA及其Python实现_木星健谈能手的博客-CSDN博客_arima python实现

  1. #### AIC与BIC定阶
  2. #法一:利用自带函数
  3. def detetminante_order(timeseries,ar_max,ma_max): #信息准则定阶:AIC、BIC
  4. #AIC
  5. AIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,ic='aic')
  6. #BIC
  7. BIC_summary=sm.tsa.arma_order_select_ic(timeseries,max_ar=ar_max,max_ma=ma_max,ic='bic')
  8. print('the AIC is{},\nthe BIC is{}\n'.format(AIC_summary.['aic_min_order'],BIC.['bic_min_order']))
  9. print(AIC_summary,'\n',BIC_summary)
  10. #法二:迭代调优
  11. def determine_aic_arima(train_data,pmax,I,qmax):
  12. aic_matrix=[]
  13. for p in range(pmax+1):
  14. tmp=[]
  15. for q in range(qmax+1):
  16. try:
  17. tmp.append(ARIMA(train_data,order=(p,I,q)).fit().aic)
  18. except:
  19. tmp.append(None)
  20. aic_matrix.append(tmp)
  21. aic_matrix=pd.DataFrame(aic_matrix)
  22. p,q=aic_matrix.stack().idxmin() #最小值的索引
  23. print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))
  24. def determine_bic_arima(train_data,pmax,I,qmax):
  25. bic_matrix=[]
  26. for p in range(pmax+1):
  27. tmp=[]
  28. for q in range(qmax+1):
  29. try:
  30. tmp.append(ARIMA(train_data,order=(p,I,q)).fit().bic)
  31. except:
  32. tmp.append(None)
  33. bic_matrix.append(tmp)
  34. bic_matrix=pd.DataFrame(bic_matrix)
  35. p,q=bic_matrix.stack().idxmin() #最小值的索引
  36. print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))

 step3:模型构建与预报

如果需要拟合ARIMA,则只需要替换为ARIMA(train_data,order).fit()即可

  1. #### 模型构建:利用机器学习的知识(?
  2. def ARMA_model(train_data,order,pred_end): # train_data:(训练数据,测试数据)拟合数据,order:所定阶数
  3. arma_model = ARMA(train_data,order).fit()#ARMA模型训练器
  4. print(arma_model.summary()) #拟合结果
  5. print('随机扰动项的标准差sigma估计:',np.std(arma_model.resid))#给出一个残差序列的方差 尝试作为sigma的估计值(不确定对不对
  6. print('预测未来{}天,其预测结果\n{}\n标准误差\n{}\n置信区间如下:\n{}'.format(pred_end,
  7. arma_model.forecast(pred_end)[0],
  8. arma_model.forecast(pred_end)[1],
  9. arma_model.forecast(pred_end)[2]))

正式过程:

  1. df1=pd.read_excel(r'F:\个人嘿嘿嘿\北师大BNU\研一上-课业资料\时间序列\作业2\timeseries17.xlsx')
  2. df17=df1['cq']
  3. df17.plot(color='blue',title='data-17') #绘制时间序列的线图
  4. plot_acf_pacf(df17) #绘制时间序列的ACF与PACF
  5. ADF_test(df17) #平稳性检验
  6. random_test(df17) #白噪音检验
  7. detetminante_order(df17,4,0) #AIC,BIC定阶
  8. ARMA_model(df17,(1,0),5) #模型拟合和预报

四、时序常见模型的形态

(一)AR模型(自回归模型)

当前时间点的数据与过去自身数据的关系。

(二)MA模型(滑动平均模型)

当前时间点的数据与过去噪声的关系。

(三)ARMA模型(自回归滑动平均模型)

(四)ARIMA模型:针对有趋势的时间序列

(五)乘积的ARMA模型:有季节周期的时间序列

(六)乘积的ARIMA模型:有趋势+周期的时间序列

(七)ARCH模型+GARCH模型

ARCH模型:自回归条件异方差模型

特点:当自回归模型的残差是异方差时,对残差形式做了变换,使其等于过去残差的某种变换,从而满足同方差假定;

GARCH模型:引入滞后算子的自回归条件异方差模型

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

闽ICP备14008679号