该方法是用于计算两个指标的时序关系的,比如A指标领先或者滞后或者一致于B指标。公式原理如下:
x,y分别是两个时间序列,y为基准指标,l为超前或滞后期, 被称为时差或延迟数 (l=0时表示不移动, 表示同步;若表示超前, 则对应的l﹤0;若表示滞后, 则对应的l﹥0) ;n为所取数据的个数;MB表示最大延迟数。 取不同的l值, 分别代表不同的时差, 并计算时差相关系数Rl, 取绝对值最大的R'l作为时差相关系数。时差相关系数对应的时差数l的正负, 可判断被选指标与基准指标先行、同步或滞后的关系。它反映了被选择指标与基准指标的波动最接近, 即为时差相关系数。只有超前相关性较强的指标才能被选为预测性指标。
关于这个时差相关分析方法,在网上查阅资料时发现讲理论的很多,但具体实现的比较少,有的说这个方法封装好了在一些软件中,我因不熟悉这些软件,所以尝试着自己实现了下,顺便分享给大家,如有不对之处请提出,十分感谢啦。了解原理后,具体python实现如下:
def corr(x,y,n,tl):#计算时间差相关系数
d=asum=bsum=csum=0.0
lmax=tl
lmin=lmax*(-1)
rel=[]
timel=10000
#a=b=c=0
for l in range(lmin,lmax+1):
xmeans=np.mean(x)
#print(xmeans)
ymeans=np.mean(y)
if l>=0:#l为正数时,x由0~n-l,y由l~n
for i in range(l,n):
a=(x[i-l]-xmeans)*(y[i]-ymeans)
b=pow((x[i-l]-xmeans),2)
c=pow((y[i]-ymeans),2)
asum=a+asum
bsum=b+bsum
csum=c+csum
else:#l为负数时,y由0~n-l,x由l~n
ll=l*(-1)
for i in range(ll,n):
a=(x[i]-xmeans)*(y[i-ll]-ymeans)
b=pow((x[i]-xmeans),2)
c=pow((y[i-ll]-ymeans),2)
asum=a+asum
bsum=b+bsum
csum=c+csum
d=np.sqrt(bsum*csum)
if asum==d==0:
r=0
else:
r=asum/d
rl=abs(r)
#print(rl)
#print(l)
rel.append(rl)#将结果存入rel
if rl==max(rel):
timel=l #记录相关系数最大时的时间差
#print("最大相关系数:",max(rel))#输出最大相关系数
#print("此时的l:",timel)#输出相关系数最大时的时间差
return max(rel),timel