精华内容
下载资源
问答
  • 2021-03-12 10:47:43

    通过小波变换判断数据是否平稳波动

    1. 小波变换理解

    小波,就是很小的波,它的积分总是接近于 0;

    小波变换就是把一个波形分解成N个低频部分和M个高频部分的和;

    小波变换百科解释:指用有限长或快速衰减的“母小波”的振荡波形来表示信号。该波形被缩放和平移以匹配输入的信号。

    基础补充:

    每个小波变换都会有一个mother wavelet,我们称之为母小波,同时还有一个scaling function,中文是尺度函数,也被成为父小波。
    母小波是一类具有快速衰减有限长的波函数。
    任何小波变换的基函数,其实就是对这个母小波和父小波缩放和平移后的集合。
    小波基形成,是基于基本的小波函数,也就是母小波来做缩放和平移的。但是,母小波并非唯一的原始基。在构建小波基函数集合的时候,通常还要用到一个函数叫尺度函数,即父小波。

    2. 判断数据是否平稳波动

    标准差是一种常见的全局波动度量方法,可以描述数据围绕均值波动程度的大小,标准差越大表示数据波动越厉害。因此可以通过计算标准差作为量化评价数据整体波动情况的指标。

    对局部数据的波动度量,可以采用小波变换的方法来提取数据中的局部波动信息。对数据进行小波变换可以获得数据的低频信息和高频信

    更多相关内容
  • 但更方便的是直接用下边的p值 第二行——p值,即数据平稳的概率 第三行——延迟 第四行——本次检测用到的观测值个数 第五~第七行——1%、5%、10%标准下的临界值 3 如何确定数据是否平稳? 有两种看法 1)1%、%5、...

    1 基本用法

    statsmodels.tsa.stattools.adfuller(
        x,
        maxlag = None,
        regression ='c',
        autolag ='AIC',
        store = False,
        regresults = False )

    2 举例说明

    adfuller(price_A)
    '''
    (-2.0226025821924765, 
     0.27675142429522215, 
    54, 
    101983, 
    {'1%': -3.430414123085256,
    '5%': -2.861568341405142, 
    '10%': -2.566785085137168},
     -915434.180263706)

    那么这些值都是什么意思呢?,我挑个人觉得比较重要的几个讲

    第一行——统计值,用于和下边 1%,5%,和10%临界值比较。但更方便的是直接用下边的p值

    第二行——p值,即数据不平稳的概率

    第三行——延迟

    第四行——本次检测用到的观测值个数

    第五~第七行——1%、5%、10%标准下的临界值

    3 如何确定数据是否平稳?

    有两种看法

    1)1%、%5、%10不同程度拒绝原假设的统计值【第五~第七行】和 Test result【第一行】的比较,Test result同时小于1%、5%、10%即说明非常好地拒绝该假设

    本数据中,adf结果为-2.02, 大于三个level的统计值。所以是不平稳的

    2)P-value是否非常接近0,接近0,则是平稳的,否则,不平稳。

    展开全文
  • 描述了如何从直观的数据图中,和数据分布图(钟形曲线),以及数据统计值(Dickey-Fuller)上判断数据是否平稳的。 正文: 时间序列不同于更传统的分类和回归预测建模问题。 时间结构为观察增加了一个顺序。...

    导读:

    本文介绍了数据平稳的重要性,平稳的数据对模型有什么影响。

    描述了如何从直观的数据图中,和数据分布图(钟形曲线),以及数据统计值(Dickey-Fuller)上判断数据是否是平稳的。

    正文:

    时间序列不同于更传统的分类和回归预测建模问题。

    时间结构为观察增加了一个顺序。这种强加的顺序意味着需要专门处理关于这些观察的一致性的重要假设。

    例如,在建模时,假设观测的汇总统计数据是一致的。在时间序列术语中,我们将此期望称为时间序列是静止的。

    通过增加趋势,季节性和其他依赖于时间的结构,可以在时间序列中容易地违反这些假设。

    在本教程中,您将了解如何使用Python检查时间序列是否稳定。

    完成本教程后,您将了解:

    • 如何使用线图识别明显的静止和非平稳时间序列。
    • 如何查看随时间变化的均值和方差等汇总统计信息。
    • 如何使用具有统计显着性的统计检验来检查时间序列是否静止。

    固定时间序列

    静止时间序列中的观察结果不依赖于时间。

    如果没有趋势或季节性影响,时间序列是固定的。按时间序列计算的汇总统计数据随时间变化是一致的,如观测值的均值或方差。

    当时间序列静止时,可以更容易建模。统计建模方法假定或要求时间序列是静止的以使其有效。

    以下是固定的每日女性出生数据集的示例。

    from pandas import Series
    from matplotlib import pyplot
    series = Series.from_csv('daily-total-female-births.csv', header=0)
    series.plot()
    pyplot.show()

    运行该示例将创建以下图表。 

    每日女性出生数据集图

                                      每日女性出生数据集图

     

    非定时时间序列

    非平稳时间序列的观测显示了季节性影响,趋势和其他依赖于时间指数的结构。

    像平均值和方差这样的汇总统计数据会随着时间的推移而发生变化,从而使模型可能尝试捕获的概念发生偏差。

    经典时间序列分析和预测方法涉及通过识别和消除趋势以及消除季节性影响来使非平稳时间序列数据静止。

    以下是非固定航空公司乘客数据集的示例,显示趋势和季节性组件。

    from pandas import Series
    from matplotlib import pyplot
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    series.plot()
    pyplot.show()

    运行该示例将创建以下图表。 

    非固定航空公司乘客数据集

                                  非固定航空公司乘客数据集

    固定时间序列的类型

    平稳性的概念来自时间序列的理论研究,在预测时它是一个有用的抽象。

    如果你深入研究这个话题,你可能会遇到一些更细微的平稳性概念。他们是:

    他们是:

    • 固定过程:产生一系列固定观测的过程。
    • 固定模型:描述固定观测系列的模型。
    • Trend Stationary:不显示趋势的时间序列。
    • 季节性文具:没有季节性的时间序列。
    • 严格固定:静止过程的数学定义,特别是观测的联合分布对时移是不变的。

    固定时间序列与预测

    你应该把你的时间序列固定吗?

    一般来说,是的。

    如果您的时间序列中有明确的趋势和季节性,那么对这些组件进行建模,将其从观察中移除,然后在残差上训练模型。

    统计时间序列方法甚至现代机器学习方法将受益于数据中更清晰的信号。

    当经典方法失败时,我们转向机器学习方法。当我们想要更多或更好的结果时。我们不知道如何最好地模拟时间序列数据中的未知非线性关系,并且一些方法在使用非平稳观测或某些固定和非静止视图的混合时可以产生更好的性能。

    这里的建议是将时间序列的属性视为静止或不作为另一个信息源,可以在使用机器学习方法时在时间序列问题中使用特征工程和特征选择。

    检查平稳性

    有许多方法可以检查时间序列(直接观察,残差)是静止的还是非静止的。

    1. 看看Plots:您可以查看数据的时间序列图,并目视检查是否有任何明显的趋势或季节性。
    2. 摘要统计:您可以查看季节或随机分区数据的摘要统计信息,并检查明显或显着的差异。
    3. 统计测试:您可以使用统计测试来检查是否满足或已经违反了平稳性的期望。

    在上文中,我们已经将每日女性出生和航空旅客数据集分别定为静止和非静止,并且图表显示趋势和季节性成分明显缺乏和存在。

    接下来,我们将看一个快速的方法来计算和查看我们的时间序列数据集的摘要统计数据,以检查它是否是静止的。

    摘要统计

    如何快速的检查以确定您的时间序列是非静止的是查看摘要统计信息。

    您可以将时间序列拆分为两个(或更多)分区,并比较每个组的均值和方差。如果它们不同并且差异具有统计显着性,则时间序列可能是非平稳的。

    接下来,让我们在Daily Births数据集上尝试这种方法。

    每日出生数据集

    因为我们正在研究均值和方差,所以我们假设数据符合高斯(也称为钟形曲线或正态)分布。

    我们还可以通过观察我们观察的直方图来快速检查这一点。

    from pandas import Series
    from matplotlib import pyplot
    series = Series.from_csv('daily-total-female-births.csv', header=0)
    series.hist()
    pyplot.show()

     

    运行该示例绘制时间序列中的值的直方图。我们清楚地看到高斯分布的钟形曲线形状,也许右尾更长。

    每日女性出生的直方图

                                        每日女性出生的直方图

    接下来,我们可以将时间序列分成两个连续的序列。然后我们可以计算每组数字的均值和方差并比较这些数值。

    from pandas import Series
    series = Series.from_csv('daily-total-female-births.csv', header=0)
    X = series.values
    split = len(X) / 2
    X1, X2 = X[0:split], X[split:]
    mean1, mean2 = X1.mean(), X2.mean()
    var1, var2 = X1.var(), X2.var()
    print('mean1=%f, mean2=%f' % (mean1, mean2))
    print('variance1=%f, variance2=%f' % (var1, var2))

    运行此示例显示均值和方差值不同,但大致在同一水平线上。 

    mean1=39.763736, mean2=44.185792
    variance1=49.213410, variance2=48.708651

    接下来,让我们在Airline Passengers数据集上尝试相同的方法。 

    航空公司乘客数据集

    直接切入追踪,我们可以分割我们的数据集并计算每个组的均值和方差。

    from pandas import Series
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    X = series.values
    split = len(X) / 2
    X1, X2 = X[0:split], X[split:]
    mean1, mean2 = X1.mean(), X2.mean()
    var1, var2 = X1.var(), X2.var()
    print('mean1=%f, mean2=%f' % (mean1, mean2))
    print('variance1=%f, variance2=%f' % (var1, var2))

    运行该示例,我们可以看到均值和方差看起来非常不同。因此这是一个非平稳的时间序列。 

    mean1=182.902778, mean2=377.694444
    variance1=2244.087770, variance2=7367.962191

    让我们退一步,检查在这种情况下假设高斯分布是否有意义,将时间序列的值绘制为直方图。 

    from pandas import Series
    from matplotlib import pyplot
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    series.hist()
    pyplot.show()

    运行该示例表明,值的分布确实看起来不像高斯,因此均值和方差值的意义不大。 

    这种观察的压扁分布可能是非平稳时间序列的另一个指标。

    航空公司乘客的直方图

                                          航空公司乘客的直方图

    再次回顾时间序列的章节,我们可以看到有一个明显的季节性成分,看起来季节性成分正在增长。

    这可能表明每个季节都呈指数级增长。可以使用对数变换将指数变化平坦回到线性关系。

    下面是具有时间序列的对数变换的相同直方图。

    from pandas import Series
    from matplotlib import pyplot
    from numpy import log
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    X = series.values
    X = log(X)
    pyplot.hist(X)
    pyplot.show()
    pyplot.plot(X)
    pyplot.show()

    运行这个例子,我们可以看到更熟悉的高斯分布或类似统一的值分布。 

    航空公司乘客的直方图记录

                                航空公司乘客的直方图记录

    我们还创建了对数转换数据的线图,可以看到指数增长似乎减少了,但我们仍然有趋势和季节性元素。

    航空公司乘客的线路图

                                     航空公司乘客的线路图

    我们现在可以计算对数变换数据集的值的均值和标准差。

    from pandas import Series
    from matplotlib import pyplot
    from numpy import log
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    X = series.values
    X = log(X)
    split = len(X) / 2
    X1, X2 = X[0:split], X[split:]
    mean1, mean2 = X1.mean(), X2.mean()
    var1, var2 = X1.var(), X2.var()
    print('mean1=%f, mean2=%f' % (mean1, mean2))
    print('variance1=%f, variance2=%f' % (var1, var2))

    运行示例显示了每组的平均值和标准偏差值,这些值相似但不相同。 

    或许,仅从这些数字来看,我们就会说时间序列是静止的,但我们坚信在审查线图时不会出现这种情况。

    mean1=5.175146, mean2=5.909206
    variance1=0.068375, variance2=0.049264  

    这是一种快速的方法,但很容易被误导。

    我们可以使用统计检验来检查两个高斯随机变量样本之间的差异是真实的还是统计的侥幸。我们可以探索统计显着性检验,例如Student t检验,但由于值之间的序列相关性,事情变得棘手。

    在下一节中,我们将使用统计测试来明确评论单变量时间序列是否是静止的。

    增强Dickey-Fuller测试

    统计测试对您的数据做出了强有力的假设。它们只能用于通知零假设可被拒绝或未被拒绝的程度。必须解释结果才能使给定问题有意义。

    然而,他们可以提供快速检查和确认,证明您的时间序列是静止的或非静止的。

    扩张的Dickey-Fuller检定是一类被称为统计测试的单位根检验

    单位根检验背后的直觉是它确定趋势定义时间序列的强度。

    有许多单位根测试,Augmented Dickey-Fuller可能是更广泛使用的之一。它使用自回归模型并优化跨多个不同滞后值的信息标准。

    测试的零假设是时间序列可以用单位根表示,它不是静止的(具有一些时间依赖的结构)。替代假设(拒绝零假设)是时间序列是静止的。

    • 空假设(H0):如果未被拒绝,则表明时间序列具有单位根,这意味着它是非平稳的。它有一些时间依赖的结构。
    • 替代假设(H1):零假设被拒绝; 它表明时间序列没有单位根,这意味着它是静止的。它没有时间依赖的结构。

    我们使用测试中的p值来解释这个结果。低于阈值的p值(例如5%或1%)表明我们拒绝零假设(静止),否则高于阈值的p值表明我们未能拒绝零假设(非静止)。

    • p值> 0.05:无法拒绝原假设(H0),数据具有单位根并且是非平稳的。
    • p值<= 0.05:拒绝原假设(H0),数据没有单位根并且是静止的。

    下面是在Daily Female Births数据集上计算Augmented Dickey-Fuller测试的示例。statsmodels库提供了实现测试的adfuller()函数。

    from pandas import Series
    from statsmodels.tsa.stattools import adfuller
    series = Series.from_csv('daily-total-female-births.csv', header=0)
    X = series.values
    result = adfuller(X)
    print('ADF Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    print('Critical Values:')
    for key, value in result[4].items():
    	print('\t%s: %.3f' % (key, value))

    运行该示例将打印测试统计值-4。这个统计数据越负,我们就越有可能拒绝零假设(我们有一个固定的数据集)。 

    作为输出的一部分,我们得到一个查找表来帮助确定ADF统计数据。我们可以看到,我们的统计值-4小于-3.449的值,1%。

    这表明我们可以拒绝具有小于1%的显着性水平的零假设(即结果是统计学侥幸的低概率)。

    拒绝原假设意味着该过程没有单位根,反过来,时间序列是静止的或没有时间依赖的结构。

    ADF Statistic: -4.808291
    p-value: 0.000052
    Critical Values:
        5%: -2.870
        1%: -3.449
        10%: -2.571

    我们可以在Airline Passenger数据集上执行相同的测试。 

    from pandas import Series
    from statsmodels.tsa.stattools import adfuller
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    X = series.values
    result = adfuller(X)
    print('ADF Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    print('Critical Values:')
    for key, value in result[4].items():
    	print('\t%s: %.3f' % (key, value))

    运行该示例给出了与上面不同的图片。检验统计量是正的,这意味着我们不太可能拒绝零假设(它看起来是非平稳的)。 

    将测试统计量与临界值进行比较,看起来我们不得不拒绝零假设,即时间序列是非平稳的并且具有时间依赖性结构。

    ADF Statistic: 0.815369
    p-value: 0.991880
    Critical Values:
        5%: -2.884
        1%: -3.482
        10%: -2.579

    让我们再次对数据集进行log转换,使值的分布更加线性,更好地满足此统计检验的预期。 

    from pandas import Series
    from statsmodels.tsa.stattools import adfuller
    from numpy import log
    series = Series.from_csv('international-airline-passengers.csv', header=0)
    X = series.values
    X = log(X)
    result = adfuller(X)
    print('ADF Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    for key, value in result[4].items():
    	print('\t%s: %.3f' % (key, value))

    运行该示例显示测试统计信息的负值。 

    我们可以看到该值大于临界值,这意味着我们不能拒绝零假设,反过来说时间序列是非平稳的。

    ADF Statistic: -1.717017
    p-value: 0.422367
        5%: -2.884
        1%: -3.482
        10%: -2.579 

     

    展开全文
  • 此文分别利用离散小波变换和平稳小波变换对信号奇异点进行检测,论述了二者突变性检测的MATLAB仿真实现,分析了信号奇异点的定位方法和检测效果。将二者的定位方法和检测效果进行比较,得出平稳小波变换(二进小波...
  • 通过FPGA实现高速流水计算对采集的输入信号进行小波分析,并由嵌入式计算机ETX完成数据采集、处理、控制量形成以及人机交互操作等功能,在试验室环境下实现了对振动台典型非平稳振动信号的检测处理。试验验证了快速...
  • 时间序列的平稳性检验方法汇总

    千次阅读 2021-10-19 00:32:34
    来源:TimeSeries当我们有一个新的时间序列数据时,怎么判断是否平稳的呢?时间序列平稳性检验方法,可分为三类:图形分析方法简单统计方法假设检验方法一、图形分析方法图形分析方法是一...

    来源:TimeSeries

    44c209cba1920c0e02f0cea8fcfefc07.gif

    当我们有一个新的时间序列数据时,怎么判断它是否是平稳的呢?

    时间序列平稳性检验方法,可分为三类:

    1. 图形分析方法

    2. 简单统计方法

    3. 假设检验方法

    一、图形分析方法

    图形分析方法是一种最基本、最简单直接的方法,即绘制图形,肉眼判断。

    可直接可视化时间序列数据,也可以可视化时间序列的统计特征。

    可视化数据

    可视化数据即绘制时间序列的折线图,看曲线是否围绕某一数值上下波动(判断均值是否稳定),看曲线上下波动幅度变化大不大(判断方差是否稳定),看曲线不同时间段波动的频率[~紧凑程度]变化大不大(判断协方差是否稳定),以此来判断时间序列是否是平稳的。

    以下绘制几张图,大家来直观判断一下哪些是平稳的,哪些是非平稳的。

    import numpy as np
    import pandas as pd
    import akshare as ak
    from matplotlib import pyplot as plt
    
    np.random.seed(123)
    
    # -------------- 准备数据 --------------
    # 白噪声
    white_noise = np.random.standard_normal(size=1000)
    
    # 随机游走
    x = np.random.standard_normal(size=1000)
    random_walk = np.cumsum(x)
    
    # GDP
    df = ak.macro_china_gdp()
    df = df.set_index('季度')
    df.index = pd.to_datetime(df.index)
    gdp = df['国内生产总值-绝对值'][::-1].astype('float')
    
    # GDP DIFF
    gdp_diff = gdp.diff(4).dropna()
    
    
    # -------------- 绘制图形 --------------
    fig, ax = plt.subplots(2, 2)
    
    ax[0][0].plot(white_noise)
    ax[0][0].set_title('white_noise')
    ax[0][1].plot(random_walk)
    ax[0][1].set_title('random_walk')
    
    ax[1][0].plot(gdp)
    ax[1][0].set_title('gdp')
    ax[1][1].plot(gdp_diff)
    ax[1][1].set_title('gdp_diff')
    
    plt.show()

    828ee6136446642a66c1df31ba8ee4fe.pnga. 白噪声,曲线围绕0值上下波动,波动幅度前后、上下一致,为平稳序列。
    b. 随机游走,曲线无确定趋势,均值、方差波动较大,非平稳序列。
    c. GDP数据趋势上升,均值随时间增加,非平稳序列。
    d. GDP季节差分后数据,曲线大致在一条水平线上上下波动,波动幅度前后变化较小,可认为是平稳的。

    可视化统计特征

    可视化统计特征,是指绘制时间序列的自相关图和偏自相关图,根据自相关图的表现来判断序列是否平稳。

    自相关,也叫序列相关,是一个信号与自身不同时间点的相关度,或者说与自身的延迟拷贝--或滞后--的相关性,是延迟的函数。不同滞后期得到的自相关系数,叫自相关图。

    (这里有一个默认假设,即序列是平稳的,平稳序列的自相关性只和时间间隔k有关,不随时间t的变化而变化,因而可以称自相关函数是延迟(k)的函数)

    平稳序列通常具有短期相关性,对于平稳的时间序列,自相关系数往往会迅速退化到零(滞后期越短相关性越高,滞后期为0时,相关性为1);而对于非平稳的数据,退化会发生得更慢,或存在先减后增或者周期性的波动等变动。

    5be555a2f5f23718fba1242a2acfa1bf.png

    自相关的计算公式为根据滞后期k将序列拆成等长的两个序列,计算这两个序列的相关性得到滞后期为k时的自相关性。举例:

    import statsmodels.api as sm
    X = [2,3,4,3,8,7]
    print(sm.tsa.stattools.acf(X, nlags=1, adjusted=True))

    > [1, 0.3559322]
    其中第一个元素为滞后期为0时的自相关性,第二个元素为滞后期为1时的自相关性

    根据ACF求出滞后k自相关系数时,实际上得到并不是X(t)与X(t-k)之间单纯的相关关系。

    因为X(t)同时还会受到中间k-1个随机变量X(t-1)、X(t-2)、……、X(t-k+1)的影响,而这k-1个随机变量又都和X(t-k)具有相关关系,所以自相关系数里面实际掺杂了其他变量对X(t)与X(t-k)的影响。

    在剔除了中间k-1个随机变量X(t-1)、X(t-2)、……、X(t-k+1)的干扰之后,X(t-k)对X(t)影响的相关程度,叫偏自相关系数。不同滞后期得到的偏自相关系数,叫偏自相关图。(偏自相关系数计算较复杂,后期再来具体介绍)

    下面我们就来看看几个实战案例(上图中的数据再来看一下它们的自相关图和偏自相关图):

    # 数据生成过程在第一个代码块中
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    
    fig, ax = plt.subplots(4, 2)
    fig.subplots_adjust(hspace=0.5)
    
    plot_acf(white_noise, ax=ax[0][0])
    ax[0][0].set_title('ACF(white_noise)')
    plot_pacf(white_noise, ax=ax[0][1])
    ax[0][1].set_title('PACF(white_noise)')
    
    plot_acf(random_walk, ax=ax[1][0])
    ax[1][0].set_title('ACF(random_walk)')
    plot_pacf(random_walk, ax=ax[1][1])
    ax[1][1].set_title('PACF(random_walk)')
    
    plot_acf(gdp, ax=ax[2][0])
    ax[2][0].set_title('ACF(gdp)')
    plot_pacf(gdp, ax=ax[2][1])
    ax[2][1].set_title('PACF(gdp)')
    
    plot_acf(gdp_diff, ax=ax[3][0])
    ax[3][0].set_title('ACF(gdp_diff)')
    plot_pacf(gdp_diff, ax=ax[3][1])
    ax[3][1].set_title('PACF(gdp_diff)')
    
    plt.show()

    592760c0d28c8d614da3270c0e6f66c2.png(1) 白噪声的自相关系数很快就衰减到0附近,是明显的平稳序列。滞后期为0时自相关系数和偏自相关系数其实就是序列自己和自己的相关性,故为1;滞后期为1时,自相关系数为0,表示白噪声无自相关性。
    (2) 随机游走,自相关系数下降非常缓慢,故为非平稳序列;另从偏自相关系数中可以看到随机游走只和前一项有关。
    (3) GDP数据的自相关图中也可以看到存在一定的周期性,滞后4、8、12等自相关系数较大下降较慢,差分后下降多一些起到一定效果,认为差分后序列是平稳的。同可视化数据一样,直观判断带有较强主观性,但能让我们对数据有更直观的认识。

    二、简单统计方法

    计算统计量的方法只是作为一个补充,了解即可。宽平稳中有两个条件是均值不变和方差不变,可视化数据中我们可以直观看出来,其实还可以具体计算一下看看。

    很有意思的逻辑,直接将序列前后拆分成2个序列,分别计算这2个序列的均值、方差,对比看是否差异明显。(其实很多时序异常检验也是基于这种思想,前后分布一致则无异常,否则存在异常或突变)

    我们来算白噪声和随机游走序列不同时间段的均值、方差:

    import numpy as np
    
    np.random.seed(123)
    
    white_noise = np.random.standard_normal(size=1000)
    
    x = np.random.standard_normal(size=1000)
    random_walk = np.cumsum(x)
    
    def describe(X):
        split = int(len(X) / 2)
        X1, X2 = X[0:split], X[split:]
        mean1, mean2 = X1.mean(), X2.mean()
        var1, var2 = X1.var(), X2.var()
        print('mean1=%f, mean2=%f' % (mean1, mean2))
        print('variance1=%f, variance2=%f' % (var1, var2))
    
    print('white noise sample')
    describe(white_noise)
    
    print('random walk sample')
    describe(random_walk)

    white noise sample:
    mean1=-0.038644, mean2=-0.040484
    variance1=1.006416, variance2=0.996734

    random walk sample:
    mean1=5.506570, mean2=8.490356
    variance1=53.911003, variance2=126.866920

    白噪声序列均值和方差略有不同,但大致在同一水平线上;
    随机游走序列的均值和方差差异就比较大,因此为非平稳序列。

    三、假设检验方法

    平稳性的假设检验方法当前主流为单位根检验,检验序列中是否存在单位根,若存在,则为非平稳序列,不存在则为平稳序列。

    在介绍检验方法之前,有必要了解一些相关补充知识,这样对后面的检验方法理解上就会更清晰一些。

    预备知识

    确定趋势

    如果时间序列有“确定趋势”,比如

    其中, 即为确定趋势。

    期望中有时间变量,随时间变化,所以不是平稳时间序列。

    含有确定趋势的序列的差分过程是过度差分:

    过度差分不但会使序列样本容量减少,还会使序列的方差变大。差分后的序列会存在自相关性,但这种自相关性是毫无意义的。

    所以应该使用“退势”的方法获得平稳序列,如下:
    但是 如何确定,趋势拟合。消除序列中的时间趋势后,即为平稳序列,所以称这样的序列为“趋势平稳”序列或“退势平稳”序列。

    随机趋势

    另一种导致时间序列非平稳的因素为“随机趋势”。比如随机游走模型:
    ,其中 为白噪声

    来自 的任何波动对 都具有永久性的冲击,最主要的是其影响力不随时间而衰减,称 为这个模型的“随机趋势”。


    带漂移项的随机游走模型:
    , 其中 为常数
       

    除持续受到来自随机趋势 的影响外,还受一个常数项 的影响。


    以上对随机游走或带漂移项的随机游走进行一阶差分,均可消除随机趋势的影响,得到一个平稳序列,故称“差分平稳”序列。

    d阶单整

    称平稳的时间序列为“零阶单整”(Integrated of order zero),记为 。
    如果时间序列的一阶差分是平稳的,则称为“一阶单整”(Integrated of order one),记为 ,也称为“单位根过程”(unit root process)。

    更一般地,如果时间序列的 阶差分为平稳过程,则称为“d阶单整”(Integrated of order d),记为 。

    什么是单位根

    考虑如下基础模型:
    ,其中 为白噪声
    和随机游走模型很像,只不过多了个系数 。

    我们知道随机游走是非平稳的,但是当 时,这个序列就变成平稳的了。

    当 时,随着 的增大, 最终会收敛,长期来看 是平稳的。
    当 时, 为无规律非平稳的随机游走过程;
    当 时, 为爆炸式增长的非平稳过程。

    等于1时 就是我们所说的单位根。

    画图对比以下可能会更清晰一些

    import numpy as np
    from matplotlib import pyplot as plt
    
    np.random.seed(123)
    
    def simulate(beta):
        y = np.random.standard_normal(size=1000)
        for i in range(1, len(y)):
            y[i] = beta * y[i - 1] + y[i]
        return y
    
    plt.figure(figsize=(20, 4))
    for i, beta in enumerate([0.9, 1.0, 1.1]):
        plt.subplot(1, 3, i+1)
        plt.plot(simulate(beta))
        plt.title('beta: {}'.format(beta))
    plt.show()
    eb6a4027e979762b6cc2fb08ce0612d0.png

    一阶差分方程
           
                   
                           
    为一阶随机差分方程(因为含有随机项)
    无随机项为确定性差分方程(但非齐次,因为含常数项 )
    为对应的齐次差分方程

    根据差分方程理论, 的稳定性和 的稳定性是一样的,而 是否稳定取决于 是否稳定,所以判断一个差分方程是否稳定,只要看它对应的齐次差分方程是否有稳定的通解即可。

    以上齐次差分方程对应的特征方程为:, 称为差分方程的特征根。

    只有 ,即特征方程的根落在复平面的单位圆以内的时候,过程才会平稳。若果根正好落在圆上,称为单位根,为非平稳过程,比如随机游走的情形。如果落在圆外,则为爆炸式增长的非平稳过程。

    差分方程写成滞后算子的形式是这样的
    , 为滞后算子

    对应特征方程(逆特征方程)为:
    , 称为自回归滞后算子多项式的特征根。

    显然,差分方程的特征值λ与自回归滞后算子多项式的特征根z是互为倒数。
    均小于1(特征方程的根都在单位圆内)时是平稳的,对应的 均大于1(逆特征方程的根都在圆外)时是平稳的。

    更一般的n阶差分方程

    对应的齐次差分方程为:


    该齐次差分方程的特征方程为:

    根均在单位圆内是平稳的。

    滞后算子形式(逆特征方程)为:

    根均在单位圆外是平稳的。

    一般直接计算高阶差分方程的根比较复杂,有些简单规则可以用来检验高阶差分方程的稳定性。

    n阶差分方程中,所有特征根均位于单位圆内的充分条件为:

    n阶差分方程中,所有特征根均位于单位圆内的必要条件为:

    如果 ,至少有一个特征根等于1。

    一个或多个特征根等于1的时间序列,称为单位根过程

    单位根(unit root)检验就是检验该差分方程的特征方程(characteristic equation)的各个特征根(characteristic root)是均小于1,还是存在等于1的情况。没有检验均大于1的情况,是因为当根均大于1时为爆炸型发散序列,日常数据中基本不存在。


    检验方法

    DF检验

    ADF检验(Augmented Dickey-Fuller Testing)是最常用的单位根检验方法之一,通过检验序列是否存在单位根来判断序列是否是平稳的。ADF检验是DF检验的增强版,在介绍ADF之前,我们先来看一下DF检验。

    迪基(Dickey)和弗勒(Fuller)1979年基于非平稳序列的基本特征将其大致归为三类并提出DF检验:

    (1) 当序列基本走势呈现无规则上升或下降并反复时,将其归为无漂移项自回归过程;
    (2) 当序列基本走势呈现明显的随时间递增或递减且趋势并不太陡峭时,将其归为带漂移项自回归过程;
    (3) 当序列基本走势随时间快速递增时,则将其归为带趋势项回归过程。

    对应检验回归式为:
    (i) 无漂移项自回归过程:
    (ii) 带漂移项自回归过程:
    (iii) 带漂移项和趋势项自回归过程:
    其中 是常数项, 是时间趋势项, 为白噪声无自相关性。

    • 原假设 (存在单位根,时间序列是非平稳的)

    • 备择假设 (不存在单位根,时间序列是平稳的--不含截距项和趋势项平稳/含截距项平稳/含截距项和趋势平稳)

    若检验统计量大于临界值(p值大于显著性水平 ),不能拒绝原假设,序列是非平稳的;
    若检验统计量小于临界值(p值小于显著性水平 ),拒绝原假设,认为序列是平稳的。

    下图是网络中看到的单位根检验流程图以供参考(根据该流程可以确定序列是何种类型下的平稳,即便非平稳也可知道是何种类型下的非平稳序列):

    3fdaf9a5394db2f34c33698ac5b38629.png
    单位根检验流程

    ADF检验

    DF的检验公式为一阶自回归过程,为了能适用于高阶自回归过程的平稳性检验,迪基等1984年对DF检验进行了一定的修正,引入了更高阶的滞后项,ADF的检验回归式修正为:

    eca7bfc0494ff0cbd3d5b8abb34991c7.png

    假设条件不变:

    • 原假设 (存在单位根,时间序列是非平稳的)

    • 备择假设 (不存在单位根,时间序列是平稳的--不含截距项和趋势项平稳/含截距项平稳/含截距项和趋势平稳)

    检验流程同DF检验一致。若要严格判断序列是否是宽平稳的,可以直接检验是否不含截距项和趋势项平稳;若不能拒绝原假设(如p>0.05),序列非平稳,其实仍有必要检验序列是否是趋势平稳的。非平稳且非趋势平稳,可以使用一阶差分等平稳化方法处理后再做检验,若是趋势平稳,困于过度差分则不宜使用差分方式平稳化。

    生成一个趋势平稳序列:

    import numpy as np
    from matplotlib import pyplot as plt
    
    np.random.seed(123)
    
    y = np.random.standard_normal(size=100)
    for i in range(1, len(y)):
        y[i] = 1 + 0.1*i + y[i]
    
    plt.figure(figsize=(12, 6))
    plt.plot(y)
    plt.show()
    608a1dc573a5f8056a99fd5360361060.png

    检验是否平稳:

    from arch.unitroot import ADF
    adf = ADF(y)
    # print(adf.pvalue)
    print(adf.summary().as_text())
    
    adf = ADF(y)
    adf.trend = 'ct'
    print(adf.summary().as_text())
    b0f4617630382bb55eb7e24d7692f558.png

    说明:
    arch包中ADF检验可指定trend为
    'n'(不含截距项和时间趋势项)
    'c'(含截距项)
    'ct'(含截距项和时间趋势项)
    'ctt'(含截距项和时间趋势项和二次型时间趋势项)
    分别对应不同平稳类型的检验。(滞后期lags默认为AIC最小)

    以上第一个文本输出中,不指定trend默认为检验是否含截距项平稳,显著性水平p=0.836>0.05,不拒绝原假设,非平稳;
    以上第二个文本输出中,指定trend为检验是否含截距项和时间趋势项平稳,显著性水平p=0.000<0.05,拒绝原假设,故为趋势项平稳。

    我们再来看看GDP季节差分前后数据是否为平稳的:

    # 数据在第一个代码块中
    from arch.unitroot import ADF
    adf = ADF(gdp)
    print(adf.summary().as_text())
    
    adf = ADF(gdp_diff)
    print(adf.summary().as_text())
    0e576b864587670aeb4d78fc1008beea.png

    可以看到差分前p值为0.998>0.05,不能拒绝原假设,数据非平稳;差分后p值为0.003<0.05,故在5%的显著性水平下可拒绝原假设,差分后的数据是平稳的。

    # 数据在第一个代码块中
    from arch.unitroot import ADF
    adf = ADF(gdp)
    adf.trend = 'ct'
    print(adf.summary().as_text())
    cc9ee8d968c069eaadc04e489bc07bf2.png

    指定检验平稳类型为含截距项和时间趋势项平稳,p值为0.693>0.05,同样不能拒绝原假设,故差分前亦非趋势平稳。

    PP检验

    Phillips和Perron(1988) 提出一种非参数检验方法,主要是为了解决残差项中潜在的序列相关和异方差问题,其检验统计量的渐进分布和临界值与 ADF检验相同。同样出现较早,假设条件一样,用法相似,可作为ADF检验的补充。

    • 原假设 (存在单位根,时间序列是非平稳的)

    • 备择假设 (不存在单位根,时间序列是平稳的--不含截距项和趋势项平稳/含截距项平稳/含截距项和趋势平稳)

    同样构造一个趋势平稳序列,看下PP检验结果:

    import numpy as np
    from arch.unitroot import PhillipsPerron
    
    np.random.seed(123)
    
    y = np.random.standard_normal(size=100)
    for i in range(1, len(y)):
        y[i] = 1 + 0.1*i + y[i]
    
    
    pp = PhillipsPerron(y)
    print(pp.summary().as_text())
    
    pp = PhillipsPerron(y)
    pp.trend = 'ct'
    print(pp.summary().as_text())
    2e3dc4bcbee31301493bab9ef35bffdc.png

    不指定trend为默认检验是否为带截距项的平稳过程,检验结果p值为0.055>0.05,对应检验统计量为-2.825大于5%显著性水平下的临界值-2.89,所以5%显著性水平下不拒绝原假设,为非平稳序列;但是检验统计量小于10%显著性水平下的临界值-2.58,故在10%的显著性水平下可拒绝原假设,认为是平稳序列。

    指定trend=‘ct’为检验是否为带截距项和时间趋势项的平稳过程,检验结果p值为0.000<0.05,故为趋势平稳;其实检验统计量为-10.009小于1%显著性水平下的临界值-4.05,所以即便在1%显著性水平下也是平稳的。

    基于以上检验结果,可以判定序列是趋势平稳的。

    DF-GLS检验

    DF-GLS检验,是Elliott, Rothenberg, and  Stock 1996年提出的一种单位根检验方法,全称Dickey-Fuller Test with GLS Detredding,即“使用广义最小二乘法去除趋势的检验”,是目前最有功效的单位根检验。

    DF-GLS检验利用广义最小二乘法,首先对要检验的数据进行一次“准差分”,然后利用准差分的数据对原序列进行去除趋势处理,再利用ADF检验的模型形式对去除趋势后的数据进行单位根检验,但此时ADF检验模型中不再包含常数项或者时间趋势变量。

    • 原假设:序列存在单位根(时间序列是非平稳的)

    • 备择假设:序列不存在单位根(时间序列是平稳的或趋势平稳的)

    同样构造一个趋势平稳序列看下检验效果:

    import numpy as np
    from arch.unitroot import DFGLS
    
    np.random.seed(123)
    
    y = np.random.standard_normal(size=100)
    for i in range(1, len(y)):
        y[i] = 1 + 0.1*i + y[i]
    
    dfgls = DFGLS(y)
    print(dfgls.summary().as_text())
    
    dfgls = DFGLS(y)
    dfgls.trend = 'ct'
    print(dfgls.summary().as_text())
    f4ae6d74d3d1f8b58293d6b202732b39.png

    不指定trend情况下不能拒绝原假设,非平稳;指定trend='ct'时p值小于0.05,拒绝原假设,带截距项和时间趋势平稳。

    再来构造一个含单位根的非平稳序列看一下检验结果:

    import numpy as np
    from arch.unitroot import DFGLS
    
    np.random.seed(123)
    
    y = np.random.standard_normal(size=100)
    for i in range(1, len(y)):
        y[i] = 0.1 + y[i-1] + y[i]
    
    dfgls = DFGLS(y)
    print(dfgls.summary().as_text())
    
    dfgls = DFGLS(y)
    dfgls.trend = 'ct'
    print(dfgls.summary().as_text())
    3c7c39e2cf20bd430feeb7626258c5c2.png

    p值一个为0.645,一个为0.347,均大于0.05/0.1。指不指定检验类型,均未能通过检验,故该序列为非平稳序列。(DF-GLS检验trend只能指定为'c'或者'ct')

    KPSS检验

    另一个著名的单位根存在的检验是Kwiatkowski, Phillips, and Shin 1992年提出的KPSS检验。与以上三种检验方法相比,最大的不同点就是它的原假设是平稳序列或趋势平稳序列,而备择假设是存在单位根。

    • 原假设:序列不存在单位根(时间序列是平稳的或趋势平稳的)

    • 备择假设:序列存在单位根(时间序列是非平稳的)

    import numpy as np
    from arch.unitroot import KPSS
    
    np.random.seed(123)
    
    y = np.random.standard_normal(size=100)
    for i in range(1, len(y)):
        y[i] = 0.1 + y[i-1] + y[i]
    
    kpss = KPSS(y)
    print(kpss.summary().as_text())
    
    kpss = KPSS(y)
    kpss.trend = 'ct'
    print(kpss.summary().as_text())
    08d047200def0cfa5949e1b1d5b4c570.png

    注意KPSS检验中原假设为不存在单位根。默认检验趋势类型下p值为0.000,拒绝原假设,存在单位根,序列非平稳。指定trend='ct'后,p值0.115>0.05,不拒绝原假设,认为序列趋势平稳,检验错误。以上几种检验中均不能100%保证检验正确,PP检验可认为是ADF检验的补充,KPSS检验同样也可和其他检验一同使用,当均认为是平稳或趋势平稳时方判定为平稳。

    除以上检验方法外,还有Zivot-Andrews检验、Variance Ratio检验等检验方法。

    以上代码实现中使用的是Python中的arch包,另外还有一个常用的包statsmodels中也实现了单位根检验方法,结果是一样的。

    Method/ModelPackage/Module (function/class)
    Augmented Dickey-Fuller teststatsmodels.tsa.stattools (adfuller)
    arch.unitroot (ADF)
    Phillip-Perron testarch.unitroot (PhillipsPerron)
    Dickey-Fuller GLS Testarch.unitroot (DFGLS)
    KPSS teststatsmodels.tsa.stattools (kpss)
    arch.unitroot (KPSS)
    Zivot-Andrew teststatsmodels.tsa.stattools (zivot_andrews)
    arch.unitroot (ZivotAndrews)
    Variance Ratio testarch.unitroot (VarianceRatio)

    参考链接
    [1]  http://course.sdu.edu.cn/G2S/eWebEditor/uploadfile/20140525165255371.pdf
    [2]  https://max.book118.com/html/2016/0518/43276093.shtm
    [3]  https://doc.mbalib.com/view/ef1783f2fa1892f6ad016281ed743d78.html
    [4]  https://www.stata.com/manuals13/tsdfgls.pdf
    [5]  https://zhuanlan.zhihu.com/p/50553021
    [6]  https://arch.readthedocs.io/en/latest/index.html

    ---------End---------

    顺便给大家推荐下我的微信视频号「Python数据之道」,欢迎扫码关注。

    e046097669d75a147132673799429bdb.gif

    展开全文
  • 对于一个时间序列,它的一个最基本的特征就是它是否平稳序列。 把非平稳序列转化为平稳序列,一般常用的方法是做差分。 那么有两个问题来了: (1)一个时间序列是否平稳序列? (2)如果该序列非平稳,要把...
  • 数据平稳

    万次阅读 2015-05-02 15:48:17
    一、数据平稳性 李子奈曾指出,一些非平稳的经济时间序列往往表现出共同的变化趋势,而这些序列间本身不一定有直接的关联,此时,对这些数据进行回归,尽管有较高的R平方,但其结果是没有任何实际意义的。这种情况...
  • statistic) 0.055884 数据 0.459000 0.419000 0.387000 0.399000 0.378000 0.407000 0.366000 0.358000 结果: ADF Test Statistic -1.503478 1% Critical Value* -5.2459 5% Critical Value -3.5507 10% ...
  • 1. 从感官上如何判断? 从长期看没有可预测的运行模式,序列平稳也就是,随着时间的变化,序列没有较明确的运行模式,其未来大致的取值难以预测。 如果一个时间序列含有以下任一部分都可判定为非平稳的:趋势性部分...
  • ADF检验数据平稳

    千次阅读 2022-05-08 16:36:20
    在使用很多时间序列模型的时候,如 ARMA、ARIMA,都会要求时间序列是平稳的,所以一般在研究一段时间序列的时候,第一步都需要进行平稳性检验,除了用肉眼检测的方法,另外比较常用的严格的统计检验方法就是ADF检验...
  • 小波变换 代码实现

    2018-08-19 15:07:55
    小波变换(wavelet transform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一...
  • 1、 时间序列 取自某一个随机过程,如果此随机过程的随机特征不随时间变化,则我们称过程是平稳的;假如该随机过程的随机特征随时间变化,则称过程是非平稳的。2、 宽平稳时间序列的定义:设时间序列 ,对于任意的 ,...
  • pandas数据判断是否为NaN值

    千次阅读 2020-12-19 06:49:48
    {"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,...
  • Python数据分析:ADF平稳性假设检验

    千次阅读 2022-03-07 22:45:44
    【小白从小学Python、C、Java】 【Python全国计算机等级考试】 【Python数据分析考试必会题】 ● 标题与摘要 ...1.在数据分析中,ADF检验一般是用来检验给定的时间序列是否平稳的,有些模型对于时间序
  • 时间序列分析(一) 如何判断序列是否平稳

    万次阅读 多人点赞 2012-05-11 09:07:17
    时间序列分析(一) 如何判断序列是否平稳 序列平稳平稳,一般采用两种方法: 第一种:看图法 图是指时序图,例如(eviews画滴):   分析:什么样的图不平稳,先说下什么是平稳平稳就是围绕着一个...
  • 时间序列数据平稳性检验

    千次阅读 2021-10-07 17:15:47
    目录时间序列预测时间序列的平稳平稳平稳三级目录 时间序列预测 按照时间的顺序把随机事件变化发展的过程记录下来就构成了一个时间序列。 x1,x2,x3,x4,...,xt 对时间序列进行观察、研究,找寻他变化发展的规律...
  • 由于平稳信号和非平稳信号的性质差别显着,因此在处理信号之前先行判断它的平稳性就显得尤为重要。虽然信号平稳性的定义十分明确,但是实际判断过程却是复杂的,例如观察尺度对信号平稳判断就有很大的影响。  这...
  • 平稳信号 小波变换

    千次阅读 2016-07-28 12:55:37
    1:什么是平稳信号 首先必须了解什么叫做信号的平稳性,这个概念是诸多信号处理领域中的重要概念。如果信号 的频率成分不随时间的变换而发生改变,那么该信号就被称为平稳信号。换言之,平稳信号的频率成分是稳定的,...
  • Python时间序列--数据平稳(四)

    千次阅读 2020-04-27 15:09:06
    平稳性是用来描述时间序列数据统计性态的特有术语。 2.时间序列平稳性的理解 凭以推测经济系统(或其相关变量)在未来可能出现的状况,亦即预测经济系统(或其相关变量)的走势,是我们建立经济计量模型的主要目的。...
  • 我们所感兴趣的是 系数矩阵它可以...对变量之间协整关系的检验可以通过计算 系数矩阵的秩及特征值来判断将 系数矩阵的特征值按照从大到小的顺序排列即 如果变量间不存在协整关系即长期关系则的秩就为零 * 精品PPT可编
  • 一、平稳性检验 (1)绘制时序图 实验步骤:在EVIEWS中建立工作文件,在“Workfile structure type”栏中选择“Date-regular frequency”,在右边的“Date specification”中输入起始时间2000年1月,终止时间2003年...
  • 做时间序列分析,之前需要做两个准备工作,即检查序列是否平稳的,如果是平稳的,还要检查是否是白噪声。我们一个一个来讲。使用数据我们用一个例子来说明:数据集是49 - 98 北京最高气温,数据如下:{{1949., ...
  • 时间序列的平稳性检验方法汇总篇

    千次阅读 2021-10-10 19:42:15
    时间序列的平稳性检验方法汇总。主要检验方法为:DF检验、ADF检验、PP检验、DF-GLS检验、KPSS检验等,含代码示例,并增加了预备知识:时间序列的确定趋势、随机趋势、d阶单整及单位根概念的解释。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,710
精华内容 6,684
关键字:

判断数据是否平稳