购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
来一次随机游走

在第2章中,我们比较了不同的简单预测方法,并理解到它们通常作为更复杂模型的基准。然而,在某些情况下,最简单的方法会产生最好的预测。这就是我们面对随机游走过程时的情况。

在本章中,你将学习什么是随机游走过程、如何识别它,以及如何使用随机游走模型进行预测。与此同时,我们还将研究差分、平稳性和白噪声的概念,随着我们开发更高级的统计学习模型,这些概念将在后面的章节中出现。

在本章的示例中,假设你要购买Alphabet Inc.(GOOGL)的股票。理想情况下,如果股票的收盘价预计在未来上涨,你就会想要购买;否则,你的投资将无法盈利。因此,你决定收集GOOGL一年内的每日收盘价数据,并使用时间序列预测来确定股票的未来收盘价。GOOGL从2020年4月27日到2021年4月27日的收盘价如图3.1所示。截至撰写本书时,2021年4月27日以后的数据尚未获得。

在图3.1中,你可以清楚地看到一个长期趋势,自2020年4月27日和2021年4月27日之间收盘价格上涨以来。然而,这一趋势也发生了突然的变化,在此期间,它急剧下降,然后突然再次上升。

事实证明,GOOGL的每日收盘价可以使用随机游走模型建模。为此,我们将首先确定过程是不是平稳的。如果它是一个非平稳的过程,我们将不得不应用转换(如差分)以使其平稳。然后,我们将能够使用自相关函数图得出结论,GOOGL的每日收盘价可以用随机游走模型来近似。本章将介绍差分和自相关图。最后,我们将以GOOGL未来收盘价的预测方法来结束本章。

在本章结束时,你将掌握平稳性、差分和自相关的概念,这些概念将在后面的章节中进一步开发我们的预测技能。现在,让我们专注于定义随机游走过程。

图3.1 GOOGL从2020年4月27日至2021年4月27日的日收盘价

3.1 随机游走过程

随机游走是一种过程,在这个过程中,上升或下降一个随机数的机会是相等的。这通常是在金融和经济数据中观察到的,比如GOOGL的每日收盘价。随机游走通常会暴露很长一段时间,在这段时间里可以观察到正或负趋势。它们也经常伴随着方向的突变而改变。

在随机游走过程中,我们说当前值 y t 是前一时间步长 y t -1 的值、常数C和随机数 ϵ t (也称为白噪声)的函数。这里, ϵ t 是标准正态分布的实现,其方差为1,均值为0。

因此,我们可以用式3.1来数学表示随机游走,其中 y t 是当前时间 t 的值,C是常数, y t -1 是前一时间步 t -1的值, ϵ t 是随机数。

注意,如果常数C不为零,我们将该过程称为带漂移的随机游走。

模拟随机游走过程

为了帮助你理解随机游走过程,让我们用Python模拟一个——这是你可以理解随机游走的方式,我们可以在纯粹的理论场景中学习它。然后,我们将把知识转化为现实生活中的例子,在那里我们将建模并预测GOOGL的收盘价。

根据式3.1,我们知道随机游走取决于其先前的值 y t -1 加上白噪声 ϵ t 和某个常数C。为了简化模拟,让我们假设常数C为0。这样,我们模拟的随机游走可以表示为式3.2:

现在我们必须选择模拟序列的第一个值。同样,为了简化,我们将序列初始化为0。这将是 y 0 的值。

我们现在可以开始使用式3.2构建序列。我们将从时间 t =0时的初始值0开始。然后,根据式3.2, t =1时的值(由 y 1 表示)将等于先前的值 y 0 加上白噪声,如式3.3所示。

则在 t =2处的值,表示为 y 2 ,将等于在前一步骤处的值,即 y 1 加上一些白噪声,如式3.4所示。

则在 t =3处的值,表示为 y 3 ,将等于在前一步骤处的值,即 y 2 加上一些白噪声,如式3.5所示。

看看式3.5,你应该开始看到一个模式。通过将随机游走过程初始化为0并将常数C设置为0,我们确定在时间 t 的值仅是从 t =1到时间 t 的白噪声的总和。因此,我们模拟的随机游走将遵循式3.6,其中 y t 是随机游走过程在时间 t 的值,而 ϵ t 是在时间 t 的随机数。

