ARIMA模型
文章目录
- ARIMA模型
- 1、自回归模型(AR)
- 使用自身的数据进行预测,且只适用于预测与自身前期相关的现象。
- 2、移动平均模型(MA):
- 自回归模型中的误差项累加,能有效消除预测中的随机波动
- 3、自回归移动平均模型(ARMA)
- 4、ARIMA模型
- 总结一下
- 5、代码实现
- 1、导包
- 2、数据预处理
- 3、做一阶差分
- 4、使用模型
- 5、预测值
1、自回归模型(AR)
使用自身的数据进行预测,且只适用于预测与自身前期相关的现象。
注意:需满足具有平稳性的要求,需满足自相关性,自相关系数需大于0.5。
p阶自回归公式:
y
t
=
μ
+
∑
i
=
1
p
γ
i
y
t
−
i
+
e
t
y_{t}=μ+\sum_{i=1}^p\gamma_{i}y_{t-i}+e_{t}
yt=μ+i=1∑pγiyt−i+et
其中yt为当前值,p为阶数(时间间隔,比如按天统计1号与2号为1阶,1号与3号为2阶),
γ
i
\gamma_{i}
γi为自相关系数,et为误差项,i表示当前值与前多少个历史值有关。
2、移动平均模型(MA):
自回归模型中的误差项累加,能有效消除预测中的随机波动
q阶自回归公式:
y
t
=
μ
+
∑
i
=
1
q
θ
i
e
t
−
i
+
e
t
y_{t}=μ+\sum_{i=1}^q\theta_{i}e_{t-i}+e_{t}
yt=μ+i=1∑qθiet−i+et
3、自回归移动平均模型(ARMA)
将二者结合就可以得到ARMA,其中p,q需要自己指定。指定p、q需根据ACF、PACF以及BIC和AIC准则确定最优解(后续介绍)。
y
t
=
μ
+
∑
i
=
1
p
γ
i
y
t
−
i
+
e
t
+
∑
i
=
1
q
θ
i
e
t
−
i
y_{t}=μ+\sum_{i=1}^p\gamma_{i}y_{t-i}+e_{t}+\sum_{i=1}^q\theta_{i}e_{t-i}
yt=μ+i=1∑pγiyt−i+et+i=1∑qθiet−i
需求解的项为
γ
i
和
θ
i
\gamma_{i}和\theta_{i}
γi和θi
4、ARIMA模型
ARIMA(p,d,q)全称差分自回归移动平均模型,无疑是在ARMA的基础上做了差分。
差分法详解之前写过了一篇文章
机器学习——时间序列ARIMA模型(一):差分法详解_天海一直在的博客-****博客_arima 差分
总结一下
ARIMA原理其实就是将非平稳的时间序列,转化为平稳的时间序列
然后将因变量仅对其滞后值和随机误差项的现值和滞后值进行回归(ARMA公式)所建立的模型
5、代码实现
1、导包
pandas做数据处理,matplotlib和seaborn做可视化,statsmodels中的arima来对数据进行建模
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.arima.model import ARIMA
2、数据预处理
这里我选择2000年至2021年道琼斯股市的部分指数作为训练数据集
data = pd.read_csv('data2000_2021.csv',index_col=0,parse_dates=[0])
data
纵向切割:仅选择close列,并对数据进行以月为单位的分割,
stock_month = data['close'].resample("M").mean()
stock_month
横向切割:选择2000年至2019年的数据
stock_train = stock_month['2000':'2019']
stock_train
3、做一阶差分
stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()
plt.figure()
plt.plot(stock_diff)
plt.title('first difference')
plt.show()
绘图
stock_train.plot(figsize=(12,8))
4、使用模型
其中order中的参数分别为p、d、q
model = ARIMA(stock_train, order=(1,0,8))
result = model.fit()
5、预测值
注意预测值的开始要在所给出数据的范围内,结束值不做要求
pred = result.predict(250,288,dynamic = True)
pred
绘图
plt.figure(figsize=(5,5))
plt.plot(pred)
plt.plot(stock_month)
plt.show()
最后结果: