时差相关公式python实现

该方法是用于计算两个指标的时序关系的,比如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

猜你喜欢

转载自blog.csdn.net/Hedy5566/article/details/86582611