新手入门——详解时间序列预测(用Python)

来源:互联网 发布:迷雾 电视剧 知乎 编辑:程序博客网 时间:2024/05/16 02:43

前言

时间序列(TS)是分析领域中不太为人知晓的技术。强烈建议阅读本文前先看看R语言之时间序列建模完全教程,里面讲解了相关的基本概念。我在这里直接用Python使用了其中的方法。R语言有很多处理TS的库,但是Python很少。


文章结构如下:

1.TS为何特殊?

2.用Pandas读取、处理数据;

3.如何判断TS的平稳性?

4.如何将TS变为平稳态?

5.预测TS


1.TS为何特殊?

正如其名,TS是以一个常数为时间间隔进行观测得到的数据点集。通过分析这些点来判断长期趋势,进而对未来进行预测或进行些其他形式的分析。TS不同于一般的回归问题,其特殊之处有如下两点:
1.依赖于时间,观测值之间有相关性。而线性回归的基本假设是所有观测都是独立的。
2.除了有升降趋势外,绝大多数TS还会有季节性趋势,即在特定的时间窗内有特定的变化(波动形式)。例如:冬天的羊毛夹克销量总是比较多。


正因为TS的这些内在特性,会有多种分析它的方式。我们这里使用流行的航空旅客数据集。

本文旨在介绍处理TS的不同方法,这里的例子只用于示范,尽可能的囊括各种方法,不会过多的追求预测准确性。


2.用Pandas读取、处理数据

Pandas是专门用来处理TS对象的库,尤其是datatime64[ns]类,它可存储时间信息,让我们能快速执行一些操作。
调相关库、读数据,看看数据的形式,类型。
数据包含月份和相应的旅客人数,但不是TS类型的对象。设置参数,读取csv文件,以得到TS对象。
1.parse_dates:说明哪一列是时间信息;
2.index_col:说明哪一列作为索引;
3.date_parser:说明时间信息的解析方式,即时期如何显示;
这样我们得到了时间类型(datetime[ns])的索引。取一列,得到序列(TS)对象。
接着介绍了一些序列对象的索引方式,值得注意的是:1.与列表不同,TS的两端索引是包含的;2.索引的时间必须是有序的;

3.如何判断TS的平稳性?

如果TS的统计量(诸如均值、方差)是一个常量,不随时间移动而改变,那么就说TS是平稳的。平稳性之所以重要是因为绝大多数的TS模型都是建立在平稳性假设之上的。直观上,如果一个TS在过去的时段有某种特定的模式,那么它很有可能在未来也遵循这样的模式。并且,与稳定性序列相关的理论更成熟,所以较非稳定序列而言,实施起来更容易。
稳定性的定义很严格,但实践中,只要TS满足统计量为常数,我们就认为它是稳定的,即:
1.均值为常数
2.方差为常数
3.自相关系数不随时间的移动而改变。——详见(R教程一文)。

下面进行稳定性测试。
1.先简单做个图看看。可见有上升趋势且有季节变动。移动平滑(滚动统计),移动平均、移动方差;2.DF检验:一种假设检验的手段。原假设为:时间序列(TS)是不稳定的,当统计量小于临界值时,我们可以拒绝原假设,认为TS在相应的置信度上是稳定的。——(详见R教程一文)。
要想深入了解统计理论,可以看看Brockwell和Davis的Introduction to Time Series and Forecasting。这本书有点难,但是一旦看懂,能对统计和一些概念理解的更深入。
引入DF测试函数:输入——TS,输出——三条线,统计量的值,P值(越小越好)还有三个临界值。
测试结果:均值增长,不稳定。并且统计量比临界值要大。

4.如何将TS变为平稳态?

尽管在很多TS模型的假设中,都要求稳定性,但实践中,基本不存在平稳的TS,所以统计学家提出很多将TS转换为稳定的方法。然而,绝对的稳定是不可能的,我们只能尽量让它接近平稳。
不平稳的两个主要因素:
1.趋势——随着时间,均值在发生变化;
2.季节因素——某一特定时段(eg:假期、涨工资),观测值会发生波动。
我们的处理思路是:对趋势和季节进行建模和估计,然后移除掉这一部分的量,剩下的就是平稳TS,就可以针对这个平稳TS运用统计预测的技术了。最后把各部分因素加起来,进行预测。
接下来介绍几种方法,我们旨在对方法进行介绍,不注重在当前问题上的效果。