式3.6规定,在时间 t 的任何一点,我们模拟的时间序列的值将是一系列随机数的累积总和。我们可以在图3.2中看到我们模拟的随机游走是如何形成的。

图3.2 可视化了我们模拟的随机游走的构造。如你所见,我们的初始值是0。然后,由于常数也被设置为0,我们在任何时间点的随机游走的值只是随机数或白噪声的累积和

现在,我们准备使用Python模拟随机过程。为了使这个练习可以重复,我们需要设置一个种子,这是一个传递给random.seed方法的整数。这样,无论我们运行多少次代码,都会生成相同的随机数。这可确保你获得与本章所述相同的结果和绘图。

任何时候都可以在这里参考本章的源代码:https://github.com/marcopeix/TimeSeries ForecastingInPython/tree/master/CH03。

然后我们必须决定我们模拟过程的长度。对于此练习,我们将生成1000个样本。numpy库允许我们使用standard_normal方法生成服从正态分布的数字。这确保了(根据白噪声的定义)这些数字来自一个均值为0,方差为1的分布(一个正态分布)。然后,我们可以将序列的第一个值设置为0。最后,cumsum方法将计算我们序列中每个时间步长的白噪声的累积总和,我们将模拟随机游走:

我们可以绘制出我们模拟的随机游走,看看它是什么样子。由于 x 轴和 y 轴没有实际意义,我们将简单地将它们分别标记为“Timesteps”和“Value”。下面的代码块生成图3.3:

图3.3 随机游走一个模拟。请注意,我们在前400个时间步长内有积极趋势,随后是消极趋势,在最后急剧增长。这些都很好地暗示了我们有一个随机游走的过程

你可以在图3.3中看到随机游走的定义特征。你会注意到在最初的400个时间步长中有一个积极的趋势,然后是一个消极的趋势,最后是一个急剧的增长。因此,我们既有突然的变化,也有长期观察到的趋势。

我们知道这是一个随机游走,因为我们模拟了它。然而,在处理现实生活中的数据时,我们需要找到一种方法来识别时间序列是不是随机游走。让我们看看如何实现这一目标。

3.2 识别随机游走

为了确定时间序列是否可以近似为随机游走,我们必须首先定义随机游走。在时间序列的上下文中,随机游走被定义为一阶差分平稳且不相关的序列。

随机游走

随机游走是指一阶差分平稳且不相关的序列。这意味着该过程完全随机移动。

我在刚才一句话中介绍了许多新概念,为了认识随机游走,因此我们拆分步骤到一个流程中。这些步骤如图3.4所示。

图3.4 确定时间序列数据是否可以近似为随机游走的步骤。第一步自然是收集数据。然后我们测试平稳性。如果它不是平稳的,则我们应用变换直到满足平稳性。然后我们可以绘制自相关函数。如果没有自相关,我们就有一个随机游走

接下来我们将详细介绍平稳性和自相关的概念。

3.2.1 平稳性

平稳时间序列是指其统计特性不随时间变化的时间序列。换句话说,它具有恒定的均值、方差和自相关,并且这些固有关系与时间无关。

许多预测模型假设平稳性。移动平均模型(第4章)、自回归模型(第5章)和自回归移动平均模型(第6章)都假定是平稳的。这些模型只有在我们验证数据确实是平稳的情况下才能使用。否则,模型将是无效的,预测将是不可靠的。直观上,这是有意义的,因为如果数据是非平稳的,那么它的属性将随着时间而改变,这意味着模型参数也必须随着时间而改变。这意味着我们不可能将未来值的函数推导为过去值的函数,因为系数在每个时间点都会发生变化,这使得预测不可靠。

我们可以把平稳性看作一种假设,它可以让我们更轻松地预测。当然,我们很少会看到原始状态的平稳时间序列,因为我们经常对预测具有趋势或季节性周期的过程感兴趣。这就是像ARIMA(第7章)和SARIMA(第8章)这样的模型发挥作用的时候。

平稳性

平稳过程是指其统计特性不随时间变化的过程。

如果一个时间序列的均值、方差和自相关不随时间变化,则称该时间序列是平稳的。

目前,由于我们仍处于时间序列预测的早期阶段,我们将重点关注平稳时间序列,这意味着我们需要找到方法来转换时间序列,使其平稳。转换只是对数据的一种数学操作,它可以稳定数据的均值和方差,从而使数据平稳。

