前言
时间序列(TS)是分析领域中不太为人知晓的技术。强烈建议阅读本文前先看看R语言之时间序列建模完全教程,里面讲解了相关的基本概念。我在这里直接用Python使用了其中的方法。R语言有很多处理TS的库,但是Python很少。
文章结构如下:
1.TS为何特殊?
2.用Pandas读取、处理数据;
3.如何判断TS的平稳性?
4.如何将TS变为平稳态?
5.预测TS
1.TS为何特殊?
正因为TS的这些内在特性,会有多种分析它的方式。我们这里使用流行的航空旅客数据集。
本文旨在介绍处理TS的不同方法,这里的例子只用于示范,尽可能的囊括各种方法,不会过多的追求预测准确性。
2.用Pandas读取、处理数据
3.如何判断TS的平稳性?
4.如何将TS变为平稳态?
不平稳的两个主要因素:
我们的处理思路是:对趋势和季节进行建模和估计,然后移除掉这一部分的量,剩下的就是平稳TS,就可以针对这个平稳TS运用统计预测的技术了。最后把各部分因素加起来,进行预测。
估计趋势、剔除趋势
这里都是整数,所以我们取个对数:
1.Aggregation(平均):选取一个时间周期T做平均;
2.Smoothing(平滑):采取滚动平均,考虑过去的几个观测值;(注:不知道1和2有啥区别...)
3.多项式拟合fitting:对时间的回归模型;
这里介绍smoothing,其中有两种方法:
MA
剔除MA曲线后,对剩余部分进行稳定性测试。统计值很小,p值很小,效果很好。
但是MA方法有个缺点,就是时间周期需要事先给定。但是对于复杂的情况,比如预测股票价格的时候,就很难事先给出一个数值T。因此,我们可以采用“带权重的MA”,越靠近的时刻权重越大。
(注:当预测目标的基本趋势在某一水平上上下下波动时,可用一次移动平均法建立预测模型。当预测目标的基本趋势与某一线性模型吻合时,常用二次移动平均法【做两次一次平均移动】。)
指数平滑(指数权重MA)
是其中很经典的方法,它给之前所有的观测值(或者误差值)都分配权重(注:所以才叫平滑),权数由近到远按指数规律递减。详情看这里。效果如下:
这里的参数‘halflife’用来指定指数衰减的量。底数越小,衰减的越快。其取值很大程度上取决于曲线的变化趋势,需要丰富的业务领域知识。参见一次指数平滑法。(当前的预测值=前一刻的观测值和预测值的组合,也可以看成是前一时刻预测值和前一时刻误差的组合)
(注:一次指数平滑可以转换为无穷项的MA/AR再加一个初始的预测值【前面所有的误差值/观测值的线性组合】。)
(注:一次指数平滑法的滞后效果显著,就像是把历史曲线向后平移了一点...,二次指数平滑就是按照一次指数平滑的方式再对TS做一次处理。原则上说,不管序列的基本趋势多么复杂,总可以用高次指数平滑公式建立一个逼近很好的模型【类似多项式拟合吧】,但计算量 很大,所以用的较多的是低阶指数平滑预测模型。)
(注:因为一次指数平滑是递归计算公式,所以要确定初始值。对第一个时刻的预测值一般取第一个时刻附近T个历史数据的平均值。衰减的越快,越能减小初始值设定带来的影响。)
继续,检查平稳性。效果比之前的MA要好。
同时剔除趋势和季节因素
1.差分:以特定的时间滞后(延迟)取一个新的TS,两个TS做差。
2.分解:同时对趋势和季节因素建模并剔除之。
差分
差分是同时剔除趋势和季节因素的常用方法。通过用某一时刻的观察值减去之前时刻的观察值,能够很好的提高平稳性。
以下是一阶差分:进行平稳性检查,统计量小于10%临界值。我们也可以做二阶、三阶差分,有时可能会得到更好的效果。
(注:二阶差分是指对得到的一阶差分TS再进行一次一阶差分)
二阶差分公式如下:
Δ(Δy(x))=Δ(y(x+1) - y(x))=Δy(x+1) - Δy(x)=(y(x+2) - y(x+1)) - (y(x+1) - y(x))=y(x+2) - 2y(x+1) + y(x)
分解
5.预测TS
1.严格的平稳序列,数值之间没有依赖关系。这种情况下很容易处理,我们可以将残差视为白噪声。但这种情况很少。
2.稳定序列,但序列数值间有显著的依赖关系。这种情况下,我们需要使用统计模型去预测数据,例如ARIMA模型。
下面简单介绍ARIMA方法
要想有效的应用这种方法,还是应该理解其中的技术细节。它的全名叫:自回归移动平均模型(差分自回归移动平均模型)。它是一种预测稳定TS的方法,就是一种线性方程(类似线性回归的形式)。预测器取决于模型的参数(p,d,q):1.参与自回归的项数p:每项都是一个延迟的(过去的)依赖变量(观测值)。例如,p=5表示当前的预测值是前五个时刻的观测值的线性组合。
2.参与移动平均的项数q:每一项都是过去某一时刻的预测误差(预测值和实际值的差)。例如,q=5表示当前的预测值是前五个时刻误差值的线性组合。
3.差分阶数d:TS消去季节性波动所需进行的差分次数。在本例中,我们用了一次差分后,消去了季节性因素,便没有必要用差分,所以可以在已经经过一阶差分处理的TS上忽略掉这个参数,或者将参数设为0。也可以将原TS拿来,因为还需要一次差分剔除季节性,所以将该参数设为1。两种方式的结果是一样的。(其实就是把TS变成平稳态所需进行的差分次数)
如何确定p,q的取值是该模型的重点。我们用两个图来调参。
1.自相关函数(ACF):计算某一时刻与滞后T时刻的两个变量之间的协方差(参考两个变量的相关系数)。比如,取滞后值为5时,我们要考察的是序列当前和前五个时刻之间的相关性。这就需要抽取出一系列的样本点来计算,每一个样本点都是一对值,分别来自t1,...,t2和t1-5,...,t2-5这两个序列。
2.偏自相关函数(PACF):算完相关性后,要剔除介于中间的比较。比如,取滞后值为5时,计算完5的ACF后要减去滞后值为1-4的相关效应。
1.p – PACF图第一次穿过置信区间上限时的lag值。观察可知,这里为 p = 1.
2.q – ACF图第一次穿过置信区间上限时的lag值。观察可知,这里为 q = 1.
AR
MA
ARIMA(ARMA)
转换回原尺度
因为组合模型的效果最好,我们将其转换为原尺度,然后看看拟合效果如何。首先把残差的预测结果保存成一个序列数据结构,然后查看一下值的情况。
发现预测从1949-2-1开始,没有1949-1-1的数据。这是因为做差分的时候往前挪了一位,所以序列里没有1949-1-1的数据。 将预测的差分序列转化成取log后的带有季节、趋势的序列的方法是:以一个数为起始基准,连续的将这些差值加起来。一个序列的数值全为基数,一个序列的数值为每个时刻之前的累计和(即差分曲线在每一时刻的面积)。
累计和的计算。
接着,e起来,然后和实际的序列比较。
最终我们在原规模上进行了预测。效果不太好,但是你应该能想到改进的办法~接下来怎么提升就看你的了。