估计趋势、剔除趋势

如果上升趋势显著,可以先transformation一下,把曲线趋势压缩,比如加个对数、平方根、立方根;
这里都是整数,所以我们取个对数:
对变化趋势的估计、建模方式一般有以下三种:
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)

分解

这种方法会对趋势和季节性因素分别建模,返回余下的TS(残差:residuals)。
检查平稳性。效果很好。只是将残差转化为最终的预测值没有那么直观(个人感觉还好啦...)。

5.预测TS

由上可知有很多使TS变平稳的方法。我们下面对经过差分得到的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的相关效应。
做出两个图。

图中,在0上下的两条虚线是置信区间,他们可用来确定p与q的值,方式如下:
1.p – PACF图第一次穿过置信区间上限时的lag值。观察可知,这里为 p = 1.
2.q – ACF图第一次穿过置信区间上限时的lag值。观察可知,这里为 q = 1.

现在我们对ARIMA模型设置三种参数,两种独自的,一种组合的,考察拟合效果。我们为模型的每一种参数都计算RSS(root-sum square平方和开根号)。 这里的RSS计算是针对残差(residuals)的,不是最终预测的RSS。

AR

(AR:当前的观测值由之前的观测值和当前的误差线性组合。【即当前的预测值由过去的观测值线性组合】)
(注:若平稳序列的PACF是截尾【自某一个数后值全都近似为0】的,ACF是拖尾【自某一个数后值逐渐趋于0但都不为0】的,则选用AR模型。)
(注:AR(1)可以转化成无穷项MA)

MA

(MA:当前的观测值由之前的误差值和当前的误差值线性组合。【即当前的预测值由过去的误差值线性组合】)
(注:若平稳序列的PACF是拖尾的,ACF是截尾的,则选用MA模型。)
(注:MA(1)可以转化成无穷项AR)

ARIMA(ARMA)

(注:若平稳序列的PACF和ACF都是拖尾的,则选用ARIMA模型。)
(注:非平稳TS平稳化处理,是一个数据变换的过程。任何数据变换都会造成不同程度的信息损失,所以基于数据变换的模型是一种近似求解方案,会不同程度的影响模型的准确度和精度。比如差分处理,每进行一次差分处理都会 损失一部分信息,如果能找到一种直接挖掘非平稳时间序列的方法,将会进一不提高模型的预测准确度。)

由图可以看出,AR和MA模型的RSS几乎一样,组合模型的效果显著要好。现在,预测还剩最后一步:把所有的成分加起来,并转换回原TS的尺度。

转换回原尺度

因为组合模型的效果最好,我们将其转换为原尺度,然后看看拟合效果如何。首先把残差的预测结果保存成一个序列数据结构,然后查看一下值的情况。
发现预测从1949-2-1开始,没有1949-1-1的数据。这是因为做差分的时候往前挪了一位,所以序列里没有1949-1-1的数据。 将预测的差分序列转化成取log后的带有季节、趋势的序列的方法是:以一个数为起始基准,连续的将这些差值加起来。一个序列的数值全为基数,一个序列的数值为每个时刻之前的累计和(即差分曲线在每一时刻的面积)。

累计和的计算。

接着,e起来,然后和实际的序列比较。

最终我们在原规模上进行了预测。效果不太好,但是你应该能想到改进的办法~接下来怎么提升就看你的了。


结语

本文给出了一些解决时间序列问题的标准方法。讲了平稳性的概念,如何将时间序列变得尽可能平稳进而预测残差。本文省去了统计的细节,建议大家看看推荐链接中的材料。如果不想复制粘贴源程序,可以直接从我的guyhub里下载。
希望本文能对你有所帮助。
原创粉丝点击