协方差矩阵

来源:互联网 发布:apache php 网站发布 编辑:程序博客网 时间:2024/04/30 15:14

在统计学与概率论中,协方差矩阵的每个元素是各个向量元素之间的协方差,是从标量随机变量到高维度随机向量的自然推广。


学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差。首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧,一带而过。

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。

为什么需要协方差?

上面几个统计量看似已经描述的差不多了,但我们应该注意到,标准差和方差一般是用来描述一维数据的,但现实生活我们常常遇到含有多维数据的数据集,最简单的大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

 

来度量各个维度偏离其均值的程度,协方差可以这么来定义:

 

协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,嘿嘿,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?如果为0,也是就是统计上说的“相互独立”。

从协方差的定义上我们也可以看出一些显而易见的性质,如:


协方差多了就是协方差矩阵

上一节提到的猥琐和受欢迎的问题是典型二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算 n! / ((n-2)!*2) 个协方差,那自然而然的我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:

 

这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为

 

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

Matlab协方差实战

上面涉及的内容都比较容易,协方差矩阵似乎也很简单,但实战起来就很容易让人迷茫了。必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。这个我将结合下面的例子说明,以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数(蓝色部分为Matlab代码)。

首先,随机产生一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。

mysample = fix(rand(10,3)*50)

根据公式,计算协方差需要计算均值,那是按行计算均值还是按列呢,我一开始就老是困扰这个问题。前面我们也特别强调了,协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:

>> dim1 = mysample(:,1);>> dim2 = mysample(:,2);>> dim3 = mysample(:,3);

计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:

>> sum((dim1 - mean(dim1)) .* (dim2 - mean(dim2))) / (size(mysample, 1) - 1)  %得到 -147.0667>> sum((dim1 - mean(dim1)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1)  %得到  -82.2667>> sum((dim2 - mean(dim2)) .* (dim3 - mean(dim3))) / (size(mysample, 1) - 1)  %得到   76.5111

搞清楚了这个后面就容易多了,协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算:

>> var(dim1)  %得到 227.8778>> var(dim2)  %得到 179.8222>> var(dim3)  %得到 156.7111

 这样,我们就得到了计算协方差矩阵所需要的所有数据,调用Matlab自带的cov函数进行验证:

>> cov(mysample)

 把我们计算的数据对号入座,是不是一摸一样?

Update

今天突然发现,原来协方差矩阵还可以这样计算,先让样本矩阵中心化,即每一维度减去该维度的均值,使每一维度上的均值为0,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可。其实这种方法也是由前面的公式推导而来,只不过理解起来不是很直观,但在抽象的公式推导时还是很常用的!同样给出Matlab代码实现:

>> temp = mysample - repmat(mean(mysample), 10, 1);>> result = temp' * temp ./ (size(mysample, 1) - 1)

总结

理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度,心中明确这个整个计算过程就会顺流而下,这么一来就不会迷茫了~ 




协方差矩阵实在是太重要了,无论是在计量,金融工程还是随机分析中,我们都会到用到协方差矩阵。其实,这三者都利用了协方差矩阵本身的含义,即随机变量之间的线性相关关系(当然,相关系数矩阵在此处更为贴切),也利用了协方差矩阵为半正定矩阵的性质。下面具体道来,

首先,我们先要分析一下协方差矩阵\Sigma的性质。作为实对称矩阵,其主要性质之一就是可以正交对角化,即存在正交矩阵U,使得
U^T\Sigma U=\Lambda
作为半正定矩阵,我们可以对协方差矩阵进行Cholesky分解:半正定矩阵\Sigma,可以分解为\Sigma=U^T \Lambda U,其中U是上三角阵,\Lambda是对角线元素都非负的对角矩阵。所以
\Sigma=U^T \Lambda U=[U^T \Lambda^{1/2} ][\Lambda ^{1/2} U]=[\Lambda ^{1/2} U] T [\Lambda ^{1/2} U]
这样一来,矩阵\Sigma=C^TC ,其中C=\Lambda^{1/2}U

上面的铺垫工作完成,下面具体分析其应用,
1.在金融随机分析和金融工程中的应用
在金融随机分析中我们可以采用Monte Carlo方法对期权进行定价,如果对于普通的欧式期权,那么我们只要产生N个正态分布的随机数即可。但是,对于那些依赖于多个相关随机过程(Correlated Brownian Motion)的资产的定价,我们就要产生满足特定相关关系的随机变量,而这正是依靠协方差矩阵和上面所述的Cholesky分解完成的。比如,Quanto(Quantity Adjusting Option)双币种期权就是满足上述特征的期权。这里我复制我的BLOG中的一段,
Quanto Nikkei Option. Consider a Nikkei quanto into dollar call option. Assuming both the USD/JPY and Nikkei are both lognormal process, i.e.

\dfrac{dS_t}{S_ t}=\mu dt+\sigma dW_ t

\dfrac{dX_t}{X_ t}=(r_d-r_f )dt+\sigma_XdB_ t
dW_t dB_t =\rho dt
where S and X are the equity and FX process. On a spreadsheet, simulate the process, and show that by delta hedging alone, you can replicate the quanto call option. Assume the maturity of the option is one year.
在使用Monte Carlo方法对于上述期权定价时,核心是要模拟两个具有相关性的布朗运动,这时候,我们就可以利用之前提到的协方差矩阵的Cholesky分解。Matlab code:
Sigma = [siga^2 siga*sigb*rho;siga*sigb*rho sigb^2];B = randn(2,n);C=chol(Sigma);V = C' * B;STa = S0a * exp((mua - (siga^2)/2)*T + sqrt(T)*V(1,:));STb = S0b * exp((mub - (sigb^2)/2)*T + sqrt(T)*V(2,:));

具体而言,对于随机向量X服从MN(0,\Sigma),我们只要先生成服从MN(0,I)的随机向量Z,再利用Cholesky分解\Sigma,这时C^TCX的分布就相同。当然你可以不用Monte Carlo而用五叉树是针对相关随机变量进行数值模拟,其原理可以参照Boyle的A Lattice Framework for Option Pricing with Two State Variables一文,以及Ren-Raw Chen, San-Lin Chung and Tyler T. Yang的Option Pricing in a Multi-Asset, Complete Market Economy。

2.在金融工程中计算组合VaR上的应用
我们知道,独立正态分布随机变量的线性组合依然服从正态分布。而事实上,我们可以进一步证明,对于服从联合正态分布的随机向量,其随机变量的线性组合也服从正态分布,即随机变量之间并不一定是不相关的。对这一结论的证明,仍然用到了协方差矩阵半正定的性质。令随机向量X∼MN(m,Σ),即证对于任意的向量w ,都有w^T X\sim MN(w^T m,w^T \Sigma w)  。这样一来,原本我们对单一资产进行的VaR分析可以很好的应用在资产组合上来,因为当各个资产的收益率服从联合正态假设下,组合的收益率也服从正态分布。


3. 在计量经济和统计上的应用
这在之前的回答中也已经提到了,比如主成分分析(PCA)和因子分析。其实主成分分析也是在量化投资中,多因子模型的一种类型,即统计因子模型,而其核心也是利用了协方差矩阵的半正定的性质进行Cholesky分解,其实多因子模型不仅仅应用在统计,计量经济,量化投资,也在机器学习中十分重要,可以看看Andrew Ng的公开课,有专门的PCA,这部分知识太多了,不用展开了。


一些细节问题
我们一直提到协方差矩阵是半正定而不一定是正定的,尽管大多数情况下是后者。对于协方差矩阵非满秩的情形又该如何生成满足特定协方差矩阵的随机向量呢,我想很多同学可能自己都想到了,只要找到这些随机变量的一个极大无关组,找到满秩的子协方差矩阵,再利用线性变换还原就成了。具体的步骤,我推荐一本书,金融工程中的蒙特卡罗方法((美)格拉瑟曼(Paul Glasserman) 。这本书会提到上面的问题,会对PCA,Monte Carlo,协方差矩阵给出更翔实的解答。