我们可以应用的最简单的转换是差分。这种转换有助于稳定均值,进而消除或减少趋势和季节性效应。差分涉及计算从一个时间步长到另一个时间步长的一系列变化。为了实现这一点,我们只需从当前 y t 中的值中减去前一时间步长 y t -1 的值,即可获得差值 y' t ,如式3.7所示。

时间序列预测中的变换

变换是应用于时间序列以使其平稳的数学运算。

差分是一种变换,它计算从一个时间步长到另一个时间步长的变化。这种转换对稳定均值很有用。

将对数函数应用于序列可以使其方差稳定。

图3.5展示了差分的过程。请注意,取差分会使我们丢失一个数据点,因为在初始时间点,我们无法取其与前一步的差,因为 t =-1不存在。

可以对一个时间序列进行多次差分。取一次差分就是应用一阶差分。取二次差分将是二阶差分。通常不需要两次以上的差分来获得平稳序列。

当使用差分来获得随时间变化的常数均值时,我们还必须确保我们有一个常数方差,以使过程保持平稳。对数用于帮助稳定方差。

请记住,当我们对已转换的时间序列进行建模时,我们必须对其进行非转换,以便将模型的结果返回到原始度量单位。撤销变换的正式术语是逆变换。因此,如果你对数据应用对数变换,请务必将预测值提高到10的幂次方,以便将值恢复到原始大小。这样,你的预测将在其原始环境中有意义。

现在我们知道了我们需要在时间序列上应用什么类型的转换才能使其平稳,我们需要找到一种方法来检验序列是否平稳。

图3.5 可视化的差分转换。在这里,应用了一阶差分。请注意,在此转换之后丢失一个数据点,因为初始时间点不能与以前的值不同,因为它们不存在

3.2.2 平稳性检验

一旦将变换应用于时间序列,我们就需要检验平稳性,以确定是否需要应用另一个变换来使时间序列平稳,或者是否需要对其进行变换。常见的检验是增强Dickey-Fuller(ADF)检验。

ADF检验验证了以下零假设:时间序列中存在单位根。另一种假设是没有单位根,因此时间序列是平稳的。这个检验的结果是ADF统计量,它是一个负数。它越负,对零假设的拒绝就越强。在Python的实现中,也会返回 p 值。如果它的值小于0.05,我们也可以拒绝零假设,并说序列是平稳的。

增强Dickey-Fuller检验

增强Dickey-Fuller检验通过检验单位根的存在来帮助我们确定时间序列是否平稳。如果存在单位根,则时间序列不是平稳的。

零假设表明存在单位根,这意味着时间序列不是平稳的。

让我们考虑一个非常简单的时间序列,其中当前值 y t 仅取决于其过去值 y t -1 ,受系数 α 1 、常数C和白噪声 ϵ t 的影响。我们可以写出式3.8:

在式3.8中, ϵ t 表示一些我们无法预测的误差,C是一个常数。在这里, α 1 是时间序列的根。只有当根位于单位圆内时,这个时间序列才会是平稳的。因此,它的值必须介于-1和1之间。否则,该序列是非平稳的。

让我们通过模拟两个不同的序列来验证这一点。一个是平稳的,另一个有单位根,这意味着它不是平稳的。平稳过程遵循式3.9,非平稳过程遵循式3.10。

在式3.9中,序列的根是0.5。因为它在-1和1之间,所以这个序列是平稳的。另外,在式3.10中,序列的根是1,这意味着它是一个单位根。因此,我们期望这个序列是非平稳的。

通过观察图3.6中的两个序列,我们可以获得一些关于平稳序列和非平稳序列如何随时间演化的直觉。我们可以看到,非平稳过程具有长期的正趋势和负趋势。然而,从长期来看,平稳过程似乎不会增加或减少。这种高层次的定性分析可以帮助我们直观地判断一个序列是否平稳。

图3.6 模拟了超过400个时间步长的平稳和非平稳时间序列。你可以看到,平稳序列在长期内不会增加或减少。然而,非平稳过程具有长期的正趋势和负趋势

平稳序列在时间上具有不变的性质,这意味着均值和方差不是时间的函数,所以让我们绘制每个序列在时间上的均值。这个平稳过程的均值在时间上应该是平坦的,而非平稳过程的均值应该是变化的。

