2017-02-19 194 views
0

我對python很陌生,實際上這是我在Python中的第一個代碼。 我試圖找到的協方差矩陣爲4行數據的具有減小的重量日期明智如何找到Excel行的加權協方差矩陣?

我需要計算每個元件的4乘4的協方差矩陣 我必須使用其中i已計算出的回報蟒和權重 來找到協方差矩陣。

import pandas as pd 
import numpy as np 
import math 
xl = pd.ExcelFile('path+file.xlsx') 
df = xl.parse('Sheet 1') 
df['spxr']=np.log(df.SPX/df.SPX.shift(-1)) 
df['djir']=np.log(df.DJI/df.DJI.shift(-1)) 
df['vixr']=np.log(df.VIX/df.VIX.shift(-1)) 
df['vxdr']=np.log(df.VXD/df.VXD.shift(-1)) 
df['weights']=(0.06)*(0.94**(df.Obs-1)) 
df=df.fillna(0) 

我不知道如何使用np.cov要麼

回答

1

numpy的COV需要一個數組作爲輸入和輸出數組。它應該是如此簡單:

import numpy as np 

SPX = [0.000174, 0.000170, -0.000985, -0.000906] 
DJI = [0.000170, 0.000175, -0.000944, -0.000887] 
VIX = [-0.000985, -0.000944, 0.006568, 0.005917] 
VXD = [-0.000906, -0.000887, 0.005917, 0.005573] 

arr = np.array([SPX,DJI,VIX,VXD]) 
np.cov(arr) 

>>>array([[ 4.17311583e-07, 4.06027167e-07, -2.69320633e-06, 
    -2.47850075e-06], 
    [ 4.06027167e-07, 3.95127000e-07, -2.61988900e-06, 
    -2.41190283e-06], 
    [ -2.69320633e-06, -2.61988900e-06, 1.73845300e-05, 
     1.59925507e-05], 
    [ -2.47850075e-06, -2.41190283e-06, 1.59925507e-05, 
     1.47229569e-05]]) 

或者,用數據幀:

import pandas as pd 

df = pd.DataFrame(arr, columns=['SPX','DJI','VIX','VXD']) 
np.cov(df) 

>>>array([[ 4.17311583e-07, 4.06027167e-07, -2.69320633e-06, 
    -2.47850075e-06], 
    [ 4.06027167e-07, 3.95127000e-07, -2.61988900e-06, 
    -2.41190283e-06], 
    [ -2.69320633e-06, -2.61988900e-06, 1.73845300e-05, 
    1.59925507e-05], 
    [ -2.47850075e-06, -2.41190283e-06, 1.59925507e-05, 
    1.47229569e-05]]) 

你可能在你的數據幀無關列,在這種情況下,你可以切它喜歡:

df_relevant = df.iloc[:,['spxr','djir','vixr','vxdr']] 
+0

嗨我怎麼使用這裏的權重呢?對excel的計算是公式sumproduct(SPX(所有行)* SPX(所有行)*權重(所有行)) –

+0

這是否有幫助? http://stackoverflow.com/questions/38448579/weighted-covariance-matrix-in-numpy – protoculture