Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >手把手教你用Python处理非平稳时间序列(附代码)

手把手教你用Python处理非平稳时间序列(附代码)

作者头像
数据派THU
发布于 2018-12-14 02:03:59
发布于 2018-12-14 02:03:59
2.2K0
举报
文章被收录于专栏:数据派THU数据派THU

作者:AISHWARYA SINGH

翻译:陈之炎

校对:丁楠雅

本文约3600字,建议阅读10分钟

本文将重点介绍时间序列数据的平稳性检验方法。

简介

预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格……这些问题都有什么共同点?

它们都属于时间序列数据的范畴!如果没有“时间”成分,就无法准确地预测出结果。随着我们周围世界产生的数据越来越多,时间序列预测已成为数据科学家必须掌握的一项越来越关键的技能。

然而,时间序列是一个复杂的话题,它具有多面性。

首先,要想使预测模型正常工作,就必须使时间序列保持平稳。为什么?因为绝大部分原始数据都会有非平稳的趋势。如果有很多不规则的尖峰,你怎么能确保模型正常工作呢?

本文将重点介绍时间序列数据的平稳性检验方法。在此假设读者已熟悉时间序列、ARIMA和平稳性的概念,以下是一些包含基础内容的参考资料:

  • 时间序列建模完整教程
  • 给初学者的时间序列预测综合指南

目录

1. 平稳简介

2. 加载数据

3. 检验平稳的方法

  • ADF检验
  • KPSS检验

4. 平稳的种类

  • 严格平稳
  • 趋势平稳
  • 差分平稳

5. 时间序列平稳化

  • 差分
  • 季节性差分
  • 对数变换

1. 平稳简介

“平稳”是处理时间序列数据时遇到的最重要的概念之一:平稳序列是指其特性-均值、方差和协方差不随时间而变化的序列。

让我们用一个直观的例子来理解这一点。考虑以下三个图形:

  • 在第一幅图中,我们可以清楚地看到,均值随时间而变化(增加),呈现上升的趋势。因此,这是一个非平稳序列。平稳序列不应该呈现出随时间变化的趋势。
  • 第二幅图显然看不到序列的趋势,但序列的变化是一个时间的函数。正如前面提到的,平稳序列的方差必须是一个常数。
  • 再来看第三幅图,随着时间的增加,序列传播后变得更近,这意味着协方差是时间的函数。

上述三个例子均是非平稳时间序列。现在来看第四个图:

在这张图中,均值、方差和协方差都是常数,这就是平稳时间序列。

再想一想,上面的哪一幅图预测未来会更容易呢?第四个图,对吧?大多数统计模型都要求序列是平稳的,这样才能进行有效和精确的预测。

因此,总的来说,平稳时间序列是一个不依赖时间变化 (即均值、方差和协方差不随时间变化)的时间序列。在下一节中,我们将介绍各种检测给定序列是否平稳的方法。

2. 加载数据

在本节和后续几节中,将介绍检测时间序列数据的平稳性的方法,以及如何处理非平稳序列。同时,本文还提供了相应的Python代码。大家可以到:AirPassengers下载文中使用的数据集。

在继续分析数据集之前,首先加载和预处理数据。

好了,看来可以继续了!

3. 检验平稳的方法

下一步是确定给定的序列是否是平稳的,并对它做相应的处理。本节将介绍一些常见的方法,利用这些方法来检测序列是否平稳。

目视检验

看一下我们在上一节中使用的图形,仅需通过目测图形,便能够识别出序列的均值和方差是否随时间变化。同样,通过绘制数据图形,便能确定该序列的属性是否随时间而变化。

显然,通过作图,可以看到序列的趋势(变化的均值),然而,这种目视检测方法得到的结果可能不准确。最好是用一些统计检验方法来验证观测结果。

统计检验

可以利用统计检验来代替目视检验:比如单位根平稳检验。单位根表名给定序列的统计特性(均值,方差和协方差)不是时间的常数,这是平稳时间序列的先决条件。下面是它的数学解释:

