对ARIMA模型的深入研究——从白噪声到SARIMAX等等

预测未来一直是一个普遍的挑战,从现在或下周种植庄稼、与某人结婚或保持单身、出售或持有股票、上大学或全职演奏音乐等决定。我们永远无法完美预测未来 ,但我们可以使用预测统计领域的工具来更好地了解未来。

预测涉及时间序列数据,或随着时间的推移重复测量。在每小时温度、每日电力消耗或年度全球人口估计等数据中,我们可以寻找将成百上千的数字分解为几个定义特征的模式。我们可以使用时间序列分析来量化值向上或向下趋势的速率,测量一个值与前几个值的相关程度,将我们的数据分解为其潜在的重复周期等等。

过去五年标准普尔 500 指数的每日价格,这是一个经过高度研究的时间序列的例子。

要总结时间序列并预测其未来,我们需要对时间序列中的值彼此之间的关系进行建模。今天是否与昨天、一周前或去年相似?时间序列之外的因素(例如噪声或其他时间序列)在多大程度上起作用?

为了回答这些问题,我们将从一个基本的预测模型开始,然后迭代到一个完整的自回归移动平均 (ARMA) 模型。然后,我们将更进一步,包括集成的、季节性的和外生的组件,扩展为 SARIMAX 模型。

换句话说,我们将以此为基础构建:

对此:

它看起来很复杂,但这些部分中的每一个——自回归(蓝色)、移动平均(紫色)、外生(绿色)和季节性(黄色)分量——只是加在一起。我们可以通过添加或删除项以及在原始数据和差异(红色)数据之间切换来轻松调整模型的复杂性,以创建 ARMA、SARIMA、ARX 等模型。

一旦我们建立了一个模型,我们就能够预测如下所示的时间序列的未来。但也许更重要的是,我们还将了解产生时间序列的潜在模式。


目录

入门

AR:自回归

MA:移动平均线

把它放在一起

附加组件

Python 中的时间序列


入门

<自相关>

在开始构建任何模型之前,我们需要讨论一个对描述时间序列至关重要的主题:自相关。自相关意味着“自相关”:它是时间序列值与早期值或滞后的相似性。例如,如果我们的时间序列是值 [5, 10, 15],那么我们的滞后 1 自相关将是 [10, 15] 与 [5, 10] 的相关性。

我们可以使用自相关图可视化当前值与 n 滞后前的先前值的相关性。这些图是通过计算每个值 (y_t) 与前一时间步 (y_{t-1})、两步前 (y_{t-2})、三步 (y_{t-3 }), 等等。 y 轴显示滞后 n 处的相关强度,我们将阴影误差区间之外的任何值视为显着相关。

滞后零处的相关性始终为 1:y_t 最好与 y_t 完全相关,否则会出现问题。对于剩余的滞后,存在三种典型模式:1) 缺乏自相关,2) 逐渐衰减,以及 3) 急剧下降。 (尽管在现实世界的数据中,您可能会混合使用 #2 和 #3。)

下面我们将标普 500 指数每日收盘价(左)与芝加哥植物园每日最高温度(右)的自相关可视化。标准普尔 500 指数的价格是如此相关,以至于您必须回顾三个月以上的过去才能找到不相关的值。芝加哥的温度在大约两个月后变得更快,但随后从另一侧射出并与 4-7 个月前的温度呈负相关。

<偏自相关>

自相关图很有用,但滞后之间可能存在大量相关“溢出”。例如,在标准普尔 500 指数价格中,滞后 1 的相关性是惊人的 0.994 – 很难很好地了解以下滞后,第一个滞后间接影响所有下游相关性。

这是偏自相关可以成为有用度量的地方。部分自相关是相关性y_t 和 y_{t-n} 的变化,控制早期滞后的自相关。

假设我们想要在没有滞后 1 溢出的情况下测量滞后 2 自相关。我们不是直接测量 y_t 和 y_{t-2} 的相关性,而是拟合 y_t ~ β?+β?y_{t-1} 的线性回归,y_{t-2} ~ β?+β?y_{t} 的回归-1},然后找到这两个回归的残差之间的相关性。