如图3.7所示,在最初的几个时间步长之后,平稳过程的均值变为常数。这是平稳过程的预期行为。根据平稳过程的定义,平均值不随时间变化这一事实意味着它与时间无关。然而,非平稳过程的均值显然是时间的函数,因为我们可以看到它随着时间的推移而减少和增加。因此,单位根的存在使得序列的均值依赖于时间,所以序列不是平稳的。

让我们通过绘制每个序列随时间变化的方差来进一步证明单位根是非平稳性的标志。同样,平稳序列在时间上具有恒定的方差,这意味着它与时间无关。另外,非平稳过程将具有随时间变化的方差。

在图3.8中,我们可以看到,在最初的几个时间步长之后,平稳过程的方差在时间上是恒定的,这遵循式3.9。同样,这对应于平稳过程的定义,因为方差不依赖于时间。另外,具有单位根的过程具有依赖于时间的方差,因为它在400个时间步长上变化很大。因此,这个序列不是平稳的。

图3.7 平稳过程和非平稳过程随时间变化的均值。你可以看到平稳过程的均值在前几个时间步长之后是如何变得常数的。另一方面,非平稳过程的均值是时间的函数,因为它是不断变化的

图3.8 模拟的平稳和非平稳序列随时间的方差变化。平稳过程的方差与时间无关,因为它在前几个时间步长之后是恒定的。对于非平稳过程,方差随时间变化,这意味着它不是独立的

到目前为止,你应该相信一个有单位根的序列不是平稳的序列。在图3.7和图3.8中,平均值和方差都依赖于时间,因为它们的数值一直在变。同时,根为0.5的序列显示出恒定的均值和方差,表明该序列确实是平稳的。

所有这些步骤都是为了证明使用ADF检验的合理性。我们知道,ADF检验验证了序列中单位根的存在。零假设,即单位根存在,意味着序列不是平稳的。如果检验返回的 p 值小于某个显著性水平(通常为0.05或0.01),则我们可以拒绝零假设,这意味着没有单位根,因此序列是平稳的。

一旦我们有了一个平稳序列,我们必须确定是否存在自相关。记住,随机游走是一个序列,它的一阶差分是平稳的,并且不相关。ADF检验负责平稳性部分,但我们需要使用自相关函数以确定序列是否相关。

3.2.3 自相关函数

一旦过程是平稳的,绘制自相关函数(ACF)是一种很好的方法,以理解你正在分析的流程类型。在这种情况下,我们将使用它来确定是不是我们正在研究的随机游走。

我们知道,相关性衡量的是两个变量之间的线性关系的程度。因此,自相关测量时间序列的滞后值之间的线性关系。因此,ACF揭示了任何两个值之间的相关性如何随着滞后的增加而变化。这里,滞后仅仅是分离两个值的时间步长数。

自相关函数

自相关函数测量时间序列的滞后值之间的线性关系。

换句话说,它测量时间序列与其自身的相关性。

例如,我们可以计算 y t y t -1 之间的自相关系数。在这种情况下,滞后等于1,并且系数将被表示为 r 1 。类似地,我们可以计算 y t y t -2 之间的自相关,滞后将为2,并且系数将被表示为 r 2 。当我们绘制ACF时,系数是因变量,而滞后是自变量。请注意滞后0的自相关系数将始终等于1。这在本质上是有意义的,因为在同一时间步长,变量与其自身之间的线性关系应该是完美的,所以等于1。

在存在趋势的情况下,ACF的曲线将显示系数对于短滞后是高的,并且它们将随着滞后的增加而线性地减小。如果数据是季节性的,则ACF图也将显示循环模式。因此,绘制非平稳过程的ACF提供的信息不会比通过观察过程随时间的演变所能获得的信息更多。然而,绘制平稳过程的ACF可以帮助我们识别随机游走的存在。

3.2.4 把它们组合在一起

现在你明白了什么是平稳性,如何转换一个时间序列来使它平稳,什么统计检验可以用来评估平稳性,以及如何绘制ACF可以帮助你识别随机游走的存在。我们可以把所有这些概念组合在一起,并在Python中应用它们。在本节中,我们将使用模拟数据(来自3.1节),涵盖必要步骤来识别一个随机游走。

第一步是确定随机游走是不是平稳的。我们要知道,既然在序列中有可见的趋势,它就不是平稳的。尽管如此,我们应用ADF检验以确定这一点。我们将使用statsmodels库,它是一个Python库,实现了许多统计模型和检验。为了运行ADF检验,我们只需将模拟数据的数组传递给它。结果是不同值的列表,但我们主要对前两个感兴趣:ADF统计量和 p 值。

