• numpy股票相关性分析与协方差


    基础知识-协方差

    协方差其意义:

    度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为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()

  • 相关阅读:
    C#利用System.Net发送邮件(带 抄送、密送、附件、html格式的邮件)
    ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
    在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
    初识Docker和Windows Server容器
    windows 7 docker oralce安装和使用
    javaweb学习总结(三十)——EL函数库
    javaweb学习总结(二十九)——EL表达式
    javaweb学习总结(二十八)——JSTL标签库之核心标签
    javaweb学习总结(二十七)——jsp简单标签开发案例和打包
    在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
  • 原文地址:https://www.cnblogs.com/draven123/p/11386363.html
Copyright © 2020-2023  润新知