从入门谈起,ARIMA如何应用到时间序列分析中?

Table of Contents

  • 1. 基础概念

    • 1.1. 时间序列的平稳性(弱平稳)

      • 1.1.1. 定义
      • 1.1.2. 平稳性检验
      • 1.1.3. 如何让时间序列变平稳
    • 1.2. 随机游走
      • 1.2.1. 定义
      • 1.2.2. 不平稳性的证明
    • 1.3. ACF
    • 1.4. PACF
  • 2. ARIMA 模型
    • 2.1. 介绍

      • 2.1.1. AR模型
      • 2.1.2. MA模型
      • 2.1.3. 差分项
    • 2.2. ARIMA模型调参指南
      • 2.2.1. d: 差分阶数选取
      • 2.2.2. p: AR模型参数的选取
      • 2.2.3. q: MA模型参数的选取
    • 2.3. ARIMA模型的使用
      • 2.3.1. Python

本文由作者原创,未经允许禁止转载。联系marcnuth(AT)foxmail.com了解转载事宜。

1 基础概念

1.1 时间序列的平稳性(弱平稳)

1.1.1 定义

平稳性 在时间序列分析中是一个贯穿始终的概念,用不平稳的时间序列建模,可能会出现伪回归的现象。
怎么判断一个时间序列是否是平稳的?平稳性的定义如下:

  • 时间序列的均值是与t无关的常数
  • 时间数列的方差是与t无关的常数
  • 时间序列协方差仅与时间差有关

以下的图给出了一些不平稳的时间序列:

另外,需要了解的是,白噪声是平稳的时间序列。

1.1.2 平稳性检验

DF检验/单位根检验:

在DF检验中,假设时间序列模型为:
$$Y_t = rho Y_{t-1} + mu_t$$
其中 (mu_t) 为白噪声,做差分,可得:
$$Delta Y_t= (rho - 1)Y_{t-1} + mu_t = delta Y_{t-1} + mu_t, 其中 Delta Y_t = Y_t - Y_{t-1}$$

因此可以看到,若(rho = 1 或 delta = 0),则序列(Delta Y_t) 是平稳的,我们称其为一阶平整过程,记做 (I(1)) 。
相应的,无需一阶差分即为平稳的序列记做 (I(0)) 。

更一般的,我们可以在上述模型上添加一个常数项,即:
$$Delta Y_t = delta Y_{t-1} + mu_t + beta_1$$
即为一个更一般的序列模型。

DF检验本质上就是基于上一模型对参数 ρ=1 或 δ=0 的假设检验。

ADF检验:

扩展DF检验中的序列模型,再差分项上增加一个趋势项,得到的序列模型如下:
$$Delta Y_t = delta Y_{t-1} + mu_t + beta_1 + beta_2 t$$
其中, (beta_2)是常数,t 是时间也称为趋势变量。如果误差项是自相关的,则模型等同于:
$$Delta Y_t = delta Y_{t-1} + alpha_i sum_{i=1}^m Delta Y_{t-i} + beta_1 + beta_2 t$$
即为ADF检验的序列模型。

在python中可以使用statsmodels的adfuller来进行ADF检验。1
下面为一个简单的ADF检验的Python代码:

import statsmodels.api as sm
import numpy as np

print('=> test random data:')
print(sm.tsa.stattools.adfuller(np.random.randn(100)))
print('=> test sin:')
print(sm.tsa.stattools.adfuller(np.sin(range(100))))
print('=> test line:')
print(sm.tsa.stattools.adfuller(range(100)))
=> test random data:
(-9.2888038134047193, 1.1951897142974731e-15, 0, 99, {'10%': -2.5825959973472097, '1%': -3.4981980821890981, '5%': -2.8912082118604681}, 267.32615073491127)
=> test sin:
(-20050428159241372.0, 0.0, 3, 96, {'10%': -2.5830997960069446, '1%': -3.5003788874873405, '5%': -2.8921519665075235}, -6145.6382792775457)
=> test line:
(1.8671227576372333, 0.99847325083384997, 9, 90, {'10%': -2.5842101234567902, '1%': -3.5051901961591221, '5%': -2.894232085048011}, -6469.5381959604356)

1.1.3 如何让时间序列变平稳

