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)是用自身做回归变量的过程,即利用历史时序数据值的线性组合来预测当前时刻点的线性回归模型,它是时间序列中的一种常见形式。
MA模型(移动平均模型)
MA模型和AR模型大同小异。移动平均模型(moving average model)使用历史白噪声的线性组合来预测当前时刻点的线性回归模型。与AR最大的不同之处在于,AR模型中历史白噪声的影响是间接影响当前预测值的(通过影响历史时序值)。
ARMA模型(自回归移动平均模型)
ARMA(Auto-Regressive and Moving Average Model)模型顾名思义就是将AR模型和MA模型结合起来,即历史随机变量和历史白噪声结合起来,其模型可以看成是AR模型+MA模型。
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算法入口:
d如何选择p、q值?
- 利用自身相关函数(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()
运行结果如下
数据在信息已删除
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
h参考文献:
数据分析——时间序列分析模型(AR,MA,ARMA,ARIMA)
数据分析——时间序列分析模型(AR,MA,ARMA,ARIMA)_人的抱怨源自,自我无能的愤怒-CSDN博客_时间序列分析模型
知乎 移动平均模型 8.4 移动平均模型 - 知乎
知乎 自回归模型 自回归模型 - 知乎
自回归模型(AR Model)自回归模型(AR Model)_shigangzwy的博客-CSDN博客_自回归模型
为什么常常用AR模型代替ARMA模型
为什么常常用AR模型代替ARMA模型_deco1515的专栏-CSDN博客
时间序列预测基础教程系列(7)_如何用自回归模型(AR)预测时间序列预测(Python)
时间序列预测基础教程系列(7)_如何用自回归模型(AR)预测时间序列预测(Python)_日拱一卒-CSDN博客_python自回归模型
statsmodels AR官方文档
statsmodels ARMA官方文档
知乎 AR、MA及ARMA模型AR、MA及ARMA模型 - 知乎
如何确定ARIMA模型中参数p、d、q 如何确定ARIMA模型中参数p、d、q | 码农网
基于sarima模型的分析及预测 基于sarima模型的分析及预测 - 豆丁网
python 时间序列预测 —— SARIMA python 时间序列预测 —— SARIMA_颹蕭蕭-CSDN博客_python时间序列预测