假设我们有一个时间序列:

其中yt是t时刻的数据值,ε t 是误差项。需要利用yt-1的值来计算yt,即:

如果利用所有的观察值,yt 的值将是:

假设在上述方程中a的值为1(单位),则预测值将等于yt-n 和从t-n到t的所有误差之和,这意味着方差将随着时间的推移而增大,这就是时间序列中的单位根。众所周知,平稳时间序列的方差不能是时间的函数。单元根检验通过检查a=1的值来检查序列中是否存在单位根。以下是两个最常用的单位根平稳检测方法:

ADF(增补迪基-福勒)检验 The Dickey Fuller test is one of the most popular statistical tests. It can be used to determine the presence of unit root in the series, and hence help us understand if the series is stationary or not. The null and alternate hypothesis of this test are:

迪基-福勒(Dickey Fuller)检验是最流行的统计检验方法之一,可以用它来确定序列中单位根的存在,从而帮助判断序列是否是平稳。这一检验的原假设与备择假设如下:

原假设:序列有一个单位根(a=1的值)

备择假设:该序列没有单位根。

如果不能拒绝原假设,则该序列是非平稳的,这意味着序列可以是线性的,也可以是差分平稳的(将在下一节中更多地了解差分平稳)。

Python代码:

ADF检验结果:ADF检验的统计量为1%,p值为5%,临界值为10%,置信区间为10%。我们对本序列的检验结果如下:

平稳性检验:如果检验统计量小于临界值,我们可以拒绝原假设(也就是序列是平稳的)。当检验统计量大于临界值时,不能拒绝原假设(这意味着序列不是平稳的)。

在上面的例子中,检验统计量>临界值,这意味着序列不是平稳的。这证实了我们最初在目视检测中观察的结果。

KPSS(科瓦特科夫斯·基菲利普·斯施密特·辛)检验 KPSS检验是另一种用于检查时间序列的平稳性 (与迪基-福勒检验相比稍逊一筹) 的统计检验方法。KPSS检验的原假设与备择假设与ADF检验的原假设与备择假设相反,常造成混淆。

KPSS检验的作者将原假设定义为趋势平稳,并将备择假设定义为单位根序列。我们将在下一节详细了解趋势平稳。现在,来看一下KPSS检验的实现,并查看KPSS检验的结果。

原假设:序列是趋势平稳的。

备择假设:序列有一个单位根(序列是非平稳的)。

Python代码:

KPSS检验结果:KPSS检验-检验统计量、p-值和临界值和置信区间分别为1%、2.5%、5%和10%。对于航空乘客数据集的检验结果如下:

平稳性检验:如果检验统计量大于临界值,则拒绝原假设(序列不是平稳的)。如果检验统计量小于临界值,则不能拒绝原假设(序列是平稳的)。对于航空乘客数据集来说,在所有置信区间,检验统计量的值都大于临界值,因此可以说该序列是不平稳的。

在为时间序列数据集准备模型之前,通常会同时进行两种检验。有一次,这两种检验显示出相互矛盾的结果:其中一个检验结果表明该序列是平稳的,而另一个则表明该序列是非平稳的!我困惑了好几个小时,想弄清楚这是怎么回事。后来才知道,序列的平稳性有多种类型。

综上所述,ADF检验有线性平稳或差分平稳的备择假设,而KPSS检验则是识别序列的趋势平稳。

4. 平稳的种类

通过了解不同类型的平稳,来解释上述检验的结果。

  • 严格平稳:严格平稳序列满足平稳过程的数学定义。严格平稳序列的均值、方差和协方差均不是时间的函数。我们的目标是将一个非平稳序列转化为一个严格平稳序列,然后对它进行预测。
  • 趋势平稳:没有单位根但显示出趋势的序列被称为趋势平稳序列。一旦去除趋势之后,产生的序列将是严格平稳的。在没有单位根的情况下,KPSS检测将该序列归类为平稳。这意味着序列可以是严格平稳的,也可以是趋势平稳的。
  • 差分平稳:通过差分可以使时间序列成为严格平稳的时间序列。ADF检验也称为差分平稳性检验。