通常情况下,现实生活中的时间序列都是不平稳的。然而很多常用的时间序列分析算法都要求时间序列具备平稳性,为了应用这些算法,我们不得不将不平稳的时间序列变得平稳。
在思考如何解决这一问题之前,我们需要知道,究竟是什么使得时间序列不平稳呢?
我们知道,在做时间序列分析的时候,任意一条时间序列数据都会被拆分成三个部分,它们分别是:

  • 白噪声
  • 趋势
  • 季节性

显然白噪声不会影响序列的平稳性。因此, 影响序列平稳性的因素是趋势和季节性

如何去除序列中的趋势

假设一个时间序列:
$$X_t = epsilon_t + trend_t$$

要使得该时间序列平稳,即把 (trend_t) 从 (X_t) 中减掉即可。 因此问题变成如何寻找得到时间序列中的趋势?
通常有如下一些办法:

  • MA:移动平均。 即认为 (trend_t = frac{sum_{i=t-k}^t X_i}{k})
  • 聚合: 可以将数据按一段时间(一个月/一年)聚合,从而得到趋势
  • 多项式拟合: 拟合一个多项式方程,认为其即为时间序列的趋势

在这些办法中,MA是最常用的一种办法。

如何去除序列中的季节性
去除季节性的办法通常有:

  • 差分: 选取一个时间差k,对原序列做k阶差分
  • 分解: 将序列的趋势和季节性都分解出来

差分是最常用的办法。 而关于分解的内容可以参考statsmodels中的季节性分解。2

1.2 随机游走

1.2.1 定义

随机游走序列的模型定义如下:
$$X_t= X_{t-1} + epsilon_t$$
其中 (epsilon_t) 表示t时刻的误差。 从上面模型可以看到,随机游走是这样一个序列,下一刻的值仅跟上一刻的取值相关。

是不是觉得这个等式相当眼熟?是的,这就是上一节中我们谈到一阶平稳过程的时候,给出的等式。所以请记住,随机游走序列的特点是:

  • 当前时刻取值仅跟上一刻相关
  • 是一阶平稳过程(I(1)),即是 不平稳 序列

为了再次巩固 平稳性 的概念,我们来证明一下随机游走序列的不平稳性。

1.2.2 不平稳性的证明

1. 均值是否随时间变化?

将随机游走序列模型展开,有:
$$X_t= X_{t-1} + epsilon_t = X_0 + sum_{i=0}^t epsilon_i$$

因此,均值为:
$$E(X_t) = E(X_0) + sum_{i=0}^t E(epsilon_i)$$

因为 (epsilon_i) 为随机误差,因此其方差为0, 所以随机游走的方差即为 (E(X_0)), 即为常数。 所以随机游走序列的均值是 不随时间变化的

2. 方差是否随时间变化?

随机游走的方差为:
$$Var(X_t) = Var(X_0) + sum_{i=0}^t Var(epsilon_i) = 0 + t * delta$$

由于 (delta) 是随机噪声的方差,为常数,因此随机游走序列的 方差是随时间变化的

3. 协方差是否随时间变化?

通过上面2项,我们已经得知随机游走不是平稳序列了。所以这里就留给你证明吧。 提醒一下:

$$Cov(X_t, X_{t-k}) = E(X_t - E(X_t)) E(X_{t-k} - E(X_{t-k}))$$

1.3 ACF

ACF(auto correlation function): 即自相关方程。

ACF的定义为:
$$ACF(k) = frac{E[(X_t - mu)(X_{t+k} - mu)]}{sigma^2} = frac{E[(X_t - mu)(X_{t+k} - mu)]}{sqrt{E(X_t - mu)^2} sqrt{E(X_{t+k} - mu)^2}}$$

ACF函数的值域为[-1, 1], 当值为0时,表示不相关,1表示正相关,-1表示负相关。另外,ACF函数是关于k=0对称的,即 ACF(k) = ACF(-k)。

假定序列X 平稳 ,我们可以定义样本自相关函数为:
$$ACF(k) = frac{sum_{t=k+1}^n (X_t - bar{X})(X_{t-k} - bar{X})}{sum_{t=1}^n (X_t - bar{X})^2}$$

根据该样本自相关函数定义得到的图形即是常用的ACF相关图。

1.4 PACF

PACF(Partial autocorrelation function): 即偏自相关函数。

引入PACF的原因是因为ACF虽然给出了K阶滞后项的相关性,但是这个相关性没有消除中间变量如(X_{t+1} ... X_{t+K-1})的影响。3

因此,PACF的定义可以看作:
$$PACF(k) = Corr(X_t - beta1 X_{t-1} - ... - beta_{k-1} Y_{t-k+1}, X_{t-k} - beta_1 X_{t-k+1} - ... - beta_{k-1} X_{t-1})$$

