zoukankan      html  css  js  c++  java
  • ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数

    https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看。尤其是arima的举例!

    可以看到:ARIMA本质上是error和t-?时刻数据差分的线性模型!!!

    ARIMA模型全称为自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model,简记ARIMA),是由博克思(Box)和詹金斯(Jenkins)于70年代初提出一著名时间序列(Time-series Approach)预测方法 [1]  ,所以又称为Box-Jenkins模型、博克思-詹金斯法。其中ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。所谓ARIMA模型,是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。ARIMA模型根据原序列是否平稳以及回归中所含部分的不同,包括移动平均过程(MA)、自回归过程(AR)、自回归移动平均过程(ARMA)以及ARIMA过程。

    优点: 模型十分简单,只需要内生变量而不需要借助其他外生变量。

    缺点:
    1.要求时序数据是稳定的(stationary),或者是通过差分化(differencing)后是稳定的。
    2.本质上只能捕捉线性关系,而不能捕捉非线性关系。
    注意,采用ARIMA模型预测时序数据,必须是稳定的,如果不稳定的数据,是无法捕捉到规律的。比如股票数据用ARIMA无法预测的原因就是股票数据是非稳定的,常常受政策和新闻的影响而波动。

     

    严谨的定义: 一个时间序列的随机变量是稳定的,当且仅当它的所有统计特征都是独立于时间的(是关于时间的常量)。
    判断的方法:

    1. 稳定的数据是没有趋势(trend),没有周期性(seasonality)的; 即它的均值,在时间轴上拥有常量的振幅,并且它的方差,在时间轴上是趋于同一个稳定的值的。
    2. 可以使用Dickey-Fuller Test进行假设检验。
       

    ARIMA模型有三个参数:p,d,q。

    • p--代表预测模型中采用的时序数据本身的滞后数(lags) ,也叫做AR/Auto-Regressive项
    • d--代表时序数据需要进行几阶差分化,才是稳定的,也叫Integrated项。
    • q--代表预测模型中采用的预测误差的滞后数(lags),也叫做MA/Moving Average项

    ARIMA建模基本步骤

      1. 获取被观测系统时间序列数据;
      2. 对数据绘图,观测是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分运算,化为平稳时间序列
      3. 经过第二步处理,已经得到平稳时间序列。要对平稳时间序列分别求得其自相关系数ACF 和偏自相关系数PACF,通过对自相关图和偏自相关图的分析,得到最佳的阶层 p 和阶数 q
      4. 由以上得到的d、q、p,得到ARIMA模型。然后开始对得到的模型进行模型检验。
        具体例子会在另一篇文章中给出。

    from:https://www.cnblogs.com/bradleon/p/6827109.html

     

    预测程序

    ARIMA模型预测的基本程序
    (一)根据时间序列的散点图、自相关函数和偏自相关函数图以ADF单位根检验其方差、趋势及其季节性变化规律,对序列的平稳性进行识别。一般来讲,经济运行的时间序列都不是平稳序列。
    (二)对非平稳序列进行平稳化处理。如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理,如果数据存在异方差,则需对数据进行技术处理,直到处理后的数据的自相关函数值和偏相关函数值无显著地异于零。
    (三)根据时间序列模型的识别规则,建立相应的模型。若平稳序列的偏相关函数是截尾的,而自相关函数是拖尾的,可断定序列适合AR模型;若平稳序列的偏相关函数是拖尾的,而自相关函数是截尾的,则可断定序列适合MA模型;若平稳序列的偏相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。(截尾是指时间序列的自相关函数(ACF)或偏自相关函数(PACF)在某阶后均为0的性质(比如AR的PACF);拖尾是ACF或PACF并不在某阶后均为0的性质(比如AR的ACF)。)
    (四)进行参数估计,检验是否具有统计意义。
    (五)进行假设检验,诊断残差序列是否为白噪声。
    (六)利用已通过检验的模型进行预测分析。
    二、应用ARIMA模型进行预测
    每月税收数据.可以看作是随着时间的推移而形成的一个随机时间序列,通过对该时间序列上税款值的随机性、平稳性以及季节性等因素的分析,将这些单月税收值之间所具有的相关性或依存关系用数学模型描述出来,从而达到利用过去及现在的税收值信息来预测未来税收情况的目的。
    (一)对序列取对数和作差分处理,形成稳定随机序列
    ARIMA模型建模的基本条件是要求待预测的数列满足平稳的条件,即个体值要围绕序列均值上下波动,不能有明显的上升或下降趋势,如果出现上升或下降趋势,需要对原始序列进行差分平稳化处理。
    (二)模型参数的估计
    时间序列预测模块的自相关分析包括对自相关系数和偏相关系数的分析,通过对比分析从而实现对时间序列特性的识别。从计算结果可知,自相关函数1步截尾,偏自相关函数2步截尾,自相关函数通过白噪声检验。根据变换数列的自相关函数和偏自相关函数的特点,并经过反复测试,对ARIMA模型的参数进行估计.三个参数定为d=l,p=2和q=l。
    对参数进行检验。从检验结果可知,参数估计全部通过显著性检验.拟合优度统计量表中给出了残差序列的方差(0.063367)和标准误差(0.251729),以及按AIC和SBC标准计算的统计量(9.496798)和(18.54752),这两个值都较小,表明对预测模型拟合得较好。从残差的自相关检验结果数据中.可以得知残差通过白噪声显著性检验。预测模型最终形式为:(14-0.98284B)(1+0.56103B-2)Z=(1-0.34111B)(1+B)u其中,Z=logX。B为后移算子,u为随机干扰项。
     

    使用ARIMA模型对裙子长度预测

    from:https://www.cnblogs.com/ECJTUACM-873284962/p/7379717.html

    1、加载数据

    skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat", skip=5)
    str(skirts)
    head(skirts)
    boxplot(skirts)
    length(skirts)

    2、把数据转化为是时间序列

    skirts_ts <- ts(skirts, start=c(1886), frequency=1)

    1)查看时间序列对应的时间

    skirts_ts

    2)画出时间序列图

    plot.ts(skirts_ts)

    从图可知:女人裙子边缘的直径做成的时间序列数据,从 1866 年到 1911 年在平均值上是不平稳的


    3、做差分得到平稳序列

    1)做时间序列的一阶差分

    skirts_diff <- diff(skirts_ts, differences = 1)
    plot.ts(skirts_diff)

    从一阶差分的图中可以看出,数据仍是不平稳的,继续差分


    2)做时间序列的二阶差分

    skirts_diff2 <- diff(skirts_ts, differences = 2)
    plot.ts(skirts_diff2)

    二次差分后的时间序列在均值和方差上看起来是平稳了


    4、找到合适的ARIMA模型

    寻找 ARIMA(p,d,q)中合适的 p 值和 q

    1)自相关图ACF

    acf(skirts_diff2, lag.max = 20)
    
    acf(skirts_diff2, lag.max = 20, plot = F)

    自相关图显示滞后1阶自相关值基本没有超过边界值,虽然5阶自相关值超出边界,那么很可能属于偶然出现的,而自相关值在其他上都没有超出显著边界, 而且我们可以期望 1 到 20 之间的会偶尔超出 95%的置信边界。 自相关图5阶后结尾


    2)偏相关图PACF

    pacf(skirts_diff2, lag.max = 20)
    
    pacf(skirts_diff2, lag.max = 20, plot = F)

    偏自相关值选1阶后结尾
    故我们的ARMIA模型为armia(1,2,5


    3)使用auto.arima()函数,自动获取最佳的ARIMA模型

    library(forecast)
    
    auto.arima(skirts_ts, ic=c("aicc", "aic", "bic"), trace = T)

    Best model: ARIMA(1,2,0)

    5、建立ARIMA模型:并对比arima(1, 2, 0)与arima(1, 2, 5)模型


    1)arima(1, 2, 0)模型

    (skirts_arima <- arima(skirts_ts, order = c(1, 2, 0)))

    aic = 391.33

    2)arima(1, 2, 5)模型

    (skirts_arima <- arima(skirts_ts, order = c(1, 2, 5)))

    aic = 381.6

    AIC是赤池消息准则SC是施瓦茨准则,当两个数值最小时,则是最优滞后分布的长度。我们进行模型选择时,AIC值越小越好。所以arima(1, 2, 5)模型较好

    6、预测:预测5年后裙子的边缘直径

    (skirts_forecast <- forecast.Arima(skirts_arima, h=5, level = c(99.5)))
    
    plot.forecast(skirts_forecast)
     

    ARIMA 模型实践

    from:https://www.jianshu.com/p/4130bac8ebec

    模型具体的理论知识就不再做过多说明了,来个实际的例子吧。

    ARIMA 模型对湖北省 GDP 的实证分析及预测

    这里的例子是采用了一篇论文的数据,【ARIMA模型在湖北省GDP预测中的应用】,可以去中国知网搜索篇名进行下载。

    年份GDP
    1978 151.00
    1979 188.46
    1980 199.38
    ... ...
    2013 24668.49

    数据的平稳性处理及检验

    这里我们用 Python 对数据进行分析处理建模。

    画出原始数据的时间路径图

    #-*- coding:utf-8 -*-
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import statsmodels.api as sm
    from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf
    from statsmodels.tsa.arima_model import ARMA
    
    time_series = pd.Series([151.0, 188.46, 199.38, 219.75, 241.55, 262.58, 328.22, 396.26, 442.04, 517.77, 626.52, 717.08, 824.38, 913.38, 1088.39, 1325.83, 1700.92, 2109.38, 2499.77, 2856.47, 3114.02, 3229.29, 3545.39, 3880.53, 4212.82, 4757.45, 5633.24, 6590.19, 7617.47, 9333.4, 11328.92, 12961.1, 15967.61])
    time_series.index = pd.Index(sm.tsa.datetools.dates_from_range('1978','2010'))
    time_series.plot(figsize=(12,8))
    plt.show()
    
    原始数据.png

    由上图我们可以看出,这个时间序列是呈指数形式的,波动性比较大,不是稳定的时间序列,一般对于这种指数形式的数据,可以对其取对数,将其转化为线性趋势。

    time_series = np.log(time_series)
    time_series.plot(figsize=(8,6))
    plt.show()
    
    对原始数据取对数.png

    由上图可以看出,去了对数之后的时间路径图明显具有线性趋势,为了确定其稳定性,对取对数后的数据进行 adf 检验

    t=sm.tsa.stattools.adfuller(time_series, )
    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%']
    print(output)
    

    检验结果如下

    检验项检验结果
    Test Statistic Value 0.807369
    p-value 0.991754
    Lags Used 1
    Number of Observations Used 31
    Critical Value(1%) -3.66143
    Critical Value(5%) -2.96053
    Critical Value(10%) -2.61932

    由上表可知,t 统计量要大于任何置信度的临界值,因此认为该序列是非平稳的,所以再对序列进行差分处理,发现差分之后的序列基本达到稳定,如下图所示,并且通过了 ADF 检验,检验结果见下表。

    
    time_series = time_series.diff(1)
    time_series = time_series.dropna(how=any)
    time_series.plot(figsize=(8,6))
    plt.show()
    t=sm.tsa.stattools.adfuller(time_series)
    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%']
    print(output)
    
    差分.png
    检验项检验结果
    Test Statistic Value -3.52276
    p-value 0.00742139
    Lags Used 0
    Number of Observations Used 31
    Critical Value(1%) -3.66143
    Critical Value(5%) -2.96053
    Critical Value(10%) -2.61932

    确定自相关系数和平均移动系数(p,q)

    根据时间序列的识别规则,采用 ACF 图、PAC 图,AIC 准则(赤道信息量准则)和 BIC 准则(贝叶斯准则)相结合的方式来确定 ARMA 模型的阶数, 应当选取 AIC 和 BIC 值达到最小的那一组为理想阶数。

    plot_acf(time_series)
    plot_pacf(time_series)
    plt.show()
    
    r,rac,Q = sm.tsa.acf(time_series, qstat=True)
    prac = pacf(time_series,method='ywmle')
    table_data = np.c_[range(1,len(r)), r[1:],rac,prac[1:len(rac)+1],Q]
    table = pd.DataFrame(table_data, columns=['lag', "AC","Q", "PAC", "Prob(>Q)"])
    
    print(table)
    
    偏自相关图.png

    自相关图.png

    ARIMA.png

    根据上面的几个图,我们可以先取 p=1, q=2。进行模型估计,结果见下图。

    p,d,q = (1,1,2)
    arma_mod = ARMA(time_series,(p,d,q)).fit(disp=-1,method='mle')
    summary = (arma_mod.summary2(alpha=.05, float_format="%.8f"))
    print(summary)
    
    模型结果.png

    这里的 p和q 参数可以调整,然后找出最佳的(AIC最小,BIC最小),经过比较, p=0,q=1 为理想阶数。
    这里有一个自动取 p和q 的函数,如果要自动定阶的话,可以采用

    (p, q) =(sm.tsa.arma_order_select_ic(dta,max_ar=3,max_ma=3,ic='aic')['aic_min_order'])
    #这里需要设定自动取阶的 p和q 的最大值,即函数里面的max_ar,和max_ma。ic 参数表示选用的选取标准,这里设置的为aic,当然也可以用bic。然后函数会算出每个 p和q 组合(这里是(0,0)~(3,3)的AIC的值,取其中最小的,这里的结果是(p=0,q=1)。
    

    残差和白噪声检验

    个人感觉这个就是对模型 ARIMA(0,1,1) 的残差序列 arma_mod.resid 进行 ADF 检验。

    arma_mod = ARMA(time_series,(0,1,1)).fit(disp=-1,method='mle')
    resid = arma_mod.resid
    t=sm.tsa.stattools.adfuller(resid)
    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%']
    print(output)
    #结果如下
    Test Statistic Value           -3.114
    p-value                      0.025534
    Lags Used                           1
    Number of Observations Used        30
    Critical Value(1%)           -3.66992
    Critical Value(5%)           -2.96407
    Critical Value(10%)          -2.62117
    
    

    当然这里也可以画出 acf 图和 pacf 图。

    模型预测

    arma_model = sm.tsa.ARMA(time_series,(0,1)).fit(disp=-1,maxiter=100)
    
    predict_data = arma_model.predict(start=str(1979), end=str(2010+3), dynamic = False)
    
    
    预测结果.png

    预测结果还原

    对预测出来的数据,进行逆差分操作(由原始数据取对数后的数据加上预测出来的数据),然后再取指数即可还原。


    预测结果还原.png
    年份2011年2012年2013年
    实际值 19632.26 22250.45 24668.49
    预测值 19314.03 22415.10 26014.08

    上图最后3个为预测值,然后查询2011年到2013年湖北GDP的实际值,可以进行对照

    年份2011年2012年2013年
    实际值 19632.26 22250.45 24668.49
    预测值 19314.03 22415.10 26014.08
    原始数据与预测结果.png

    小结

    从预测对结果看,2011年到2013年的预测结果和实际的差别不大。这个模型在短期预测结果比较好。模型处理主要还是应用了Python 第三方库 statsmodels 中的模型算法,其中还有很多细节,可以查阅相关文档,这里只是简单的应用了一下,由于代码都是一小段一小段写的,很乱,只提供了一些片段供参考。

    参考资料

    python时间序列分析
    时间序列实战(一)
    用ARIMA模型做需求预测
    python 时间序列分析之ARIMA
    ARIMA模型文档



    作者:熙淺
    链接:https://www.jianshu.com/p/4130bac8ebec
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    Lookup注解
    解决数据量大,分页查询慢的方案
    一个http的请求分析
    MYSQL
    什么是性能优化
    编码规范随笔
    装饰者模式
    单例模式
    J.U.C并发包(1)
    Java内存模型
  • 原文地址:https://www.cnblogs.com/bonelee/p/9523452.html
Copyright © 2011-2022 走看看