输出的ADF统计量为-0.97, p 值为0.77。ADF统计量不是一个很大的负数,并且当 p 值大于0.05时,我们不能拒绝零假设,说明时间序列不是平稳的。我们可以通过绘制ACF图来进一步支持结论。

statsmodels库具有快速绘制ACF图的功能。同样,我们可以简单地将数组数据传递给它。我们可以选择指定滞后的数量,这将决定 x 轴上的范围。在这种情况下,我们将绘制前20个滞后,但你也可以随意绘制尽可能多的滞后。

输出结果如图3.9所示。

图3.9 我们模拟的随机游走的ACF图。请注意自相关系数是如何缓慢地减小的,即使在滞后20时,这个值仍然是自相关的,这意味着随机游走目前并不是平稳的

在图3.9中,你会注意到自相关系数是如何随着滞后的增加而缓慢下降的,这清楚地表明我们的随机游走不是一个平稳过程。请注意,阴影区域表示置信区间。如果一个点在阴影区域内,那么它与0没有显著差异。否则,自相关系数是显著的。

由于随机游走不是平稳的,因此我们需要应用一个转换来从ACF图中检索有用信息,从而使其平稳。因为序列主要显示趋势的变化,没有季节性模式,我们将应用一阶差分。请记住,我们每次差分都会丢失第一个数据点。

为了计算差分,我们将使用numpy的diff方法。这将与给定的数据数组不同。参数n控制数组必须差分的次数。要应用一阶差分,参数n必须设置为1:

我们可以在图3.10中看到差分模拟随机游走。

图3.10 不同随机游走的演变,似乎我们成功地消除了这个趋势,并且方差是稳定的

如图3.10所示,我们已经从序列中删除了趋势。而且方差看起来相当稳定。让我们使用ADF检验再次检验平稳性:

这将输出ADF统计数据-31.79, p 值为0。这次的ADF统计数据为较大的负数,且 p 值小于0.05。因此,我们拒绝零假设,我们可以说这个过程没有单位根,因此是平稳的。

我们现在可以绘制新的平稳序列的ACF:

观察图3.11,你会注意到在滞后0之后没有显著的自相关系数。这意味着平稳过程是完全随机的,因此可以被描述为白噪声。每个值只是距离前一个值的随机一步,它们之间没有关系。

图3.11 差分随机游走的ACF图。请注意,在滞后0之后没有显著的系数。这是一个明确的指标,表明我们正在处理一个随机游走

我们已经证明,模拟数据确实是一个随机游走:序列是平稳的,并且在一阶差分后不相关,这符合随机游走的定义。

3.2.5 GOOGL是随机游走吗

我们已经在模拟数据上应用了必要的步骤来识别随机游走,所以现在是在真实数据集上检验知识和新技能的大好时机。以GOOGL从2020年4月27日至2021年4月27日的收盘价为例,来源finance.Yahoo.com,让我们来确定这个过程是否可以近似为随机游走。

你可以使用pandas中的read_csv方法将数据加载到DataFrame中:

如你所愿,GOOGL的收盘价确实是一个随机游走过程。让我们看看是如何得出这个结论的。出于可视化的目的,让我们快速绘制数据,结果如图3.12所示:

图3.12 GOOGL从2020年4月27日至2021年4月27日的收盘价

根据图3.12,我们可以在数据中看到一种趋势,即收盘价随着时间的推移而增加。因此,我们没有一个固定的过程。ADF检验进一步支持了这一点:

这将返回一个ADF统计量为0.16和一个大于0.05的 p 值,所以我们知道数据不是平稳的。因此,我们将对数据进行差分,看看是否使它平稳:

接下来,我们可以对不同的数据运行ADF检验:

这给出了ADF统计量为-5.3和小于0.05的 p 值,意味着我们有一个平稳过程。

现在我们可以绘制ACF,看看是否存在自相关:

图3.13可能会让你摸不着头脑,你可能想知道是否存在自相关性。我们没有看到任何显著系数,除了滞后5和18。这种情况有时会出现,这只是偶然的。在这种情况下,我们可以安全地假设在滞后5和18处的系数不显著,因为我们没有连续的显著系数。我们只是偶然发现差分与滞后5和18的值略有相关性。

