本文通过一段时间的长江流量数据集来实战演示ARIMA模型的理论、建模及调参选择过程,其中包括数据准备、随机性、稳定性检验。本文旨在通过实践的操作过程,完成ARIMA模型的分享,相信大家也会通过此文而有所收获。
ARIMA的建模过程
1,对时间序列数据绘图,观察是否为平稳时间序列。
2,若时间序列数据是平稳时间序列,则直接进行下一步,若不是平稳时间序列,则对数据进行差分,转化为平稳时间序列数据。
3,对平稳时间学列数据绘制自相关系数ACF和偏自相关系数PACF图,通过对自相关图和偏自相关图分析,获得AM参数和AR参数。
ARIMA模型介绍
ARIMA模型是一种流行且广泛使用的时间序列预测统计方法。
ARIMA 是代表(Autoregressive Integrated Moving Average model )差分整合移动平均自回归模型,又称整合移动平均自回归模型(移动也可称作滑动),是时间序列预测分析方法之一。ARIMA(p,d,q)中,AR是“自回归”,p为自回归项数;MA为“滑动平均”,q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。
一般概念-时间序列平稳性
从统计学的角度来看,平稳性是指数据的分布在时间上平移时不发生变化。因此,非平稳数据显示了由于趋势而产生的波动,必须对其进行转换才能进行分析。例如,季节性会导致数据的波动,并可以通过“季节性差异”过程消除。
白噪声
白噪声是由一组0均值,不变方差,相互独立的元素构成,当然可以对该元素的分布进行假设(如高斯分布)。白噪声如同他的名字听起来一样是杂乱无章的,各元素之间没有任何联系。由白噪声组成的序列是随机游走,随机游走序列的自相关特点是其自相关函数几乎为1并且衰减很慢,这种特征我们称为长记忆性。
白噪声表示数据之间没有相关性,如果时间序列都是由白噪声数据构成的,那么时间序列的数据就不能是自相关的。
自回归模型AR
自回归模型描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。自回归模型必须满足平稳性的要求。
自回归模型首先需要确定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型的公式定义为:
上式中yt是当前值,u是常数项,p是阶数 ri是自相关系数,et是误差。
自回归模型有很多的限制:
1、自回归模型是用自身的数据进行预测
2、时间序列数据必须具有平稳性
3、自回归只适用于预测与自身前期相关的现象
移动平均模型MA
移动平均模型关注的是自回归模型中的误差项的累加 ,q阶自回归过程的公式定义如下:
移动平均法能有效地消除预测中的随机波动。
差分法 I
对于非平稳序列可以使用差分法使得数据更平稳,常用的方法有一阶差分和二阶差分法。一阶差分公式:
自回归移动平均模型ARMA
自回归模型AR和移动平均模型MA模型相结合,就得到了自回归移动平均模型ARMA(p,q),计算公式如下:
差分自回归移动平均模型ARIMA
将自回归模型、移动平均模型和差分法结合,我们就得到了差分自回归移动平均模型ARIMA(p,d,q),其中d是需要对数据进行差分的阶数。
ARIMA实战
ARIMA的一般步骤
1,对时间序列数据进行绘图,检验数据的平稳性,对非平稳时间序列数据,要先进行差分,直到时间序列为平稳时间序列。
2,对平稳后的数据进行白噪声检验,白噪声是指零均值常方差的随机平稳序列。
3,如果是平稳非白噪声序列就计算ACF(自相关系数)、PACF(偏自相关系数),进行ARIMA模型识别。
4,对识别好的模型,确定模型参数,进行时间序列进行预测,并对模型结果进行评价。
Python 实现ARIMA模型
1、导入必要的函数库
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler
from IPython.display import Image
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller # adf检验库
from statsmodels.stats.diagnostic import acorr_ljungbox # 随机性检验库
from statsmodels.tsa.arima_model import ARMA
%matplotlib inline
plt.rcParams['figure.figsize'] = (12,6)
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore") # specify to ignore warning messages
2、导入数据
flow_data=pd.read_csv(r".k\data\TimeSeries\monthly-flows-chang-jiang-at-hankou.csv")
flow_data.head(3)
绘制从1975年至1978年(选择时间的窗口较短,主要便于观察数据的变化)汉口所测长江流量数据。通过这些数据可以观察数据的平稳性。
flow_data[-36:].plot(y='flows',x="month", subplots=True,
figsize=(15, 8), fontsize=12)
plt.xlabel('month', fontsize=12)<