时间序列预测---差分自回归移动平均模型(ARIMA模型)

ARIMA模型简介

1. 数据平稳性

了解ARIMA模型就要先了解数据的平稳性,样本数据获得的时间序列,在未来一段时间沿着一个“趋势”发展下去,只有具有平稳性的数据才可以做预测

  • 平稳性的数据均值和方差不发生明显变化
    方差越大数据的波动越大
    时间序列预测---差分自回归移动平均模型(ARIMA模型)_第1张图片

  • 平稳性分为严平稳和弱平稳

    严平稳:严平稳表示的分布不随时间的改变而改变,如:白噪声,无论怎么取,都是期望为0,方差为1;
    弱平稳:期望与相关系数不变,未来某时刻的t值Xt就要依赖于它的过去信息,所以需要依赖性;

2. 差分法

  • 时间序列在t与t-1时刻的差值
fig = plt.figure(figsize=(12, 8))
diff1 = data.diff(1)
diff1.plot()
  • 在一阶差分的基础上进行二阶差分,看数据是否趋于平稳,一般一阶差分后就开始趋于平稳

3. 自回归模型(AR)

  • 描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测

  • 自回归模型必须满足平稳性的要求
    p阶自回归过程的公式定义:在这里插入图片描述

  • 自回归模型的局限性
    自动回归模型是根据自身的历史数据进行预测,数据必须具有平稳性和自相关性,如果自相关系数太小则不宜采用

3.移动平均模型(MA)

  • 移动平均模型关注的是自回归模型中误差项的累加

  • q阶自回归过程的公式定义:在这里插入图片描述

4.差分自回归移动平均模型(ARIMA)

  • AR是自回归,p为自回归项;MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。

  • 原理:将非平稳时间序列转换为平稳时间序列。然后将因变量仅对它滞后值(阶数)以及随机误差项的现值和滞后值进行回归所建立的模型。

5.ARIMA建模过程

  1. 数据预处理,将数据处理成Series格式
  2. 画图观察数据平稳性,若不平稳,可用差分法或指数平滑法对数据进行平稳化处理
  3. 非白噪声检验
  p_value = acorr_ljungbox(timeseries, lags=1) 
  print (p_value)
  1. 模型定阶
    定阶的方法有ACF PACF 图定阶、信息准则定阶(AIC、BIC、HQIC)、热力图定阶。
    (1)ACF和PACF定阶
    时间序列预测---差分自回归移动平均模型(ARIMA模型)_第2张图片(2)信息准则定阶
    AIC = sm.tsa.arma_order_select_ic(timeseries,\
        max_ar=6,max_ma=4,ic='aic')['aic_min_order']
    #BIC
    BIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
           max_ma=4,ic='bic')['bic_min_order']
    #HQIC
    HQIC = sm.tsa.arma_order_select_ic(timeseries,max_ar=6,\
                 max_ma=4,ic='hqic')['hqic_min_order']
    print('the AIC is{},\nthe BIC is{}\n the HQIC is{}'.format(AIC,BIC,HQIC))

(3)热力图定阶

    p_min = 0
    q_min = 0
    p_max = 5
    q_max = 5
    d_min = 0
    d_max = 5
    # 创建Dataframe,以BIC准则
    results_aic = pd.DataFrame(index=['AR{}'.format(i) \
                               for i in range(p_min,p_max+1)],\
            columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
    # itertools.product 返回p,q中的元素的笛卡尔积的元组
    for p,d,q in itertools.product(range(p_min,p_max+1),\
                                   range(d_min,d_max+1),range(q_min,q_max+1)):
        if p==0 and q==0:
            results_aic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
            continue
        try:
            model = sm.tsa.ARIMA(timeseries, order=(p, d, q))
            results = model.fit()
            #返回不同pq下的model的BIC值
            results_aic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.aic
        except:
            continue
    results_aic = results_aic[results_aic.columns].astype(float)
    #print(results_bic)
    
    fig, ax = plt.subplots(figsize=(10, 8))
    ax = sns.heatmap(results_aic,
                 #mask=results_aic.isnull(),
                 ax=ax,
                 annot=True, #将数字显示在热力图上
                 fmt='.2f',
                 )
    ax.set_title('AIC')
    plt.show() 

你可能感兴趣的:(机器学习,python,人工智能)