图3.13 我们可以看到,在ACF图中没有显著的系数。你可能会注意到,在滞后5和18时,系数很显著,而其他系数则不是。这在一些数据中是偶然发生的,这些点可以被认为是不显著的,因为我们在滞后0和5或滞后0和18之间没有连续的显著系数

因此,我们可以得出结论,GOOGL的收盘价可以近似为随机游走过程。取一阶差分使序列平稳,而且其ACF图显示没有自相关,这意味着它是完全随机的。

3.3 预测随机游走

既然我们知道了什么是随机游走以及如何识别随机游走,那我们就可以开始预测了。这听起来可能令人惊讶,因为我们已经确定随着时间的推移,随机游走会采取随机的步骤。

预测随机变化是不可能的,除非我们自己预测一个随机值,这是不理想的。在这种情况下,我们只能使用简单的预测方法,或者我们在第2章中介绍的基线。由于数值随机变化,因此无法应用统计学习模型。相反,我们只能合理地预测历史均值,或最后一个值。

根据使用场景的不同,预测范围也会有所不同。理想情况下,在处理随机游走时,你将只能预测下一个时间步长。然而,你可能需要预测未来的多个时间步长。让我们来看看如何处理这些情况。

3.3.1 长期预测

在本节中,我们将预测长期的随机游走。这不是一个理想案例——随机游走可能会意外增加或减少,因为过去的观察结果无法预测未来的变化。在这里,我们将继续使用我们在3.1节中模拟的随机游走。

为了简化操作,我们将把随机游走分配给一个DataFrame,并将数据集拆分为训练集和测试集。训练集将包含前800个时间步长,对应于80%的模拟数据。因此,测试集将包含最后200个值:

图3.14展示了我们的拆分。现在,我们使用训练集预测测试集中接下来的200个时间步长。

图3.14 我们生成的随机游走的训练/测试分割。前800个时间步长是训练集的一部分,其余的值是测试集的一部分。我们的目标是预测阴影区域中的值

如前所述,我们只能对这种情况使用简单的预测方法,因为我们正在处理随机游走。在这种情况下,我们将使用历史均值(最后一个已知数值)和漂移法。

预测均值相当简单。我们将简单地计算出训练集的均值,并说接下来的200个时间步长将等于该值。在这里,我们将创建一个新的列pred_mean,它将保存历史均值作为预测:

你将获得-3.68的历史均值。这意味着我们将预测我们模拟的随机游走的接下来的200个时间步长的值为-3.68。

另一种可能的基线是预测训练集的最后已知值。在这里,我们将简单地提取训练集的最后一个值,并将其值指定为我们对接下来的200个时间步长的预测:

这种方法得到的预测值的恒定值为-6.81。

最后,我们将应用漂移法,我们还没有介绍。漂移法是对预测最后已知值的修改。在这种情况下,我们允许这些值随着时间的推移而增加或减少。未来的值的变化速率等于在训练集中看到的速率。因此,它相当于计算训练集的第一个值和最后一个值之间的斜率,并简单地将这条直线外推到未来。

记住,我们可以通过用 y 轴的变化除以 x 轴的变化来计算一条直线的斜率。在我们的例子中, y 轴的变化是随机游走 y f 的最后一个值与其初始值 y i 之间的差分。然后, x 轴的变化相当于时间步长数减1,如式3.11。

当我们实现最后一个已知数值基线时,我们计算了训练集的最后一个值,并且我们知道我们模拟的随机游走的初始值是0。因此,我们可以将这些数字代入式3.11,并计算式3.12中的漂移。

现在让我们在Python中实现它。我们将计算 x 轴和 y 轴的变化,并简单地将它们相除以获得漂移:

正如预期的那样,这给我们带来了-0.0085的漂移,这意味着我们的预测值将随着时间的推移而缓慢下降。漂移法简单地说明了预测线性依赖于时间步长、漂移值和随机游走的初始值,如式3.13所示。请记住随机游走从0开始,所以我们可以从式3.13中删除它。

由于我们想要预测训练集之后的200个时间步长,因此我们将首先创建一个数组,其中包含从800开始到1000结束的时间步长范围,步长为1,然后,我们只需将每个时间步长乘以漂移,即可得到预测值,最后,我们将它们分配到test的pred_drift列:

