ARMA/ARIMA/SARIMA模型预测

a基本原理:

这三种模型都是用来预测时序性数据。其中ARIMA和SARIMA是由ARMA模型演变过来的,而ARMA是由AR模型(自回归模型)和MA模型(移动平均模型)组合出来的(AR模型和MA模型会在下文讲解)。

假设有一个时间节点t。AR做的事是利用t之前的随机变量来预测t之后随机变量;MA做的事是利用t之前(包括t)的随机误差项和滞后误差项,来形成一个误差项模型。

AR模型可以理解成ARMA模型的一种特殊的形式,相对而言ARMA功能更强大。

ARMA:针对弱平稳、宽平稳时间序列分析

ARIMA:针对非平稳、非周期性时间序列分析

SARIMA:针对非平稳、周期性时间序列分析

b模型原理:

AR模型(自回归模型)

  自回归模型(Autoregressive Model)是用自身做回归变量的过程,即利用历史时序数据值的线性组合来预测当前时刻点的线性回归模型,它是时间序列中的一种常见形式。

SARIMA模型 python SARIMA模型是线性模型_python

MA模型(移动平均模型)

MA模型和AR模型大同小异。移动平均模型(moving average model)使用历史白噪声的线性组合来预测当前时刻点的线性回归模型。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。

SARIMA模型 python SARIMA模型是线性模型_机器学习_02

ARMA模型(自回归移动平均模型)

ARMA(Auto-Regressive and Moving Average Model)模型顾名思义就是将AR模型和MA模型结合起来,即历史随机变量和历史白噪声结合起来,其模型可以看成是AR模型+MA模型。

SARIMA模型 python SARIMA模型是线性模型_时序模型_03

ARIMA模型(整合自回归移动平均模型)

ARIMA(Autoregressive Integrated Moving Average model)模型就是在ARMA模型的基础上多了一个差分数据处理。该模型的主要功能是将不平稳数据进行d次差分形成一个平稳的时间序列数据,然后采用ARMA模型。模型记为ARIMA(p,d,q),其中p和q就是ARMA(p,q)模型里面的p和q,而d是差分的次数(阶数)。

设当前时间为t,那么先将[t-p,t-1]历史随机变量和[t-q,t-1]历史白噪声进行d次差分形成平稳的时间序列数据,再将数据进行ARMA(p,q),则称该模型为(p,d,q)阶整合自回归移动平均模型,其数学模型和ARMA的模型一致。

SARIMA模型(季节性整合自回归移动平均模型)

SARIMA(Seasonal Autoregressive Integrated Moving Average)模型在非稳的数据上多了一些对有周期性特征数据的处理。其主要原理是来源于外界对数据周期性的观察,得到季节的长度(s)、季节自回归的阶数(P,取值由PACF判断)、季节移动平均的阶数(Q,取值由ACF判断)季节差分的阶数(D,一般就是0或1),再建立关于季节性的模型,将该模型和ARIMA模型结合,就是SARIMA模型。

c算法入口:

SARIMA模型 python SARIMA模型是线性模型_SARIMA模型 python_04

SARIMA模型 python SARIMA模型是线性模型_SARIMA模型 python_05

SARIMA模型 python SARIMA模型是线性模型_SARIMA模型 python_06

SARIMA模型 python SARIMA模型是线性模型_python_07

d如何选择p、q值?

  1. 利用自身相关函数(ACF)和偏自身相关函数(PACF)画出相应的图。利用图中的趋势 变换情况判断该趋势属于截尾还是拖尾情况,再通过图像判断其是在第几阶拖尾/截尾 的。在自相关函数(ACF)第p阶拖尾,偏自相关函数(PACF)第q阶拖尾。

AR(p)在自相关函数(ACF)第p阶拖尾,偏自相关函数(PACF)第q阶截尾。

MA(q)在自偏自相关函数(PACF)第q阶拖尾,自相关函数(ACF)第阶截尾。

ARMA(p,q)在自相关函数(ACF)第p阶拖尾,偏自相关函数(PACF)第q阶拖尾。

注:模型计算的时候有时还需要考虑一下p+1、p-1、q+1、q-1这样的情况。ACF和PACF 判断只是一种近似判断,所以还需要考虑一下几种情况差不多的概率。

2.第二种方法相对简单,因为通常状态下p和q的阶数不会太大(况且要是p和q的阶数 太大的话ARMA模型会很慢),所以可以暴力枚举所有的p和q的组合,找出aic (Akaike information criterion)最小的情况,即为最优的p和q。

e如何选择d值?

对不平稳数据进行逐阶的差分,再判断数据的平稳性,平稳性判断推荐使用ADF检验。

如刚开始的数据不平稳,对它进行一阶差分,差分好之后进行ADF检验。若平稳则停止差分,然后采用ARMA模型;若不平稳则进行二阶差分,再进行ADF检验,以此类推。

f实例参考:

AR模型(ar_model.AR)

# -*- coding: utf-8 -*-
'''
    自回归模型。预测澳大利亚墨尔本市最低日常温度
'''

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AR
from sklearn.metrics import mean_squared_error

path = r'csv/daily-minimum-temperatures-in-me.csv'  # csv路径


def getData(path):  # 获得训练数据和测试数据
    series = pd.read_csv(path, header=0)
    X = series.values
    train, test = X[:len(X) - 7], X[len(X) - 7:]  # 最后一周为测试数据,其余的为训练数据
    return train, test


def getModel(X):  # 模型训练
    try:
        model = AR(endog=X)
        return model.fit()
    except ValueError:
        print('参数错误')
        return None

def prediction(model_fit, train, test):  # 预测
    return model_fit.predict(start=len(train), end=len(train) + len(test) - 1, dynamic=False)  # 要输入预测开始和结束的位置


if __name__ == '__main__':
    train, test = getData(path)
    model_fit = getModel(train[:, 1])
    print('常数项+模型参数:{}'.format(model_fit.params))

    predict = prediction(model_fit, train, test)
    for i in range(len(predict)):
        print('预测值:{},期望值:{}'.format(predict[i], test[:, 1][i]))

    MSE = mean_squared_error(test[:, 1], predict)  # 输出均方误差
    plt.plot(test[:, 1], color='blue', label='expect')
    plt.plot(predict, color='red', label='predict')
    plt.legend()
    plt.show()

运行结果如下

SARIMA模型 python SARIMA模型是线性模型_python_08

数据在信息已删除

ARMA模型

'''
    自回归滑动平均模型
'''
from statsmodels.tsa.arima_model import ARMA
from itertools import product


def myARMA(data):
    p = range(0, 9)
    q = range(0, 9)
    parameters = list(product(p, q))  # 生成(p,q)从(0,0)到(9,9)的枚举
    best_aic = float('inf')
    result = None
    for param in parameters:
        try:
            model = ARMA(endog=data, order=(param[0], param[1])).fit()
        except ValueError:
            print("参数错误:", param)
            continue
        aic = model.aic
        if aic < best_aic:  # 选取最优的aic
            best_aic = model.aic
            result = (model, param)
    return result