2 ARIMA 模型

2.1 介绍

ARIMA(Auto-Regressive Integrated Moving Averages),称为自回归积分移动平均模型,主要由三部分构成:

  • AR模型: 需要 参数p 作为模型滞后项的计数。比如,若p=3,则(X(t))将由(X(t-1), X(t-2), X(t-3)) 预测得到。
  • MA模型: 需要 参数q 作为误差滞后项的计数。比如,若q=3,则(X(t))将由(e(t-1), e(t-2), e(t-3)) 预测得到,其中(e(i))是移动平均后第i个值。
  • 差分的阶数: 需要 参数iARIMA模型需要差分的原因是因为AR模型和MA模型要求时间序列是平稳的!

2.1.1 AR模型

AR模型是自回归模型,其核心思想即当前值依赖于之前的值。其序列模型如下:
$$AR(p): X_t = sum_{i=1}^p alpha_i * X_{t-i} + epsilon_t$$

是不是觉得这个模型相当熟悉?是的,当 (alpha = 1)的时候,即为随机游走的模型。
所以在这里,值得一提的是, AR模型并不总是平稳的!

下面生成了一个(p = 1 且 alpha = 0.5) 的 AR(1) 模型:

2.1.2 MA模型

MA模型是移动平均模型,其模型和AR模型类似,不过MA强调的是,当前项可以基于过去的 误差项 求得,即:
$$MA(q): X_t = sum_{i=0}^q beta_i epsilon_{t-i} $$

值得注意的是,与AR不同, MA模型总是平稳的4

下图是 (beta=0.5) 的MA模型:

对比AR和MA的两个图,你将发现,在MA模型中,值下降的很快,也就是说,随着时间的迁移,受噪声的影响迅速减小。

2.1.3 差分项

前面提到, AR模型和MA模型应用前,都要求时间序列是平稳的。所以理所当然的,组合AR和MA之后的模型: ARMA模型也要求时间序列是平稳的,换句话说, ARMA是对平稳时间序列进行建模的办法。

然而现实中大多时间序列是不平稳的,而之前我们也提到过,将不平稳时间序列变化为平稳时间序列的最常用的办法就是差分,而集合了差分项的ARMA模型即是我们谈到的ARIMA模型。
因此, ARIMA是对不平稳时间序列进行建模的办法。

2.2 ARIMA模型调参指南

ARIMA(p, d, q) 的参数为p、q和d。其中p为AR模型的参数,q为MA模型的参数,d为差分的阶数。

2.2.1 d: 差分阶数选取

差分阶数的选取可以遵循一下规则5:

  1. 如果该序列的ACF图没有衰减并逼近0, 那么该序列需要再做差分。
  2. 如果该序列的ACF(1)是0或者负数,或所有都是比较小并且无模式,则该序列不需要进行差分。如果该序列的ACF(1)比-0.5更小,那么该序列可能过度差分了, 注意这种情况
  3. 差分的最优阶数,通常是差分后序列标准差最小的一个。
  4. d=0时,即原序列是平稳的;d=1时,即序列的趋势是均等的;d=2时,即序列的趋势是随时间变化的。
  5. d=0时,一般序列有一个常量项使得均值不为0;d=1时,序列的趋势中包含一个常数项;d=2时,序列模型中通常没有常数项。

前面这5条规则可以帮助你从 可视化的角度 来判断一个序列是否需要差分或者被过度差分了。 事实上,我们可以使用之前讲过的平稳性检验来检测序列的平稳性,以判断是否需要差分。
另外,有些情况下,可能试验了多个d的取值后仍旧不能把序列变得平稳。这种时候,可以先试一下用其他办法,比如先对时间序列取log之后再进行差分阶数的选取。

2.2.2 p: AR模型参数的选取

对于 AR(p) 模型, 理想情况下, k > p 时, PACF=0, 即 PACF在p项后截断 , 因此可根据PACF函数的截断项来确定一个初始的p值。

2.2.3 q: MA模型参数的选取

在 MA(q) 模型中,对于其序列的ACF图,可以发现,理想情况下当k>q时,ACF = 0, 即ACF在q项后截断。 因此,可根据ACF函数的截断项来确定一个初始的q值。

2.3 ARIMA模型的使用

2.3.1 Python

参见以下Jupyter Notebook:

Jupyter Notebook: ARIMA in Python

Footnotes:

1

Statsmodels: ADF Test in Python

2

Statsmodels: Seasonal Decomposing

3

《时间序列分析:R 语言》第6章 6.2 偏自相关函数和扩展的自相关函数

4

WIKI: MA model

5

Identifying the order of differencing in an ARIMA model

原文:大专栏  从入门谈起,ARIMA如何应用到时间序列分析中?

原文地址:https://www.cnblogs.com/petewell/p/11607173.html

时间: 2024-07-31 09:26:10

从入门谈起,ARIMA如何应用到时间序列分析中?的相关文章

转:[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制TreeView节点展开?

很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的CodeBehind难度大很多.首先是原来在xaml.cs的CodeBehind部分很容易控制界面逻辑,现在这部分逻辑移到ViewModel里面去了以后,就很难调用CodeBind的部分;其次是很多View和ViewModel.或者一个ViewModel多个View,他们之间如何通 很多童鞋看了我的博客以后也去实践MVVM,但却发现Silverlight实践中的MVVM很难实现,比纯粹的Co

【R实践】时间序列分析之ARIMA模型预测___R篇

时间序列分析之ARIMA模型预测__R篇 之前一直用SAS做ARIMA模型预测,今天尝试用了一下R,发现灵活度更高,结果输出也更直观.现在记录一下如何用R分析ARIMA模型. 1. 处理数据 1.1. 导入forecast包 forecast包是一个封装的ARIMA统计软件包,在默认情况下,R没有预装forecast包,因此需要先安装该包 > install.packages("forecast') 导入依赖包zoo,再导入forecast包 > library("zoo&

也谈在 .NET 平台上使用 Scala 语言(中)

说我在单位的安装 Ubuntu 9.10 操作系统 Lenovo ThinkCentre M4000t 台式机上写完"也谈在 .NET 平台上使用 Scala 语言(上)"之后不久,就下班回家了.于是,我就在家里的安装 Windows Vista 操作系统的 Dell Inspiron 1520 本本上继续工作.首先就是启动 Sun Virtualbox 打开一个 Ubuntu 9.10 操作系统.而这个 Ubuntu 9.10 操作系统中尚未安装 Scala SDK 软件包.正好,我

火云开发课堂 - 《Shader从入门到精通》系列 第八节:在Shader中实现黑白滤镜

<Shader从入门到精通>系列在线课程 第七节:在Shader中实现黑白滤镜 视频地址: http://edu.csdn.net/course/detail/1441/22672?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

[注]该系列文章以及使用到安装包/測试数据 能够在<[倾情大奉送–Spark入门实战系列] (http://blog.csdn.net/yirenboy/article/details/47291765)>获取 1 编译Hadooop 1.1 搭建好开发环境 1.1.1 安装并设置maven 1.下载maven安装包.建议安装3.0以上版本号,本次安装选择的是maven3.0.5的二进制包,下载地址例如以下 http://mirror.bit.edu.cn/apache/maven/maven

谈一谈最近学了一段时间的node.js

官方说明 1.NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”. 2.node是一个基于Chrome V8引擎进行代码解释的.轻量.可伸缩的具有事件驱动和非阻塞I/O机制的js运行环境. 3.node适合处理高并发要求的项目,适合高I/O密集型应用. 所以:不适合CPU密集型应用: CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起.不过,可以分解大型运

火云开发课堂 - 《Shader从入门到精通》系列 第三节:在Shader中使用顶点色

<Shader从入门到精通>系列在线课程 第三节:在Shader中使用顶点色 视频地址:http://edu.csdn.net/course/detail/1441/22667?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

火云开发课堂 - 《Shader从入门到精通》系列 第二节:在Shader中通过参数设置颜色

<Shader从入门到精通>系列在线课程 第二节:在Shader中通过参数设置颜色 视频地址:http://edu.csdn.net/course/detail/1441/22666?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

时间序列分析之 ARIMA 模型的JAVA实现

最近要用ARIMA模型预测用户的数量变化,所以调研了一下ARIMA模型,最后用JAVA实现了ARIMA算法. 一.ARIMA原理 ARIMA的原理主要参考的是ARIMA原理. 二.JAVA实现 弄懂了原理,用JAVA进行了实现,主要参考的步骤是ARIMA实现步骤,JAVA代码如下 (1)AR类,用于构建AR模型 package arima; import java.util.*; public class AR { double[] stdoriginalData={}; int p; ARMA