残差量化了 y_t 和 y_{t-2} 中无法由 y_{t-1} 解释的变化量,使我们能够公正地看待 y_t 和 y_{t-2} 之间的关系。然后我们可以重复这个过程,测量延迟到 n 的回归残差之间的相关性,以找到延迟 n 的偏自相关。我们将测量滞后 3 处的偏自相关,例如,通过将 y_t ~ β?+β?y_{t-1}+β?y_{t-2} 的残差与 y_{t-3} ~ β?+ 的残差进行回归β?y_{t-1}+β?y_{t-2}。

以下是偏自相关图如何寻找标准普尔 500 指数价格和芝加哥气温。请注意,滞后 1 自相关如何仍然非常显着,但随后的滞后却一落千丈。

自相关图和偏自相关图可用于确定简单的 AR 或 MA 模型(与完整的 ARIMA 模型相反)是否足以描述您的数据 ,但您可能不会以这种方式使用它们。自首次引入自相关图以来的 50 年里,您的笔记本电脑可能已经变得足够强大,可以执行强力扫描以找到最能描述您的数据的 ARIMA(甚至 SARIMAX)模型的参数,即使有数千个观测值.那么,这些图作为可视化数据时间依赖性的补充方式可能更有用。

<平稳性>

与任何统计模型一样,在预测时间序列数据时必须满足一些假设最大的假设是时间序列是平稳的。换句话说,我们假设描述时间序列的参数不随时间变化。无论您查看时间序列的哪个位置,您都应该看到相同的均值、方差和自相关。

这并不意味着我们只能预测看起来像上面绿色混乱的时间序列。虽然大多数真实世界的时间序列都不是平稳的,但我们可以将时间序列转换为平稳的,对平稳数据生成预测,然后对预测进行反变换以获得真实世界的值。一些常见的转换包括差分(然后可能再次差分)、取数据的对数或平方根,或取百分比变化。

转换是必要的,因为线性模型要求它们建模的数据是独立的,并且很可能来自父总体。时间序列数据的情况并非如此——任何自相关都立即违反了独立性假设。但是独立随机变量的许多便利——例如大数定律和中心极限定理——也适用于平稳时间序列。因此,使时间序列平稳是能够对我们的数据进行建模的关键步骤。


AR:自回归

有了一些基础知识,让我们开始构建我们的 ARIMA 模型。我们将从 AR 或自回归组件开始,然后添加移动平均线和积分部分。

AR(0):白噪声

我们可以构建的最简单的模型是一个没有项的模型。只有一个常数和一个误差项

这种时间序列称为白噪声。 ?_t 是从均值为 0 且方差为 σ2 的正态分布中抽取的随机值。 每个值都是独立绘制的,这意味着 ?_t 与 ?_{t-1}、?_{t+1} 或任何其他 ?_{t±n} 没有相关性。数学上写,我们会说:

因为所有的 ?_t 值都是独立的,所以模型 y_t = ?_t 所描述的时间序列只是一个无法预测的随机数序列。您对下一个值的最佳猜测是 c,因为 ?_t 的预期值为零。

以下是从标准偏差增加的正态分布中提取的三个白噪声时间序列。 c 为零,因此从等式中省略。

我们无法预测的时间序列随机值实际上是一个有用的工具。对于我们的分析来说,这是一个重要的零假设 – 数据中是否存在足够强大的模式以将序列与白噪声区分开来?我们的眼睛喜欢寻找模式——即使实际上不存在模式——所以白噪声比较可以防止误 。

白噪声对于确定我们的模型是否捕获了它可以从我们的时间序列中获得的所有信号也很有用。如果我们预测的残差不是白噪声,我们的模型就会忽略一种模式,它可以用来生成更准确的预测。

AR(1):随机游走和振荡

让我们开始向我们的项目中添加自回归项模型。这些项将是我们时间序列的滞后值,乘以能够最好地将这些先前值转换为我们当前值的系数。

在 AR(1) 模型中,我们通过取常数 c,添加由乘数 α? 调整的前一个时间步 y_{t-1},然后添加白噪声 ?_t 来预测当前时间步长 y_t。

α? 的值在我们的时间序列中起着决定性的作用。如果 α?=1,我们得到一个随机游走。与白噪声不同,我们的时间序列可以自由地偏离其原点。随机游走对于许多应用中的随机过程来说是非常有用的模型,例如模拟粒子在流体中的运动、觅食动物的搜索路径或股票价格的变化。

所以当 α? = 0 时,我们得到白噪声,当 α? = 1 时,我们得到一个随机游走。当 0 <“>

