做这个ARIMA模型的基本要求 就是数据必须具有平稳性。
ARIMA(p,d,q)模型全称为差分自回归移动平均模型
(Autoregressive Integrated Moving Average Model,简记ARIMA)
AR是自回归, p为自回归项; MA为移动平均
q为移动平均项数,d为时间序列成为平稳时所做的差分次数
原理:将非平稳时间序列转化为平稳时间序列然后将因变量
仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型
1.概念:
-
平稳性:
平稳性就是要求经由样本时间序列所得到的拟合曲线,在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去。平稳性要求序列的均值和方差不发生明显变化
-
严平稳与弱平稳:(有点不太明白,待完善以例子为主)
生活中,几乎没有什么严平稳,太绝对了,
- 严平稳:严平稳表示的分布不随时间的改变而改变。如:白噪声(正态),无论怎么取,都是期望为0,方差为1
- 弱平稳:期望与相关系数(依赖性)不变,未来某时刻的t的值Xt就要依赖于它的过去信息,所以需要依赖性
平稳性检验:
ADF检验和KPSS检验
下面网址讲的挺好,但是我看不懂
https://blog.csdn.net/tmb8z9vdm66wh68vx1/article/details/84207895
单位根检验(unit root test)是统计检验中普遍应用的一种检验方法。
ADF检验方法:
假设验证的时间序列是不平稳的,得到统计量p值越大则越不平稳,p越小,越平稳,假设以0.05为分界线,p值大于0.05则称该序列不平稳,相反小于0.05则该序列平稳
代码:keras书上说第二数字是p值,其他,不清楚,待学习,这里很明显,超了,因此不平稳
from statsmodels.tsa.stattools import adfuller
adf = adfuller(dataframe)
print(adf)
打印结果:
(-2.658040152409359, 0.08158481465520334, 0, 46,
{'1%': -3.5812576580093696, '5%': -2.9267849124681518, '10%': -2.6015409829867675},
693.5612897053766)
kpss检验,还是看p值,与ADF相反p越大越平稳,假设也是0.05为分界线,,第二个数字0.0466457是p值
from statsmodels.tsa.stattools import kpss
kpss_test = kpss(dataframe)
print(kpss_test )
打印结果:
(0.4778954886679973, 0.046645160209910524, 10,
{'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
-
差分法:
如果拿到的数据波动很大,也就是说方差很大,怎么办?==》目的:减小浮动,使用差分法
注意:
使用差分法后使用一次数据减少一个,比如有2个数据时间序列的,进行一次差分后不久变成一个了吗,编程df会如何变化,看下面:编程了nan
-
自回归模型(AR)
描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。
回归:给一些数据点进行拟合,然后求出模型的系数就好了,
-
P阶自回归定义:
解释:假设有一个时间序列,1,2,3,4,5,6,7 p=1 代表几个时间间隔点,也就是退后一个时间点的数据。
γ:是相关系数,也就是我们需要求出来的参数。最大似然法、最小二乘法、和回归求解差不多
问题:P是我们自己指定的,那么指定是几比较好呢?后面讲
-
自回归模型的限制
-
自回归模型是用自身的数据来进行预测
-
必须具有平稳性
-
必须具有自相关性,如果自相关系数(φi)小于0.5,则不宜采用
-
自回归只适用于预测与自身前期相关的现象
-
移动平均模型(MA)
移动平均模型关注的是自回归模型中的误差项的累加
q阶自回归过程的公式定义:
移动平均法能有效地消除预测中的随机波动
-
自回归移动平均模型(ARMA)ARIMA 中的I就是差分的意思
自回归与移动平均的结合(前面两个的定义加在一起,p和q需要我们指定)
公式定义:、
敲代码:使用现有的库,需要指定三个参数p、q、D 。qp不用说了,D就是几阶差分。一般情况做1阶差分就够了。
2、如何选择p、q值合适?
先求出来ACF和PACF值,然后看图观察p和q
自相关系数:自相关函数ACF(autocorrelation function)(一个变量来描述这个统计量,所以叫‘自’)
定义:有序的随机变量序列与其自身相比较 自相关函数反映了同一序列在不同时序的取值之间的相关性
说是一个变量,但是其实不是一个变量也是多个变量。例如:是一个时间序列,那么
不也是时间序列吗,这就是自己产生多个变量
上图的解释:Lag横轴就是公式中的k值,代表滞后的阶数,先算算k=0,带入公式就是自己和自己的相关性,那不就是1吗,没问题!
注意:
ACF并不是绝对的两个变量之间的相关性,时间序列x(t)同时还会受到中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的影响
而这k-1个随机变量又都和x(t-k)具有相关关系。所以自相关系数p(k)里实际掺杂了其他变量对x(t)与x(t-k)的影响,因此引出了PACF概念。
相关系数:两个随机变量在随时间变化着,变化一致为1,变化相反为-1,0代表没关系。两个变量或者两个以上来描述这个关系。
偏自相关函数(PACF)(partial autocorrelation function):
剔除了中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的干扰之后x(t-k)对x(t)影响的相关程度。ACF还包含了其他变量的影响
而偏自相关系数PACF是严格这两个变量之间的相关性。
敲代码画上面的图(使用工具包)
下图中的阴影表示置信区间
import statsmodels.api as sm
# Display and Plotting
import matplotlib.pylab as plt
'''
绘制这个图很简单只需要一条语句:
fig = sm.graphics.tsa.plot_acf(sentiment_short, lags=20,ax=ax1)
sentiment_short是df结构的一列数据,其中索引是日期时间,lags = 20 是k=1,k=2...k=20的图像
fig = sm.graphics.tsa.plot_pacf(sentiment_short, lags=20, ax=ax2)
'''
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(sentiment_short, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout(); # 这条语句不错要加上,自动调整格局,如果没有可能出现字和字的重叠
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(sentiment_short, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout();
看图观察q和p(原则看下图),其实不一定非要用这种方法,
因为p和q可能不止一组,我们可能看到多种候选值,那么选择哪个呢?下面一个章节模型评估里面讲解。
p值看PACF,它说p阶后截尾,就是说当p等于什么数的时候首次落入置信区间,p就是多少。
q值同理,这里很明显p值取2,q值取10
使用python构建模型并且训练
ts_train是series类型,索引是日期的格式,用法和sklearn一样,order
#Model Estimation
# Fit the model
arima200 = sm.tsa.SARIMAX(ts_train, order=(2,0,0)) #order(p,d,q)
model_results = arima200.fit()
模型评估:
模型选择AIC与BIC: 选择更简单的模型
解读:这两个指标,越小越好,难么,k越小越好,L越大越好!
当k越大的时候,则参数越多,越不好,这个似然函数不懂了