应用两种检验总会更优些,通过两种检验之后,可以确定这个序列是否是平稳的。下面,来看一下应用两种平稳检验后的可能结果:

  • 结果1:两种检验均得出结论:序列是非平稳的->序列是非平稳的
  • 结果2:两种检验均得出结论:序列是平稳的->序列是平稳的
  • 结果3:KPSS =平稳;ADF =非平稳->趋势平稳,去除趋势后序列严格平稳
  • 结果4:KPSS =非平稳;ADF =平稳->差分平稳,利用差分可使序列平稳。

5. 时间序列的平稳化

在熟悉了平稳性的概念及其不同的类型之后,接下来可以对序列进行平稳化操作。请记住,为了建立时间序列预测模型,必须首先将任何非平稳序列转换为平稳序列。

差分化

在该方法中,计算序列中连续项的差值。执行差分操作通常是为了消除均值的变化。从数学角度,差分可以写成:

yt‘ = yt – y(t-1)

其中yt 是t时刻的数值。

对序列差分化后,绘制出结果:

季节性差分

在季节性差分中,不计算连续值之间的差异,而是计算观察值与同一季节的先前观察值之间的差异。例如,星期一的观察值将与上星期一的观察值相减。从数学角度,它可以写成:

yt‘ = yt – y(t-n)

变换

变换用于对方差为非常数的序列进行平稳化。常用的变换方法包括幂变换、平方根变换和对数变换。对飞机乘客数据集进行快速对数转换和差分:

可以看出,这个图形比先前的图形有了很大的改善。通过对这个序列进行平方根或幂变换,看看是否得出了更好的结果。欢迎在下面的评论里分享你的发现!

尾注

本文介绍了检验时间序列平稳性的不同方法。但并不止步于此,下一步是对得到的序列应用一个预测模型。可以参考以下文章来构建这样的模型:给初学者的时间序列预测综合指南(Beginner’s Guide to Time Series Forecast)。

如果对本文有任何问题或反馈,可以在下面的评论部分与我联系。

还可以在Analytics Vidhya的Android应用程序上阅读这篇文章

作者简介:艾什瓦雅·辛格

Aishwarya Singh

一个热衷于探索无休止的数据科学和人工智能世界的读者。被ML(机器学习)和AI(人工智能)的无限应用所吸引,渴望在数据科学领域进行学习、探索和深入发掘。

原文链接:

https://www.analyticsvidhya.com/blog/2018/09/non-stationary-time-series-python/

原文标题:

A Gentle Introduction to Handling a Non-Stationary Time Series in Python

译者简介

陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
时间序列分析这件小事(六)--非平稳时间序列与差分
之前我们说明了怎么样的时间序列是序列平稳的,但是世界并不是那么美好,很多时间序列都不是平稳序列,所以这里就要求我们做一些处理了。
钱塘小甲子
2019/01/28
3.7K0
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验 作者: 计算机魔术师 版本: 1.0 ( 2023.11.18 )
计算机魔术师
2023/11/20
1.5K0
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
普通的模型对于两个序列的波动分析一般是静态的,但是dcc-garch模型可以实现他们之间动态相关的波动分析,即序列间波动并非为一个常数,而是一个随着时间的变化而变化的系数。其主要用于研究市场间波动率的关系(点击文末“阅读原文”获取完整代码数据)。
拓端
2023/08/30
2140
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
时间序列平稳性检验方法(Python)
当我们拿到时序数据后,首先要进行平稳性和纯随机性的检验,这两个重要的检验是时间序列的预处理。根据检验的结果可以判断出序列属于什么类型,然后对症下药使用相应的分析方法。
Python数据科学
2024/03/05
2.2K0
时间序列平稳性检验方法(Python)
基于ARIMA模型的CCFI指数波动预测及分析
01 引言 近年来,随着航运业在全球经济市场中的参与度越来越高,海运价格的变化对世界各国之间的贸易会产生一定的影响,因此掌握航运的相关运价指数波动变化,可以为企业在贸易经营活动中做出最有利的判断提供依据。 CCFI 指数 中国出口集装箱运价指数,简称CCFI,是指反映中国出口集装箱运输市场价格变化趋势的一种航运价格指数。 该指数由上海航运交易所编制发布,1998年4月13日首次发布,包括综合运价指数及香港、韩国、日本、东南亚、欧洲、南非等11条分航线指数。经过二十几年的不断地发展,已经成为继波交所发布的波
用户1621951
2022/03/28
1.5K0
【Time Series】时间序列基本概念
最近一直在接触时间序列,所以打算写一些有关时间序列的文章,预测部分会从规则开始、到传统模型、到机器学习、再到深度学习,此外也会介绍一些时间序列的基本概念,包括自相关、平稳性、滞后性、季节性等。
阿泽 Crz
2020/08/04
2.2K0
【Time Series】时间序列基本概念
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
普通的模型对于两个序列的波动分析一般是静态的,但是dcc-garch模型可以实现他们之间动态相关的波动分析,即序列间波动并非为一个常数,而是一个随着时间的变化而变化的系数。其主要用于研究市场间波动率的关系。
拓端
2023/02/16
2830
大神教你用Python预测未来:一文看懂时间序列(值得收藏)
导读:本文内容较长,较为详细的阐述了进行时间序列预测的步骤,有些内容可能暂时用不到或者看不懂,但不要紧,知道有这么一个概念,后续碰到的时候,继续深入学习以及使用就可以。
IT阅读排行榜
2019/09/10
3.4K0
大神教你用Python预测未来:一文看懂时间序列(值得收藏)
时间序列预测的20个基本概念总结
时间序列数据是有序的。这意味着观察/数据点依赖于以前的观察/数据点。因此,在模型训练期间,数据点顺序不会被打乱。
deephub
2023/08/30
7860
时间序列预测的20个基本概念总结
时间序列ARIMA模型详解:python实现店铺一周销售量预测
顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1、时间序列是跟时间有关的。所以基于线性回归模型的假设:观察结果是独立的在这种情况下是不成立的。 2、随着上升或者下降的趋势,更多的时间序列出现季节性趋势的形式,如:特定时间框架的具体变化。即:如果你看到羊毛夹克的销售上升,你就一定会在冬季做更多销售。 常用的时间序列模型有AR模型、MA模型、ARMA模型和ARI
机器学习AI算法工程
2018/03/14
8.8K0
时间序列ARIMA模型详解:python实现店铺一周销售量预测
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化|附代码数据
普通的模型对于两个序列的波动分析一般是静态的,但是dcc-garch模型可以实现他们之间动态相关的波动分析,即序列间波动并非为一个常数,而是一个随着时间的变化而变化的系数。其主要用于研究市场间波动率的关系
拓端
2023/05/10
3610
Python配对交易策略统计套利量化交易分析股票市场|附代码数据
说到在股票市场上赚钱,有无数种不同的赚钱方式。似乎在金融界,无论你走到哪里,人们都在告诉你应该学习 Python
拓端
2022/11/09
1.6K0
R语言单位根、协整关系Granger因果检验、RESET分析汇率在岸和离岸数据时间序列
单位根的随机性趋势与协整关系对实证分析中时间序列的影响是不容小觑的。检验的目的在于更好的分辨数据特性、甄选模型,以达到或能预测或能证实因果关系或否定以上两者的结果。
拓端
2023/04/20
4730
干货 | 20个教程,掌握时间序列的特征分析(附代码)
【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用 Python 对时间序列进行特征分析。
AI科技大本营
2019/07/11
6.1K0
干货 | 20个教程,掌握时间序列的特征分析(附代码)
Python配对交易策略统计套利量化交易分析股票市场|附代码数据
说到在股票市场上赚钱,有无数种不同的赚钱方式。似乎在金融界,无论你走到哪里,人们都在告诉你应该学习 Python
拓端
2022/12/09
6220
用python做时间序列预测四:平稳/非平稳时间序列
1、序列的均值(mean)不应该是时间的函数(意思是不应该随时间变化),而应该是一个常数。下面的左图满足这个条件,而右图的均值受时间的变化影响。
程序员一一涤生
2020/06/03
6.2K0
平稳时间序列建模
含义:对一个观察序列(Observed Series),选择一个与其实际过程相吻合的模型结构
爱编程的小明
2022/10/31
7380
实习生的监控算法: 利用时间序列模型进行曲线预测
本文主要探讨了时间序列分析在监控告警系统中的应用,通过处理原始数据、进行平稳性检验、模型选择和预测等步骤,最终使用ARMA模型进行预测,取得较好的效果。预测准确度达到93.3097%。同时,文章也指出了时间序列分析在预测过程中可能遇到的问题,如过拟合等,并建议在进行时间序列分析时采用更多的数据探索方法,如信息量法则等,以提高预测的准确性。
解飞
2017/07/26
5.3K0
实习生的监控算法: 利用时间序列模型进行曲线预测
一阶差分序列garch建模_时间序列分析
趋势变动:在长时期内按某种规则稳定地呈现出来的持续向上或向下或保持在某一水平。季节变动:在一个年度内重复出现的周期性波动。它是诸如气候条件、生产条件、节假日或人们的风俗习惯等各种因素影响的结果。循环波动:是时间序列呈现出得非固定长度的周期性变动。循环波动的周期可能会持续一段时间,但与趋势不同,它不是朝着单一方向的持续变动,而是涨落相同的交替波动。不规则波动(随机变动):是许多不可控的偶然因素共同作用的结果,致使时间序列产生一种波浪形或震荡式的变动。
用户7886150
2021/01/30
1.9K0
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
上一篇已经对赛题进行详细分析了,而且大方向和基本的模型已经确定完毕,数据集都已经找到了,现在最重要的就是要分析风暴数据集以及建立时序预测模型,使用气候模型预测的数据,评估气候变化对未来极端天气事件频率和强度的影响。来看极端天气频率是否会上升,以及如何利用历史气象数据来支撑我们的模型效果。
fanstuck
2024/02/04
6760
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
推荐阅读
时间序列分析这件小事(六)--非平稳时间序列与差分
3.7K0
【数据挖掘 & 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验
1.5K0
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
2140
时间序列平稳性检验方法(Python)
2.2K0
基于ARIMA模型的CCFI指数波动预测及分析
1.5K0
【Time Series】时间序列基本概念
2.2K0
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化
2830
大神教你用Python预测未来:一文看懂时间序列(值得收藏)
3.4K0
时间序列预测的20个基本概念总结
7860
时间序列ARIMA模型详解:python实现店铺一周销售量预测
8.8K0
R语言DCC-GARCH模型对上证指数、印花税收入时间序列数据联动性预测可视化|附代码数据
3610
Python配对交易策略统计套利量化交易分析股票市场|附代码数据
1.6K0
R语言单位根、协整关系Granger因果检验、RESET分析汇率在岸和离岸数据时间序列
4730
干货 | 20个教程,掌握时间序列的特征分析(附代码)
6.1K0
Python配对交易策略统计套利量化交易分析股票市场|附代码数据
6220
用python做时间序列预测四:平稳/非平稳时间序列
6.2K0
平稳时间序列建模
7380
实习生的监控算法: 利用时间序列模型进行曲线预测
5.3K0
一阶差分序列garch建模_时间序列分析
1.9K0
2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
6760
相关推荐
时间序列分析这件小事(六)--非平稳时间序列与差分
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档