python 中的var()函数和cov函数用法

本文是学习多篇博客总结而得:
numpy中var和cov函数求法和MATLAB中var和cov函数求法类似:

首先均值X,样本方差S,样本协方差C 公式分别为:


一.  MATLAB和Python中计算样本方差的函数都是var,但是二者有区别

(参考:http://blog.sciencenet.cn/blog-412206-612018.html)

在MATLAB中,计算方差采用的公式为:

该公式计算出的结果为总体方差 σ2

在Python中,对var计算时采用的公式为:


即样本的二阶中心矩;只有使用参数ddof = 1时才计算样本方差,计算结果才与MATLAB的var公式计算结果相同。


二. matlab 统计基本函数 var方差

(参考:http://blog.csdn.net/tong_huijiao/article/details/54018019)

matlab中的方差函数var的用法及具体分析: 
首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:
方差公式中分母上是N;

样本方差无偏估计公式中分母上是N-1 (N为样本个数)。 

函数名称: var 
函数功能:求解方差 
函数用法:var(X) %与var(X,0)相同 
var(X,W) 
var(X,W,dim) 

注:var(X,W) 

% 1. W可以取0或1,取0求样本方差的无偏估计值(除以N-1;对应取1求得的是方差(除以N),

% 2. W也可以是向量,但必须与X中的第一个维度数相同,即length(W)= size(X,1) 

var(X ,0 ,dim) % 除以N-1 ;dim =1 对每列操作 dim = 2 对每行操作 
var(X ,1 ,dim) % 除以N; dim =1 对每列操作 dim = 2 对每行操作

var(X,W,dim)   % 关于W取向量时,把W看做X中观察值发生的次数(或者说概率也行)

………………………………………………… 
2.1.  对于
X是向量时,把向量中每个元素看做一个样本 
var(X)或者var(X,0)函数输出这个向量中元素的样本方差的无偏估计值

var(X ,  1)输出的是样本方差 
例1:例1:

a = [1 6 1 4]; 
aa = var(a) 
aa = 

a_var = var(a,1) 
a_var = 
4.5000 
(sum((a-mean(a)).^2))/(length(a)) 
ans = 
4.5000 

2.2. 对于X是矩阵时 

把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差 

X= [1 6 6;4 2 5;7 2 3] 
X = 
1 6 6 
4 2 5 
7 2 3 
XX=var(X) 
XX = 
9.0000 5.3333 2.3333 
(sum((X-repmat(mean(X),3,1)).^2))/(size(X,1)-1) %验证 
ans = 
9.0000 5.3333 2.3333 
X_var = var(X,1) 
X_var = 
6.00 

2.3.  对于var(X ,0 ,dim) 或者 var(X ,1 ,dim) 前面已说 0 对应 除以N-1; 1对应除以N; 

dim 指维度信息,默认为1,dim =1 就指对每列操作; dim =2 就指对每行操作。

下面以 var(X ,0 ,dim) 为例进行试验验证: 
参考结果:默认dim=1

var(X ,0 ,2) 
ans = 
8.3333 
2.3333 
7.0000 


Y = X’; 
var(Y) 
ans = 
8.3333 2.3333 7.0000 (一样吧)

2.4 . 对于 var(X,W)、var(X,W,dim) 中W为向量的情况: 
把W看做X中对应观察值发生的次数(或者说概率也行)处理,现粘贴matlab部分源代码(已加注释)如下: 
function y = var(x,w,dim)

% The weighted variance for a vector X is defined as 
% VAR(X,W) = SUM(W.*RESID.*CONJ(RESID)) / SUM(W)  
% where now RESID is computed using a weighted mean. 
wresize = ones(1,max(ndims(x),dim)); wresize(dim) = n; 
w = reshape(w ./ sum(w), wresize);

三. MATLAB中cov函数的用法

(参考:http://blog.sina.com.cn/s/blog_9e67285801010twv.html)

函数名称:cov

函数功能: 求协方差矩阵

函数用法: cov(X)      % cov(X,0) = cov(X)

           cov(X,Y)    % X,Y必须是各维数都相同的矩阵
           cov(X,1)    % 除以N而不是N-1                   
           cov(X,Y,1)  % 除以N而不是N-1 
详细描述:
......................................................................
3.1 if X is a vector向量,cov(X)输出的是这个向量的方差

例:

>> A = [4 1 3];
>> AA = cov(A)

AA =

    2.3333

>> a = mean(A)

a =

    2.6667

>> AAA = 1/3*((4-a)^2+(1-a)^2+(3-a)^2)

AAA =

    1.5556

>> AAAA= 1/2*((4-a)^2+(1-a)^2+(3-a)^2)           

 %同样,这个方差不是真正意义的方差,而是对样本统计方差的一个无偏估计值

AAAA =

    2.3333

..............................................................................

3.2 X是一个矩阵来说,matlab把每行看做一个观察值,把每列当做一个变量.

也就是说对于一个4*3的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个3*3的协方差矩阵。
其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的 协方差无偏估计值(即除的是N-1)

.......................................................................
例1:
>> X = [1 5 6; 4 3 9 ; 4 2 9; 4 7 2]

X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2

>> Y = cov(X)

Y =

    2.2500   -0.7500    0.5000
   -0.7500    4.9167   -7.1667
    0.5000   -7.1667   11.0000

为探究过程,以Y(1,1)和Y(1,2)为例进行验证

>> x=X(:,1);
>> sum((x-3.25).^2)/3

ans =

    2.2500

>> y = X (:,2);

>>  aa = x'*y/3  

aa =

   -0.7500

......................................................

3.3 对于cov(X,Y)

X、Y必须是各维数都相等的矩阵,其功能是把X中所有元素看做一个变量的样本,Y中所有元素看做另外一个变量的样本,

把矩阵中每个对应位置看做一个联合观察值,函数实现的是求出两个变量的协方差矩阵

例2:

>> X

X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9 2]

Y =

     1     6     7
     7     5     9
     1     6     4
     2     9     2
>> cov(X,Y)

ans =

    6.9697    4.4242
    4.4242    8.4470

现在用(1,1)和(1,2)位置验证

>> sum(sum((X-mean(mean(X))).^2))/11  %把X中每个元素都看做一个变量的样本,求其方差的无偏估计值

ans =

    6.9697

>>  sum(sum((X-mean(mean(X))).*(Y-mean(mean(Y)))))/11  %把X、Y矩阵对应位置元素看做一个联合样本,根据公式E[(X-EX)*(Y-EY)]求协方差

ans =

    4.4242

.....................................................................................

3.4 cov(X,1)  和  cov(X,Y,1) 与之前的求解过程一致.

不同的是,其求出的是协方差,而不是样本的协方差无偏估计值,即其除以的是N 而不是N-1

例3:

>> cov(X,1)

ans =

    1.6875   -0.5625    0.3750
   -0.5625    3.6875   -5.3750
    0.3750   -5.3750    8.2500

>> x=X(:,1);
sum((x-3.25).^2)/4  %不同之处

ans =

    1.6875

>>  y = X (:,2);
>> y = y - 4.25;
>> aa = x'*y/4  %不同之处

aa =

   -0.5625

例4:


X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9 2]

Y =

     1     6     7
     7     5     9
     1     6     4
     2     9     2

>> cov(X,Y)

ans =

    6.9697    4.4242
    4.4242    8.4470

>> a =cov(X,Y,1)

a =

    6.3889    4.0556
    4.0556    7.7431

>> a.*12/11              %看出来了吧

ans =

    6.9697    4.4242
    4.4242    8.4470

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


VaR (Value at Risk) 是衡量金融投资风险的一种常用指标。在 Python ,你可以使用各种库来计算 VaR。以下是使用常见库的示例: 1. 使用 `numpy` 和 `pandas` 库计算 VaR: ```python import numpy as np import pandas as pd # 假设有一个投资组合的收益率数据存储在 DataFrame portfolio_returns = pd.DataFrame({'stock1': [0.05, -0.02, 0.03, -0.01, 0.02], 'stock2': [-0.03, 0.01, 0.02, -0.02, 0.04]}) # 计算每个股票的 VaR(以置信水平为 95%) conf_level = 0.95 portfolio_var = portfolio_returns.cov() # 计算协方差矩阵 portfolio_mean = portfolio_returns.mean() # 计算收益率均值 # 使用逆正态分布函数计算 VaR portfolio_var = np.array(portfolio_var) portfolio_mean = np.array(portfolio_mean) z_score = np.percentile(np.random.normal(0, 1, 10000), q=conf_level*100) portfolio_var = np.sqrt(np.dot(np.dot(portfolio_mean.T, portfolio_var), portfolio_mean)) * z_score print("Portfolio VaR:", portfolio_var) ``` 2. 使用 `pyfolio` 库计算 VaR: ```python import pyfolio as pf # 假设有一个投资组合的收益率数据存储在 DataFrame portfolio_returns = pd.DataFrame({'stock1': [0.05, -0.02, 0.03, -0.01, 0.02], 'stock2': [-0.03, 0.01, 0.02, -0.02, 0.04]}) # 计算投资组合的 VaR(以置信水平为 95%) portfolio_var = pf.var.mean_historic(portfolio_returns, frequency=1, sigma=1, level=5) print("Portfolio VaR:", portfolio_var) ``` 这些示例代码可以帮助你计算投资组合的 VaR。请注意,VaR 的计算方法可能因具体需求而有所不同,以上代码仅提供一种常见的计算方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值