有了这三种方法,根据测试集的实际值,我们现在可以直观地可视化预测是什么样子:

如图3.15所示,我们的预测是错误的。它们都未能预测测试集中观察到的突然增加,这是有道理的,因为随机游走的未来变化是完全随机的,因此不可被预测。

我们可以通过计算我们预测的均方误差来进一步证明。我们不能像第2章使用MAPE那样,因为随机游走可以取值为0——不可能计算出与观测值0之间的百分比差异,因为这意味着除以0,这在数学中是不允许的。

因此,我们选择MSE,因为它可以衡量模型拟合的质量,即使观测值为0。sklearn库有mean_squared_error函数,只需要观测值和预测值,然后它将返回MSE。

你将获得历史均值、最后值和漂移法的MSE值分别为327、425和466。我们可以在图3.16中比较这三个基线的MSE。

图3.15 使用均值、最后值和漂移方法预测我们的随机游走。正如你所看到的,所有的预测都相当差,并且不能预测在测试集中观察到的突然增长

图3.16 我们的预测的MSE。显然,随机游走的未来是不可预测的,其MSE超过300

如图3.16所示,最佳预测是通过预测历史均值获得的,但MSE超过300。这是一个极高的值,考虑到我们模拟的随机游走不超过30。

到目前为止,你应该相信,预测长期范围内的随机游走是没有意义的。由于未来值取决于过去值加上一个随机数,因此随着许多时间步长中许多随机数被添加,随机性部分在长期范围内被放大。

3.3.2 预测下一个时间步长

预测随机游走的下一个时间步长是我们可以解决的唯一合理的情况,尽管我们仍会使用简单的预测方法。具体来说,我们会预测最后一个已知值。然而,我们将只为下一个时间步长做这个预测。这样,预测应该只偏离一个随机数,因为随机游走的未来值总是过去值加上白噪声。

实现这个方法很简单:我们取初始观测值并用它来预测下一个时间步长。一旦我们记录了一个新值,它将被用作以下时间步长的预测。这一过程将在未来重复进行。

图3.17说明了这一过程。这里,使用上午8:00的观测值,预测上午9:00的值;使用上午9:00观测的实际值,预测上午10:00的值,依此类推。

图3.17 预测一个随机游走的以下时间步长。在这里,在某个时间点的观测值将被用作对下一个时间点的预测值

让我们把这个方法应用到随机游走过程中。为了说明这种方法,我们将把它应用于整个随机游走。当我们实际上只是预测每个时间步长的最后一个已知值时,这种简单的预测可能看起来很惊人。

模拟这个过程的一个好方法是平移数据,pandas库有一个shift方法,它完全符合我们的要求。我们只需传入周期数,在我们的例子中为1,因为我们正在预测下一个时间步长:

你将注意到,在步骤1中,值为0,这对应于模拟随机游走中步骤0的观测值。因此,我们有效地使用当前观测值作为下一个时间步长的预测。绘制预测收益率图3.18。

观察图3.18,你可能会认为我们已经开发了一个惊人的模型,它几乎完美地拟合我们的数据。似乎我们在图中没有两条独立的线,因为它们两者几乎完全重叠,这是一个完美拟合的标志。现在,我们可以计算出MSE:

这产生了0.93的值,这可能会再次让我们认为我们有一个性能非常好的模型,因为MSE非常接近0。但是,我们知道我们只是在预测在前一个时间步长观测到的值。如图3.19所示,如果我们放大图表,这将变得更加明显。

图3.18 对一个随机游走的下一个时间步长的简单预测。这幅图给人一个非常好的模型的错觉,而我们实际上只是预测在前一个时间步长观测到的值

图3.19 我们随机游走的最后100个时间步长的特写。在这里,我们可以看到预测是原始时间序列的一个简单平移

因此,如果必须对随机游走过程进行预测,则最好进行多次预测短期预测。这样,我们就不会允许许多随机数随着时间的推移而累积,这将降低我们长期预测的质量。

因为随机过程会随机走向未来,我们无法使用统计或深度学习技术来适应这样的过程:从随机性中没有什么可以学习,也无法预测。相反,我们必须依靠简单的预测方法。

3.4 下一步

到目前为止,你已经学习了如何开发基线模型,并且你已经发现,在存在随机游走的情况下,你只能合理地应用基线模型来进行预测。对于未来采取随机步骤的数据,你无法拟合统计模型或使用深度学习技术。最终,你无法预测随机移动。

