当前位置: 首页 > 科技观察

用Python测试时间序列的平稳性

时间:2023-03-18 18:28:43 科技观察

在做时间序列分析的时候,我们经常要测试时间序列的平稳性,而我们常用的软件是SPSS或者SAS,但其实python也可以用来进行平稳性测试,而且效果很好,今天就来讲解下如何用python做时间序列的平稳性检验。首先简单介绍一下平稳性检验的相关概念。图1平稳性序列的相关公式时间序列的平稳性可以分为严格平稳性和宽平稳性。设{Xt}为时间序列,对任意正整数m,取任意t1,t2,t3,...,tm∈T,对任意整数τ,如果满足图1中的公式(1),则有称为时间序列{Xt}是一个严格平稳的时间序列。widestationary的定义是如果{Xt}满足以下三个条件:(1)如果t∈T是随机选择的,E(Xt·Xt)<∞;(2)如果t∈T是随机选择的,EXt=μ,μ是一个常数;(3)取任意t,s,k∈T,k+s-t∈T,若γ(t,s)=γ(k,k+s-t),则称{Xt}为宽平稳时间序列。由于我们在实际应用中很难得到随机序列的分布函数,因此很少使用严格稳定性,主要使用宽平稳时间序列。了解了平稳性的基本概念之后,我们来谈谈平稳时间序列的含义。平稳时间序列的分析也遵循数理统计的基本原理,即利用样本信息推断整体信息。这就要求分析的随机变量越少越好(即数据的维度越小越好),每个变量获取的样本信息越多越好(即数据的观测值越大),越好),因为随机变量越少,分析过程越简单,样本量越大,分析结果就越可靠。然而,时间序列的数据结构有其特殊性。其在任意时刻t的序列值Xt是一个随机变量,由于时间的不可重复性,该变量在任意时刻只能获得唯一的样本观测值。由于样本信息太少,这种数据结构在没有其他辅助信息的情况下通常无法分析,但序列平稳性可以有效解决这个问题。在平稳序列中,序列的均值等于一个常数,这意味着原来包含多个随机变量的均值序列{μt,t∈T}变成了常数序列{μ,t∈T}。本来,每个随机变量μt的均值只能由唯一的一个样本观测值xt来估计。此时,由于μt=μ??,各样本观测值xt成为常数均值的样本观测值,如图1中公式(2)所示。这大大减少了随机变量的数量,增加了待估计参数的样本量,也降低了时间序列分析的难度。了解了时间序列的平稳性之后,我们来详细讲解下如何使用python进行测试。使用python检验平稳性主要有三种方法,分别是时序图检验、自相关图检验和构造统计检验。首先说一下时序图的检查。时序图是普通的时间序列图,即以时间为横轴,以测试的观测值为纵轴。这里我举3个例子,因为时序图太简单了,所以我这里直接用Excel作为时序图,python也可以,但是没有Excel那么简单。第一个例子是1964-1999年中国纱线年产量时间序列(数据来自北京市统计局)。数据如图2所示,时序图如图3所示。从图3中可以清楚地看出,我国每年的纱线生产序列有明显的增加趋势,所以一定不是平稳序列。图2.纱线生产数据截图图3.纱线生产时序图第二个例子是1962年1月到1975年12月每头牛平均月产奶量的时间序列(数据来自网站http://census-info.us),数据如图4所示,时序图如图5所示。从图5可以看出,每头奶牛的月平均产奶量具有以年为周期的规律周期性,并且有明显的上升趋势年复一年,所以这个序列一定不是平稳序列。图4.奶牛生产数据截图图5.奶牛生产时序图第三个例子是1949-1998年北京市年最高气温序列(北京市统计局数据)。数据如图6,时序图如图7所示。从图7可以看出,北京年最高气温总是在37度左右随机波动,没有明显的趋势和周期,基本可以看作是一个平稳序列,但仍需要用自相关图进一步验证。图6.北京最高气温数据截图图7.北京最高气温时间序列图从上面的例子可以看出,时间序列图只能粗略判断一个时间序列是否为平稳序列,我们可以利用自相关图进一步检验。绘制自相关图需要用到python,下面是相关代码。importpandasaspdimportmatplotlib.pyplotaspltfromstatsmodels.graphics.tsaplotsimportplot_acftemperature=r'C:\Users\北京温度.xls'milk=r'C:\Users\dairycowproduction.xlsx'yarn=r'C:\Users\yarnproduction.xls'data_tem=pd.read_excel(温度,parse_date=True)data_milk=pd.read_excel(milk,parse_date=True)data_yarn=pd.read_excel(yarn,parse_date=True)plt.rcParams.update({'figure.figsize':(8,6),'figure.dpi':100})#设置图片大小plot_acf(data_tem.Tem)#生成自相关图plot_acf(data_milk.milk_yield)plot_acf(data_yarn.yarn_yield)plt.show()用于绘制自相关图最重要的是statsmodels中的plot_acf方法。这种方法非常简单,只需要直接输入数据即可。但是,如果数据是一维的,生成的三个图分别如图8、图9、图10所示。图8.纱线产量自相关图图9.奶牛产量自相关图平稳序列会缓慢衰减到零,这是利用自相关图判断平稳性的标准。让我们来看看这三个自相关图。图8是纱线年产量的自相关图。速度比较慢。在一个较长的滞后周期内,自相关系数总是先正后负,呈三角对称,是具有单调趋势的非平稳序列自相关图的典型形式。让我们再看看图9。这是每头奶牛月产奶量的自相关图。图中的自相关系数长期位于零轴一侧,是单调趋势序列的典型特征,也表现出明显的正弦波动。这是具有周期性变化的非平稳序列的典型特征。最后,请看下面的图10。这是北京年最高气温的自相关图。从图中可以看出,这个数列的自相关系数一直比较小。可以认为该序列一直围绕零轴波动,这是一个相对随机且稳定的序列通常具有的自相关图。最后说一下ADF方法。前两种方法都是图。图形更直观,但不够精确,而ADF方法直接通过假设检验来验证平稳性。ADF(全称AugmentedDickey-Fuller)是一种单位根检验方法。单位根检验方法有很多种,ADF法是比较常用的一种。和普通的假设检验没有太大区别,都是列出原假设。和备择假设。ADF的零假设(H0)和备择假设(H1)如下。H0:有单位根,属于非平稳序列。H1:没有单位根,属于平稳序列,表明该序列不具有时间相关结构。下面用python代码来解释一下ADF的用法。fromstatsmodels.tsa.stattoolsimportadfulleryarn_result=adfuller(data_yarn.yarn_yield)#生成adf测试结果milk_result=adfuller(data_milk.milk_yield)tem_result=adfuller(data_tem.Tem)print('TheADFStatisticofyarnyield:%f'%yarn_result'[0])print(Thepvalueofyarnyield:%f'%yarn_result[1])print('TheADFStatisticofmilkyield:%f'%milk_result[0])print('TheADFStatisticofBeijingtemperature:%f'%tem_result[0])print('ThepvalueofBeijingtemperature:%f'%tem_result[1])这里我们使用了statsmodels中的adfuller方法,使用起来比较简单,直接输入数据即可,但是返回的值比较多,返回的结果有一共7个值,分别是adf、pvalue、usedlag、nobs、criticalvalues、icbest和resstore。这7个值的含义可以参考官方文档。我们在这里使用前两个,即adf和pvalue。adf是ADF方法的测试结果,pvalue是我们常用的p值。我们的结果如图11所示。图11.ADF测试结果在图11中,我们可以看到纱线产量、奶牛产量、北京气温的adf值分别为-0.016384、-1.303812、-8.294675。这个值越负,理论上越可以拒绝零假设,但是我们这里不用adf来判断,而是用p值。这三个p值分别是0.957156、0.627427和0.000000。以常用的判断标准值0.05作为参考,前两个p值远大于0.05,说明支持原假设,说明纱线产量和奶牛产量是非平稳序列,而北京气温序列??的p值为零,表明拒绝零假设,说明该序列是平稳序列。我们可以看到使用adf方法得到的结果和前面两种方法是一致的。本文更详细地介绍了三种判断时间序列平稳性的方法。这三种方法在实际应用中经常使用。当然,还有很多其他的判断平稳性的方法。如有需要,您也可以搜索相关资料。