ARIMA模型由Box与Jenkins于上世纪七十年代提出,是一种著名的时间序列预测方法。ARIMA的含义是单积自回归移动平均过程,其含义为:假设一个随机过程含有d个单位根,其经过d次差分后可以变换为一个平稳的自回归移动平均过程,则该随机过程称为单积(整)自回归移动平均过程。
名称解读
AR: 自回归模型 Autoregressive model
I : 差分
MA: 滑动平均模型 Moving average model
本质
线性回归,只不过是通过自身的历史数据进行回归,适用于数据本身存在着较高并且稳定的相关性,特点是简单、短期预测效果不错。
平稳性就是要求经由样本时间序列所得到的拟合曲线,在未来的一段时间内仍能顺着现有状态“惯性”地延续下去;
平稳性要求序列的均值和方差不发生明显变化;
平稳性要求序列的均值和方差不发生明显变化;
s^2 = \frac{\sum_{i=1}^{N}(x_n-m)^2}{N}
s^2 总体方差 x变量 m 总体均值
y = w_1*x_1+w_2*x_2+w_3*x_3+...+w_i*x_i+e
y: 因变量 x:自变量
w和b根据样本学得(最小二乘法或者最大似然估计或者神经网络)之后,模型就得以确定。w直观表达了各属性在预测中的重要性
线性回归是由一个或者多个自变量推导预测因变量
自回归是由因变量之前的取值来推导预测本身,所以是自回归(受自身变化的影响)
F t + 1 = F t + a ( Y t − F t ) = F t + a ( e t ) F_{t+1} = F_{t} + a(Y_t-F_t)=F_{t}+a(e_t) Ft+1=Ft+a(Yt−Ft)=Ft+a(et)
F t + 1 下期预测值 F t 本期预测值 Y t 本期实际值 e t 本期误差值 \text{$F_{t+1}$ 下期预测值 \, $F_t$ 本期预测值 \; $Y_t$ 本期实际值 $e_t$ 本期误差值} Ft+1 下期预测值 Ft 本期预测值 Yt 本期实际值 et 本期误差值
\text{}
下期预测值 是本期预测值与以a为折扣的本期实际值与预测值误差之和
F t = F t − 1 + a ( Y t − 1 − F t − 1 ) F_t = F_{t-1} + a(Y_{t-1}-F_{t-1}) Ft=Ft−1+a(Yt−1−Ft−1)
所以 F t + 1 = F t − 1 + a ( Y t − 1 − F t − 1 ) + a ( Y t − F t ) = F t − 1 + a ( e t − 1 ) + a ( e t ) = F t − 2 + a ( e t − 2 ) + a ( e t − 1 ) + a ( e t ) \text{所以} F_{t+1} = F_{t-1} + a(Y_{t-1}-F_{t-1}) + a(Y_t-F_t) =F_{t-1}+a(e_{t-1})+a(e_{t})=F_{t-2}+a(e_{t-2})+a(e_{t-1})+a(e_{t}) 所以Ft+1=Ft−1+a(Yt−1−Ft−1)+a(Yt−Ft)=Ft−1+a(et−1)+a(et)=Ft−2+a(et−2)+a(et−1)+a(et)
一 个 初 始 预 测 值 F t − 2 , 新 的 预 测 值 等 于 这 个 初 始 值 加 上 之 前 各 期 误 差 的 一 部 分 一个初始预测值 Ft-2,新的预测值等于这个初始值加上之前各期误差的一部分 一个初始预测值Ft−2,新的预测值等于这个初始值加上之前各期误差的一部分
Y t = b 0 + b 1 e t − 1 + b 2 e t − 2 + b 3 e t − 3 + . . . + + b k e t − k + e k Y_t = b_0+b_1e_{t-1}+b_2e_{t-2}+b_3e_{t-3}+...++b_ke_{t-k}+e_k Yt=b0+b1et−1+b2et−2+b3et−3+...++bket−k+ek
ϕ 自回归系数 θ 移动平均系数 \text{ $\phi$ 自回归系数 $\theta$ 移动平均系数} ϕ 自回归系数 θ 移动平均系数
可以看到 p=0 是移动平均模型 q=0 是自回归模型
差分又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化
差分操作实例
原数据 | 一阶 | 一阶差分 | 二阶 | 二阶差分 |
---|---|---|---|---|
1 | ||||
3 | 1 | 2 | ||
5 | 3 | 2 | 1 | 4 |
7 | 5 | 2 | 3 | 4 |
对于非平稳时间序列中若存在增长或下降趋势,则需要进行差分处理然后进行平稳性检验直至平稳为止。
AR 自回归
MA 滑动平均
I 差分法
AIC 准则 赤池消息准则,衡量统计模型拟合好坏的标准,值越小越拟合
最小信息量准则(An Information Criterion) 指导思想:
似然函数值越大越好
未知参数的个数越少越好
ARMA模型要求数据平稳,当数据不平稳时,需要差分。如果d阶差分后,序列平稳,叫做d阶单整序列
如果差分很多次,还是不平稳。或者差分后已经失去研究意义了,那么就放弃ARIMA模型。
val lines = scala.io.Source.fromFile("D://work//算法//时间序列预测//arima//spark-ts-examples-master//data//R_ARIMA_DataSet1.csv").getLines()
val ts = Vectors.dense(lines.map(_.toDouble).toArray)
/**
* ARIMA
*/
val arimaModel = ARIMA.fitModel(1, 0, 1, ts)
val arimaModel1 = ARIMA.autoFit(ts)
println("coefficients: " + arimaModel.coefficients.mkString(","))
val forecast = arimaModel.forecast(ts, 10)
val forecast1 = arimaModel1.forecast(ts,10)
println("forecast of next 20 observations: " + forecast.toArray.mkString(","))
println("forecast of next 20 observations: " + forecast1.toArray.mkString(","))
http://localhost:8889/notebooks/DataStructure/%E7%AE%97%E6%B3%95/timeseries/ARMA%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%9B%9E%E5%BD%92.ipynb
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
from statsmodels.graphics.api import qqplot
import random
data = [ 5000+i*20+random.randint(200,700) if i%2==0 else 4500+i*20+random.randint(200,700) for i in range(99)]
data = pd.Series(data)
data_index = sm.tsa.datetools.dates_from_range('1901','1999')
# 绘制数据图
data.index = pd.Index(data_index)
data.plot(figsize=(12,8))
plt.show()
# 创建模型 ARMA
arma = ARMA(data,(16,0)).fit()
print('AIC: %0.4lf'%arma.aic)
# 模型预测
predict_y = arma.predict('1941','2048')
# 预测结果绘制
fig,ax = plt.subplots(figsize=(12,8))
ax = data.ix['1901':].plot(ax=ax)
predict_y.plot(ax=ax)
plt.show()