如何制作免费网站,html网页模板网站模板下载,好看的单页面网站模板免费下载,颇有名气的网站建设专家时间序列平稳性检验方法#xff0c;可分为三类#xff1a; 图形分析方法 简单统计方法 假设检验方法
一、图形分析方法
可视化数据
可视化数据即绘制时间序列的折线图#xff0c;看曲线是否围绕某一数值上下波动#xff08;判断均值是否稳定#xff09;#xff0c;看…时间序列平稳性检验方法可分为三类 图形分析方法 简单统计方法 假设检验方法
一、图形分析方法
可视化数据
可视化数据即绘制时间序列的折线图看曲线是否围绕某一数值上下波动判断均值是否稳定看曲线上下波动幅度变化大不大判断方差是否稳定看曲线不同时间段波动的频率[~紧凑程度]变化大不大判断协方差是否稳定以此来判断时间序列是否是平稳的。
以下绘制几张图大家来直观判断一下哪些是平稳的哪些是非平稳的。
import numpy as np
import pandas as pd
import akshare as ak
from matplotlib import pyplot as pltnp.random.seed(123)# -------------- 准备数据 --------------
# 白噪声
white_noise np.random.standard_normal(size1000)# 随机游走
x np.random.standard_normal(size1000)
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() a. 白噪声曲线围绕0值上下波动波动幅度前后、上下一致为平稳序列。 b. 随机游走曲线无确定趋势均值、方差波动较大非平稳序列。 c. GDP数据趋势上升均值随时间增加非平稳序列。 d. GDP季节差分后数据曲线大致在一条水平线上上下波动波动幅度前后变化较小可认为是平稳的。
可视化统计特征
可视化统计特征是指绘制时间序列的自相关图和偏自相关图根据自相关图的表现来判断序列是否平稳。
自相关也叫序列相关是一个信号与自身不同时间点的相关度或者说与自身的延迟拷贝--或滞后--的相关性是延迟的函数。不同滞后期得到的自相关系数叫自相关图。
这里有一个默认假设即序列是平稳的平稳序列的自相关性只和时间间隔k有关不随时间t的变化而变化因而可以称自相关函数是延迟k的函数
平稳序列通常具有短期相关性对于平稳的时间序列自相关系数往往会迅速退化到零滞后期越短相关性越高滞后期为0时相关性为1而对于非平稳的数据退化会发生得更慢或存在先减后增或者周期性的波动等变动。
import statsmodels.api as sm
X [2,3,4,3,8,7]
print(sm.tsa.stattools.acf(X, nlags1, adjustedTrue)) [1, 0.3559322] 其中第一个元素为滞后期为0时的自相关性第二个元素为滞后期为1时的自相关性 根据ACF求出滞后k自相关系数时实际上得到并不是X(t)与X(t-k)之间单纯的相关关系。 因为X(t)同时还会受到中间k-1个随机变量X(t-1)、X(t-2)、……、X(t-k1)的影响而这k-1个随机变量又都和X(t-k)具有相关关系所以自相关系数里面实际掺杂了其他变量对X(t)与X(t-k)的影响。 在剔除了中间k-1个随机变量X(t-1)、X(t-2)、……、X(t-k1)的干扰之后X(t-k)对X(t)影响的相关程度叫偏自相关系数。不同滞后期得到的偏自相关系数叫偏自相关图。偏自相关系数计算较复杂后期再来具体介绍 下面我们就来看看几个实战案例上图中的数据再来看一下它们的自相关图和偏自相关图
# 数据生成过程在第一个代码块中
from statsmodels.graphics.tsaplots import plot_acf, plot_pacffig, ax plt.subplots(4, 2)
fig.subplots_adjust(hspace0.5)plot_acf(white_noise, axax[0][0])
ax[0][0].set_title(ACF(white_noise))
plot_pacf(white_noise, axax[0][1])
ax[0][1].set_title(PACF(white_noise))plot_acf(random_walk, axax[1][0])
ax[1][0].set_title(ACF(random_walk))
plot_pacf(random_walk, axax[1][1])
ax[1][1].set_title(PACF(random_walk))plot_acf(gdp, axax[2][0])
ax[2][0].set_title(ACF(gdp))
plot_pacf(gdp, axax[2][1])
ax[2][1].set_title(PACF(gdp))plot_acf(gdp_diff, axax[3][0])
ax[3][0].set_title(ACF(gdp_diff))
plot_pacf(gdp_diff, axax[3][1])
ax[3][1].set_title(PACF(gdp_diff))plt.show() (1) 白噪声的自相关系数很快就衰减到0附近是明显的平稳序列。滞后期为0时自相关系数和偏自相关系数其实就是序列自己和自己的相关性故为1滞后期为1时自相关系数为0表示白噪声无自相关性。 (2) 随机游走自相关系数下降非常缓慢故为非平稳序列另从偏自相关系数中可以看到随机游走只和前一项有关。 (3) GDP数据的自相关图中也可以看到存在一定的周期性滞后4、8、12等自相关系数较大下降较慢差分后下降多一些起到一定效果认为差分后序列是平稳的。同可视化数据一样直观判断带有较强主观性但能让我们对数据有更直观的认识。
二、简单统计方法
计算统计量的方法只是作为一个补充了解即可。宽平稳中有两个条件是均值不变和方差不变可视化数据中我们可以直观看出来其实还可以具体计算一下看看。
很有意思的逻辑直接将序列前后拆分成2个序列分别计算这2个序列的均值、方差对比看是否差异明显。其实很多时序异常检验也是基于这种思想前后分布一致则无异常否则存在异常或突变
我们来算白噪声和随机游走序列不同时间段的均值、方差
import numpy as npnp.random.seed(123)white_noise np.random.standard_normal(size1000)x np.random.standard_normal(size1000)
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 variance11.006416, variance20.996734 random walk sample: mean15.506570, mean28.490356 variance153.911003, variance2126.866920 白噪声序列均值和方差略有不同但大致在同一水平线上 随机游走序列的均值和方差差异就比较大因此为非平稳序列。
三、假设检验方法
平稳性的假设检验方法当前主流为单位根检验检验序列中是否存在单位根若存在则为非平稳序列不存在则为平稳序列。
在介绍检验方法之前有必要了解一些相关补充知识这样对后面的检验方法理解上就会更清晰一些。
什么是单位根
import numpy as np
from matplotlib import pyplot as pltnp.random.seed(123)def simulate(beta):y np.random.standard_normal(size1000)for i in range(1, len(y)):y[i] beta * y[i - 1] y[i]return yplt.figure(figsize(20, 4))
for i, beta in enumerate([0.9, 1.0, 1.1]):plt.subplot(1, 3, i1)plt.plot(simulate(beta))plt.title(beta: {}.format(beta))
plt.show() 检验方法
DF检验
ADF检验Augmented Dickey-Fuller Testing是最常用的单位根检验方法之一通过检验序列是否存在单位根来判断序列是否是平稳的。ADF检验是DF检验的增强版在介绍ADF之前我们先来看一下DF检验。
迪基Dickey和弗勒Fuller1979年基于非平稳序列的基本特征将其大致归为三类并提出DF检验
(1) 当序列基本走势呈现无规则上升或下降并反复时将其归为无漂移项自回归过程 (2) 当序列基本走势呈现明显的随时间递增或递减且趋势并不太陡峭时将其归为带漂移项自回归过程 (3) 当序列基本走势随时间快速递增时则将其归为带趋势项回归过程。 若检验统计量大于临界值p值大于显著性水平 不能拒绝原假设序列是非平稳的 若检验统计量小于临界值p值小于显著性水平 拒绝原假设认为序列是平稳的。 ADF检验
DF的检验公式为一阶自回归过程为了能适用于高阶自回归过程的平稳性检验迪基等1984年对DF检验进行了一定的修正引入了更高阶的滞后项ADF的检验回归式修正为 import numpy as np
from matplotlib import pyplot as pltnp.random.seed(123)y np.random.standard_normal(size100)
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() 检验是否平稳
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()) 说明 arch包中ADF检验可指定trend为 n不含截距项和时间趋势项 c含截距项 ct含截距项和时间趋势项 ctt含截距项和时间趋势项和二次型时间趋势项 分别对应不同平稳类型的检验。滞后期lags默认为AIC最小 以上第一个文本输出中不指定trend默认为检验是否含截距项平稳显著性水平p0.8360.05不拒绝原假设非平稳 以上第二个文本输出中指定trend为检验是否含截距项和时间趋势项平稳显著性水平p0.0000.05拒绝原假设故为趋势项平稳。
我们再来看看GDP季节差分前后数据是否为平稳的
# 数据在第一个代码块中
from arch.unitroot import ADF
adf ADF(gdp)
print(adf.summary().as_text())adf ADF(gdp_diff)
print(adf.summary().as_text()) 可以看到差分前p值为0.9980.05不能拒绝原假设数据非平稳差分后p值为0.0030.05故在5%的显著性水平下可拒绝原假设差分后的数据是平稳的。
# 数据在第一个代码块中
from arch.unitroot import ADF
adf ADF(gdp)
adf.trend ct
print(adf.summary().as_text()) 指定检验平稳类型为含截距项和时间趋势项平稳p值为0.6930.05同样不能拒绝原假设故差分前亦非趋势平稳。
PP检验
Phillips和Perron(1988) 提出一种非参数检验方法主要是为了解决残差项中潜在的序列相关和异方差问题其检验统计量的渐进分布和临界值与 ADF检验相同。同样出现较早假设条件一样用法相似可作为ADF检验的补充。
同样构造一个趋势平稳序列看下PP检验结果
import numpy as np
from arch.unitroot import PhillipsPerronnp.random.seed(123)y np.random.standard_normal(size100)
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()) 不指定trend为默认检验是否为带截距项的平稳过程检验结果p值为0.0550.05对应检验统计量为-2.825大于5%显著性水平下的临界值-2.89所以5%显著性水平下不拒绝原假设为非平稳序列但是检验统计量小于10%显著性水平下的临界值-2.58故在10%的显著性水平下可拒绝原假设认为是平稳序列。 指定trend‘ct’为检验是否为带截距项和时间趋势项的平稳过程检验结果p值为0.0000.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 DFGLSnp.random.seed(123)y np.random.standard_normal(size100)
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()) 不指定trend情况下不能拒绝原假设非平稳指定trendct时p值小于0.05拒绝原假设带截距项和时间趋势平稳。
再来构造一个含单位根的非平稳序列看一下检验结果
import numpy as np
from arch.unitroot import DFGLSnp.random.seed(123)y np.random.standard_normal(size100)
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()) 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 KPSSnp.random.seed(123)y np.random.standard_normal(size100)
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()) 注意KPSS检验中原假设为不存在单位根。默认检验趋势类型下p值为0.000拒绝原假设存在单位根序列非平稳。指定trendct后p值0.1150.05不拒绝原假设认为序列趋势平稳检验错误。以上几种检验中均不能100%保证检验正确PP检验可认为是ADF检验的补充KPSS检验同样也可和其他检验一同使用当均认为是平稳或趋势平稳时方判定为平稳。
除以上检验方法外还有Zivot-Andrews检验、Variance Ratio检验等检验方法。
以上代码实现中使用的是Python中的arch包另外还有一个常用的包statsmodels中也实现了单位根检验方法结果是一样的。 郑重感谢Python数据科学 本人接下来进行金融统计需要转向python需要教程此公众号对我用处极大。