在拟合 AR 模型时,统计包通常在执行最大似然估计时将 α 参数空间限制为 -1 ≤ α ≤1。除非您对指数增长或急剧振荡进行建模,否则这些模型描述的时间序列可能不是您想要的。

最后,我们对 c 的解释随着 AR(1) 模型而变化。在 AR(0) 模型中,c 对应于我们的时间序列的中心位置。但是由于 AR(1) 模型考虑了 y_{t-1},c 现在代表我们的时间序列向上(如果 c >”>

AR(p):高阶项

我们的模型添加更多滞后只是添加 α_n*y_{t?n} 项的问题。这是 AR(2) 模型的样子,附加项以蓝色突出显示。

这表示当前时间步长 y_t 的值由常数 c 加上前一时间步长 y_{t-1} 乘以某个数字 α? 的值,再加上两个时间步长前的值 y_{t-2乘以另一个数 α?,再加上一个白噪声值 ?_t。为了拟合这种类型的模型,我们现在估计 α? 和 α? 的值。

随着我们向模型添加更多滞后,或者我们开始包含移动平均、外生或季节性项,将我们的自回归项重写为总和将变得有用。 (统计学家也使用后移表示法,但我们将坚持求和以避免学习曲线。)这是 AR(p) 模型的一般形式,其中 p 是滞后数。

上面的等式简单地说:“我们的当前值 y_t 等于我们的常数 c,加上每个滞后 y_{t-n} 乘以其系数 α_n,再加上 ?_t。”无论 p 是 1 还是 100,我们都可以使用相同的等式……但如果您的模型有 100 个滞后,您可能需要考虑包括我们将描述的下一项:移动平均线。


MA:移动平均线

ARIMA 模型的第二个主要组件是移动平均组件。这个分量不是滚动平均值,而是白噪声的滞后。

?_t 项,以前我们添加到我们的预测中的一些容易忘记的噪声,现在占据了中心位置。在 MA(1) 模型中,我们对 y_t 的预测是我们的常数加上之前的白噪声项 ?_{t?1} 和乘数 θ?,再加上当前的白噪声项 ?_t。

和以前一样,我们可以用这个总和简明地描述一个 MA(q) 模型:

下面是三个 MA(1) 时间序列,它们的值 θ? 不同,θ? 是 ?_{t?1} 上的乘数。如果您在看到这些时没有经历“ah-ha”的时刻,请不要感到难过;它们看起来应该与白噪声非常相似。

移动平均过程比自回归直观得多——什么时间序列不记得它过去的行为,但记得它以前的随机噪声?然而,数量惊人的现实世界时间序列是移动平均过程,从商店商品和销售的错位、因自然灾害而购买的电池,以及汽车音响上的高音旋钮等低通滤波器。

这是 YouTuber ritvikmath 的一个愚蠢但有用的错位示例。想象一个经常性的聚会,您被分配为每位客人提供一个纸杯蛋糕。 y_t 是正确的纸杯蛋糕数量。您预计大约有 10 个人,因此您首先带来 10 个纸杯蛋糕 (c=10)。当您到达时,您会注意到您供应过剩或供应不足 (?_t) 的纸杯蛋糕数量。

在接下来的会议中,您带来 10 个纸杯蛋糕,根据与上次会议的差异(现在为 ?_{t?1})乘以某个因子 (θ?) 进行调整。您想带来上次关闭的纸杯蛋糕数量的负数,因此您设置 θ?=?1。例如,如果你上次少了两个 (?_{t?1}=?2),那么你会多带两个。

出现的客人数量本质上是随机的,但客人记住了数量上次会议上的纸杯蛋糕——如果太多,就会有更多的客人出现,如果太少,那么来的客人就会减少。

因此,我们可以在每次会议上模拟正确数量的纸杯蛋糕,如下所示。蓝色项是您参加会议的纸杯蛋糕数量,橙色项是我们带来的数量与出席人数之间的差值。

这里要注意的是,这个时间序列并不关心它自己的历史(纸杯蛋糕的正确数量);它只受外部随机噪音的影响,这些噪音会在短时间内记住(纸杯蛋糕数量和参加聚会的人数之间的差异)。因此,这是一个移动平均过程。


把它放在一起

涵盖了 AR 和 MA 流程后,我们拥有了构建 ARMA 和 ARIMA 模型所需的一切。正如您将看到的,这些更复杂的模型只是由加在一起的 AR 和 MA 组件组成。

ARMA:自回归移动平均线

虽然许多时间序列可以归结为纯自回归或纯移动平均过程,但您通常需要结合 AR 和 MA 组件来成功描述您的数据。这些 ARMA 过程可以使用以下等式建模:

ARMA 方程简单地表明,当前时间步长的值是一个常数加上自回归滞后及其乘数之和,加上移动平均滞后及其乘数之和,再加上一些白噪声。这个方程是广泛应用的基础,从建模风速、预测财务回 ,甚至过滤图像。

下面是四个 ARMA(1,1) 时间序列。与上面的 MA(1) 图一样,很难查看下面的任何时间序列并直观地了解参数值,甚至很难判断它们是 ARMA 过程,而不仅仅是 AR 或 MA。我们正处于时间序列变得过于复杂的地步,无法通过观察原始数据来直觉模型的类型或其参数。

ARIMA:自回归综合移动平均线

我们已经找到了这篇博文的同名:ARIMA 模型。尽管进行了构建,但我们实际上会看到 ARIMA 模型只是一个 ARMA 模型,预处理步骤由模型而不是用户处理。

让我们从 ARIMA(1,1,0) 模型的方程开始。 (1,1,0) 意味着我们有一个自回归滞后,我们对数据进行了一次差分,并且我们没有移动平均项。

请注意我们如何从建模 y_t 到建模 y_t 和 y_{t-1} 之间的变化。因此,我们的自回归项,以前是 α?(y_{t-1}),现在是 α?(y_{t-1} -y_{t-2})。

换句话说,ARIMA 模型只是差分时间序列上的 ARMA 模型。而已!如果我们用 d_t 替换 y_t,代表我们的差分数据,那么我们只需再次获得 ARMA 方程。

我们可以自己执行差分,但是如果 d 大于 1,它会变得很麻烦,并且大多数统计包会在幕后为我们处理差分。例如,这里有一个 Python 演示,它展示了原始数据上的 ARIMA(1,1,1) 模型和差分数据上的 ARMA(1,1) 模型中的模型系数是如何相等的。

上面,我们首先使用 arma_generate_sample 函数来模拟具有指定 α 和 θ 参数的 ARMA 过程的数据。然后我们使用 ARIMA 函数在原始数据上拟合 ARIMA 模型,在差分数据上拟合 ARMA 数据。最后,我们比较了两个模型的估计参数并表明它们是相等的。

这是原始数据上的 ARIMA(1,2,1) 模型与两次差分数据上的 ARMA(1,1) 模型的相同概念证明。


附加组件

有了 AR、MA 和 I 组件,我们就可以分析和预测各种时间序列。但是还有两个额外的组成部分可以真正将我们的预测提升到一个新的水平:季节性和外生变量。在查看一些代码然后结束这篇文章之前,让我们简要介绍一下这些内容。

S:季节性

顾名思义,季节性是指数据中具有固定频率的重复模式:每天、每两周、每四个月等重复的模式。电影院门票销售往往与上周的销售相关,因为例如,虽然房屋销售和温度往往与上一年的值相关。

季节性违反了 ARIMA 模型的平稳性假设,因此我们需要对其进行控制。我们可以通过使用季节性 ARIMA 模型或 SARIMA 来实现。这些模型具有广泛的应用,从预测巴西的登革热病例到估计模仿台湾机械工业的产量或希腊的发电量。

下面是 SARMA 模型的一般方程,季节性成分以橙色突出显示。 (对于 SARIMA,用差分数据 d_t 替换 y_t。)

请注意季节性和非季节性成分看起来非常相似。这是因为季节性模型在滞后上拟合了一组额外的自回归和移动平均分量,滞后抵消了一些滞后 s,即我们的季节性频率。

例如,对于每周季节性很强的每日电子商务利润模型,我们将设置 s = 7。这意味着我们将使用一周前的值来帮助告知明天的预期。这个过程可以用如下的 SARMA(0,0)(1,0)? 模型建模。

但是对于现实世界的时间序列,即使是高度季节性的数据也可能仍然使用一两个非季节性成分进行更好的建模:季节性成分可能捕捉长期模式,而非季节性成分调整我们对短期变化的预测。我们可以修改模型以包含非季节性自回归项,例如,将其转换为 SARMA(1,0)(1,0)? 模型。

SARIMA 模型还允许我们通过季节性频率以及任何非季节性差异来区分我们的数据。一个常见的季节性 ARIMA 模型是 SARIMA(0,1,1)(0,1,1),我们在下面展示了 s = 7。滞后位于等式的右侧,使其更容易阅读。

X:外生变量

到目前为止,我们描述的所有组件都是我们时间序列本身的特性。我们的最后一个组成部分,外生变量,通过考虑外部数据对我们的时间序列的影响来逆转这一趋势

这听起来不应该太吓人 – 外生变量只是任何非时间序列模型中的特征。例如,在预测学生考试成绩的模型中,标准线性回归将使用学习小时数和睡眠小时数等特征。同时,ARIMAX 模型还将包括内生特征,例如学生之前的 n 次考试成绩。

ARIMAX 模型中外生变量的其他一些示例包括石油价格对美国汇率的影响、室外温度对电力需求的影响以及对伤残保险索赔的经济指标。

这是我们完整的 SARIMAX 方程的样子。外生术语以绿色突出显示。

请注意,外生因素的影响已经间接包含在我们的时间序列历史中。例如,即使我们在美国汇率模型中不包括石油价格的术语,石油的影响也会反映在汇率的自回归或移动平均分量中。任何现实世界的时间序列都是数十或数百个外生影响的结果,那么为什么要为外生术语操心呢?

虽然外部影响在我们模型中的内生项中间接表示,但直接衡量这些影响仍然有效得多。例如,我们的预测将对外部因素的变化做出更快的反应,而不是等待它反映在滞后中。


Python中的时间序列

到目前为止,我们已经介绍了时间序列模型的自回归、移动平均、积分、季节性和外生组件背后的理论和数学。只需稍加努力,我们就可以填写 SARIMAX 模型的方程并手动生成预测。但是我们如何找到模型的参数值呢?

为此,我们将使用 Python 的 statsmodels 库。我们将首先拟合一个我们提前知道我们的模型顺序应该是什么的模型,例如一个自回归滞后和两个移动平均滞后。在下一节中,我们将展示如何使用 pmdarima 库来扫描潜在的模型订单并找到最适合您的数据的匹配项。

拟合模型

假设我们是某电子商务公司的数据科学家,我们想预测接下来几周的销售额。我们有去年每日销售额的 CSV,以及每天的广告支出。我们知道我们希望我们的模型有一个非季节性的 ARIMA(1,1,1) 组件,一个周期为 7 天的季节性 AR(1) 组件,以及一个广告支出的外生变量。

换句话说,我们知道我们想要一个 SARIMAX(1,1,1)(1,0,0)? 模型。下面是我们如何在 Python 中拟合这样的模型。

我们使用 SARIMAX 指定我们的模型,然后使用 .fit 方法(必须将其保存到单独的变量中)对其进行拟合。然后我们可以使用 summary 方法获得 scikit-learn 风格的模型摘要。 predict 方法让我们将模型样本内预测与实际值进行比较,而预测方法生成对未来 n 步的预测。

比较模型拟合

这一切都很好,但是如果我们不提前知道我们的模型顺序应该是什么怎么办?对于简单的 AR 或 MA 模型,我们可以分别查看偏自相关或自相关图。但对于更复杂的模型,我们需要进行模型比较。

我们通常使用 AIC 进行模型比较,这是衡量我们的模型与数据拟合程度的指标。 AIC 通过惩罚更复杂的模型来防止过度拟合 – 是的,随着我们添加更多项,模型准确性不可避免地会增加,但是这种改进是否足以证明添加另一个项是合理的?

为了确定最佳模型,我们对各种模型顺序执行参数扫描,然后选择具有最低 AIC 的模型。 (如果我们特别担心过度拟合,我们可以改用更严格的 BIC。)

我们不需要自己编写一堆 for 循环,而是可以依靠 pmdarima 库中的 auto_arima 函数来完成繁重的工作。我们需要做的就是传递对 AR、I 和 MA 分量的初始阶次估计,以及我们为每个分量考虑的最高阶次。对于季节性模型,我们还需要传入季节性频率,以及季节性 AR、I 和 MA 分量的估计值。

上面的代码表明,SARIMA(2,1,0)(1,0,0)? 模型最适合标准普尔 500 指数过去五年的数据……但有一些重要的警告!在你用这个模型的预测来赌你

声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

(0)
上一篇 2021年8月11日
下一篇 2021年8月11日

相关推荐