最后更新于
最后更新于
我们在对时间序列进行建模的时候, 如果没有时间序列没有季节性, 直接适应ARIMA模型, 基本就能处理大部分情况了.
加入某个时间序列有季节性, 这里的季节其实指的就是周期重复的性质. 在Python
使用seasonal_decompose
并指定freq
(这里的意思就是周期包含的时间间隔), 就能对原来的时间序列进行分解, 得到趋势, 季节性和残差. 我们可以使用去掉了趋势和季节性的残差继续处理和建模, 虽然不再用考虑季节性等, 但如何将拟合后预测得到的数值, 还原回原来有意义的时间序列, 是很棘手的.
对季节进行建模的方式如同ARIMA类似, 只不过这里的时间间隔变成了freq
, 对应的AR变为了SAR, MA变为了SMA, 差分变为了季节差分(即当前点与freq
个lag
之前的值相减, 这是对于一阶季节差分来说), 最终ARIMA模型变为了SARIMA模型, 参数有7个:
(p, d, q): 标准的ARIMA模型中的参数
(P, D, Q, Freq): 季节模型的参数, 意义与上面相同. 最后的Freq代表周期的长度(时间间隔的数量)
关于SARIMA模型参数的确认, 因为参杂了太多的因素, 直接使用ACF图和PACF图, 主观的选择已经不是那么行得通了, 经常使用网格搜索, 根据模型拟合的评价方法, 如AIC, BIC或者RMSE等, 选取最优的模型. 这种形式非常类似于使用sklearn
中的GridSearch
方法调参.
尽管如此, 整个SARIMA模型的参数选择和注意事项还是有以下的总结:
如何确定差分阶数和常数项:
假如时间序列在很高的lag
10以上有正的ACF, 则需要很高阶的差分
假如lag-1
的ACF是0或负数或者非常小, 则不需要很高的差分, 假如lag-1
的ACF是-0.5或更小, 序列可能overdifferenced. 要十分警惕overdifferenced的情况.
最优的差分阶数一般在最优阶数下标准差最小(但并不是总数如此)
模型不查分意味着原先序列是平稳的, 一阶差分平稳意味着原先序列有个固定的平均趋势, 二阶差分平稳意味着原先序列有个随时间变化的趋势
模型没有差分一般都有常数项, 有两阶差分一般没常数项, 假如一阶差分模型有非零的平均趋势, 则有常数项
如何确定AR和MA的阶数:
假如PACF显示截尾或者lag-1的ACF是正的(此时序列仍然有点underdifferenced),则需要考虑AR项;PACF的截尾项表明AR的阶数
假如ACF显示截尾或者lag-1的ACF是负的(此时序列有点overdifferenced),则需要加MA项,ACF的截尾项表明AR的阶数
AR和MA可以相互抵消对方的影响,所以假如用AR-MA模型去拟合数据,仍然需要考虑加些AR或MA项。尤其在原先模型需要超过10次的迭代去converge。BEWARE OF USING MULTIPLE AR TERMS AND MULTIPLE MA TERMS IN THE SAME MODEL.
假如在AR部分有个单位根(AR系数和大约为1),此时应该减少一项AR增加一次差分
假如在MA部分有个单位根(MA系数和大约为1),此时应该减少一项AR减少一次差分
假如长期预测出现不稳定,则可能AR、MA系数有单位根
如何确定季节性部分:
假如序列有显著是季节性模式,则需要用季节性差分,但是不要使用两次季节性差分或总过超过两次差分(季节性和非季节性)
假如差分序列在滞后s处有正的ACF,s是季节的长度,则需要加入SAR项;假如差分序列在滞后s处有负的ACF,则需要加入SMA项,如果使用了季节性差异,则后一种情况很可能发生,如果数据具有稳定和合乎逻辑的季节性模式。如果没有使用季节性差异,前者很可能会发生,只有当季节性模式不稳定时才适用。应该尽量避免在同一模型中使用多于一个或两个季节性参数(SAR + SMA
),因为这可能导致过度拟合数据和/或估算中的问题。