协整
如果两个时间序列x(t)和y(t)的线性组合是稳态的,那么就称这两个序列具有共整合性或协整性。方程式y(t)-a x(t)应该是稳态的。
考虑醉汉牵着一条狗的情形,相关性可以反映出他们是否在同一个方向上前进。而协整性反映的则是一段时间人与狗之间的距离。这个距离从长期来看它始终介于0和绳长之间。
下面我们来用随机生成的时间序列和真实的的数据来展示协整关系,同时我们可以用ADF(Augmented Dickey-Fuller test)来确定时间序列的协整关系。
"XU YONG KANG"
#用ADF检验确定时间序列的协整关系
import numpy as np
import statsmodels.api as sm
import pandas
import numpy
import statsmodels.tsa.stattools as ts
#定义用来计算ADF统计量的函数
def calc_adf(x,y):
result=sm.OLS(x,y).fit()
return ts.adfuller(result.resid)
#将太阳黑子数据载入Numpy数组
data_loader=sm.datasets.sunspots.load_pandas()
data=data_loader.data.values
N=len(data)
#计算正弦值
t=np.linspace(-2*np.pi,2*np.pi,N)
sine=np.sin(np.sin(t))
#求正弦值与其自身的协整关系
print('Self ADF',calc_adf(sine,sine))
#输出的第一个值是对ADF的度量,第二个为P值,然后是时间延迟与样本量,最后是个字典,给出了这个样本量的t分布
#给正弦波添加噪音
noise=np.random.normal(0,0.01,N)
#显示添加噪音后协整关系
print('ADF since with noise',calc_adf(sine,sine+noise))
#发现p值下降,ADF的指标值低于字典中的所有临界值,拒绝协整
#再生成一个更大的余弦波并混入之前的噪音
cosine=100*np.cos(t)+10
print('ADF sinne vs cosine',calc_adf(sine,cosine+noise))
#正弦与之前太阳黑子数据的协整
print('Sine vs sunspots',calc_adf(sine,data))
我们可以发现添加噪音后的结果如下
ADF since with noise (-19.743704610270704, 0.0, 0, 308, {'1%': -3.45176116018037, '5%': -2.870970093607691, '10%': -2.571794416006072}, -1821.6759724036788)
发现p值下降,ADF的指标值低于字典中的所有临界值,拒绝协整。
对比结果,我们会发现除了正弦与正弦序列是接受协整的,其他序列对都拒绝协整。