numpy股票相关性分析

心已入冬 提交于 2019-11-28 01:43:37

基础知识-协方差

协方差其意义:

度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”。


如果正相关,这个计算公式,每个样本对(Xi, Yi), 每个求和项大部分都是正数,即两个同方向偏离各自均值,而不同时偏离的也有,但是少,这样当样本多时,总和结果为正。下面这个图就很直观。下面转载自:http://blog.csdn.net/wuhzossibility/article/details/8087863

在概率论中,两个随机变量 X 与 Y 之间相互关系,大致有下列3种情况:

当 X, Y 的联合分布像上图那样时,我们可以看出,大致上有: X 越大  Y 也越大, X 越小  Y 也越小,这种情况,我们称为“正相关”。



当X, Y 的联合分布像上图那样时,我们可以看出,大致上有:X 越大Y 反而越小,X 越小 Y 反而越大,这种情况,我们称为“负相关”。

当X, Y  的联合分布像上图那样时,我们可以看出:既不是X  越大Y 也越大,也不是 X 越大 Y 反而越小,这种情况我们称为“不相关”。

怎样将这3种相关情况,用一个简单的数字表达出来呢?

在图中的区域(1)中,有 X>EX ,Y-EY>0 ,所以(X-EX)(Y-EY)>0;

在图中的区域(2)中,有 X<EX ,Y-EY>0 ,所以(X-EX)(Y-EY)<0;

在图中的区域(3)中,有 X<EX ,Y-EY<0 ,所以(X-EX)(Y-EY)>0;

在图中的区域(4)中,有 X>EX ,Y-EY<0 ,所以(X-EX)(Y-EY)<0。

当X 与Y 正相关时,它们的(联合)分布大部分在区域(1)和(3)中,小部分在区域(2)和(4)中,所以平均来说,有E(X-EX)(Y-EY)>0 。(可以从一维 x~N(μ,σ)的大部分的分布(-3σ-3σ)99.7%的区间取值来理解,当符合条件的X和Y区域都在这(1)(3)区间,X-EX和Y-EY的数值同大于0和小于0的居多,其乘积大于0(是一个三维立体型吧,会根据概率密度p(x)来决定该区域数值,),且其对应数值相乘(X-EX)(Y-EY)越大偏离越大)

当 X与 Y负相关时,它们的分布大部分在区域(2)和(4)中,小部分在区域(1)和(3)中,所以平均来说,有(X-EX)(Y-EY)<0 。

当 X与 Y不相关时,它们在区域(1)和(3)中的分布,与在区域(2)和(4)中的分布几乎一样多,所以平均来说,有(X-EX)(Y-EY)=0 。
所以,我们可以定义一个表示X, Y 相互关系的数字特征,也就是协方差
cov(X, Y) = E(X-EX)(Y-EY)
当 cov(X, Y)>0时,表明 X与Y 正相关;

当 cov(X, Y)<0时,表明X与Y负相关;

当 cov(X, Y)=0时,表明X与Y不相关。

这就是协方差的意义。


另外补充:

1.

求特征协方差矩阵,如果数据是3维,那么协方差矩阵是


这里只有x和y,求解得

     对角线上分别是x和y的方差,非对角线上是协方差。协方差大于0表示x和y若有一个增,另一个也增;小于0表示一个增,一个减;协方差为0时,两者独立。协方差绝对值越大,两者对彼此的影响越大,反之越小。

原文链接:https://blog.csdn.net/GoodShot/article/details/79940438

 

相关系数

  相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。简单相关系数:又叫相关系数或线性相关系数,一般用字母r 表示,用来度量两个变量间的线性关系。

  

  就是用X、Y的协方差除以X的标准差和Y的标准差。 所以,相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。

  既然是一种特殊的协方差,那它:

  1、也可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。

  2、由于它是标准化后的协方差,因此更重要的特性来了:它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。

 

numpy求两个向量的协方差与相关系数矩阵

import numpy as np  import matplotlib.pyplot as plt    bhp = np.loadtxt('BHP.csv', delimiter=',', usecols=(6,), unpack=True)  print(bhp)  '''  [ 93.72  95.64  94.56  93.3   93.93  92.39  92.11  92.36  91.76  93.91    94.6   93.27  94.43  96.02  95.76  94.47  94.34  92.22  88.31  89.59    89.02  86.95  84.88  87.38  88.56  89.59  88.71  90.02  91.26  90.67]  '''    bhp_returns = np.diff(bhp) / bhp[:-1]  # bhp中相邻两项之间的差除以被减数  vale = np.loadtxt('VALE.csv', delimiter=',', usecols=(6,), unpack=True)  print(vale)  '''  [ 34.37  35.13  35.14  35.31  35.57  35.03  33.44  33.94  34.21  34.27    34.23  33.76  34.32  34.87  34.5   33.23  33.29  32.88  31.91  32.17    32.44  31.91  31.04  31.51  32.14  32.42  32.25  32.7   32.36  32.34]  '''  vale_returns = np.diff(vale) / vale[:-1]  # vale中相邻两项之间的差除以被减数    covariance = np.cov(bhp_returns, vale_returns)  # 使用np.cov计算股票收益率的协方差矩阵  print(covariance)  '''  [[ 0.00028179  0.00019766]   [ 0.00019766  0.00030123]]  '''    print(covariance.diagonal())  # [ 0.00028179  0.00030123]  # 使用diagonal函数查看对角线上的元素    print(covariance.trace())  # 0.00058302354992  # 使用trace函数计算矩阵的迹,即对角线上元素之和    # 两个向量的相关系数被定义为协方差除以各自的标准差的乘积  # 相关系数的取值范围在-1到1之间  # 一组数值与自身的相关系数为1  print(covariance / (bhp_returns.std() * vale_returns.std()))  '''  [[ 1.00173366  0.70264666]   [ 0.70264666  1.0708476 ]]  '''    print(covariance / (bhp_returns.std(ddof=1) * vale_returns.std(ddof=1)))  '''  [[ 0.96719112  0.67841747]   [ 0.67841747  1.03392182]]  '''    # 使用corrcoef函数计算两个向量的相关系数  print(np.corrcoef(bhp_returns, vale_returns))  '''  [[ 1.          0.67841747]   [ 0.67841747  1.        ]]  '''  # 对角线上的元素即BHP和VALE与自身的相关系数,均为1    # 如果两个股票的差值偏离了平均差值2倍于标准差的距离,则认为两只股票不同步  difference = bhp - vale  avg = np.mean(difference)  dev = np.std(difference)    print(np.abs(difference[-1] - avg) > 2 * dev)  # False    t = np.arange(len(bhp_returns))  plt.plot(t, bhp_returns, lw=1)  plt.plot(t, vale_returns, lw=2)  plt.show()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!