你学习到随机游走是一种序列,其一阶差分不具有自相关性且是一个平稳过程,这意味着其均值、方差和自相关随时间不变。识别随机游走所需的步骤如图3.20所示。

但是,如果你的处理过程是平稳的且具有自相关性,这意味着你在ACF图中看到连续的显著系数,怎么办?现在,图3.20只是简单地说明它不是随机游走,因此你必须找到另一个模型来近似该过程并对其进行预测。在这种情况下,你面对的是一个可以通过移动平均(MA)模型、自回归(AR)模型或两者的组合来近似处理的过程,从而形成自回归移动平均(ARMA)模型。

图3.20 识别随机游走的步骤

在第4章中,我们将只关注移动平均模型。你将学习如何识别此类过程,以及如何使用移动平均模型进行预测。

3.5 练习

现在是应用你在本章学到的不同技能的好时机。以下三个练习将测试你对随机游走以及预测随机游走的了解和掌握程度。这些练习是按难度和完成它们所需的时间排序的。3.5.1节和3.5.2节的答案在GitHub上:https:// github.com/marcopeix/TimeSeriesForecastingInPython/tree/master/CH03。

3.5.1 模拟和预测随机游走

模拟一个与我们在本章中使用的不同的随机游走。你可以简单地更改种子并获得新值:

1.生成500个时间步长的随机游走。你可以随意选择不同于0的初始值。此外,请确保通过将不同的整数传递给np.random.seed()来更改种子。

2.绘制你模拟的随机游走。

3.检验平稳性。

4.应用一阶差分。

5.检验平稳性。

6.将模拟的随机游走分成一个包含前400个时间步长的训练集,剩下的100个时间步长将是你的测试集。

7.应用不同的简单预测方法并测量MSE。哪种方法产生的MSE最小?

8.绘制你的预测图。

9.在测试集上预测下一个时间步长并测量MSE,降低了吗?

10.绘制你的预测图。

3.5.2 预测GOOGL的每日收盘价

使用我们在本章使用的GOOGL数据集,应用我们讨论的预测技术并衡量其性能:

1.保留最近5天的数据作为测试集。剩下的就是训练集了。

2.使用简单预测方法预测最后5天的收盘价,并测量MSE。哪种方法最好?

3.绘制你的预测图。

4.在测试集上预测下一个时间步长并测量MSE,降低了吗?

5.绘制你的预测图。

3.5.3 预测你选择的股票的每日收盘价

许多股票的历史每日收盘价可在finance.yahoo.com上免费获得。选择你喜欢的股票代码,并下载其一年的历史每日收盘价:

1.绘制你所选股票的每日收盘价。

2.确定是否为随机游走。

3.如果不是随机游走,请解释原因。

4.保留最后5天的数据作为测试集,剩下的就是训练集了。

5.使用简单预测方法预测最后5天的收盘价,并测量MSE。哪种方法最好?

6.绘制你的预测图。

7.在测试集上预测下一个时间步长并测量MSE,降低了吗?

8.绘制你的预测图。

小结

❍随机游走是一种过程,其中一阶差分是平稳的并且不是自相关的。

❍我们不能在随机游走中使用统计或深度学习技术,因为它在未来是随机移动的。因此,我们必须使用简单的预测。

❍平稳时间序列是指其统计特性(均值、方差、自相关)不随时间变化的时间序列。

❍增强Dickey-Fuller检验用于通过检验单位根来评估平稳性。

❍ADF检验的零假设是序列中存在单位根。如果ADF统计量是较大的负值,并且 p 值小于0.05,则零假设被拒绝,并且序列是平稳的。

❍变换用于使序列平稳。差分可以稳定趋势和季节性,而对数可以稳定方差。

❍自相关测量变量与其自身在前一时间步长(滞后)之间的相关性。自相关函数显示了自相关如何作为滞后的函数而变化。

❍理想情况下,我们将预测短期或下一个时间步长的随机游走。这样,我们就不允许随机数字累积,这将降低我们长期预测的质量。 E7VG9cZex9qbJ5vW9b7KsVi5wW8wpkdxcCXSRGCRqrY6kzWe7l6Fh4skQP3sdW9v

点击中间区域
呼出菜单
上一章
目录
下一章
×