如何根据相关矩阵和波动向量创建协方差矩阵?

时间:2018-08-16 22:34:56

标签: python python-3.x pandas numpy

我在数据帧GetToolTipText中有此相关矩阵:

df_corr

我在数据帧ticker CNP F GE TSLA WMT CNP 1.000000 0.302712 0.408604 0.205812 0.289421 F 0.302712 1.000000 0.510077 0.302415 0.280815 GE 0.408604 0.510077 1.000000 0.288827 0.326106 TSLA 0.205812 0.302415 0.288827 1.000000 0.166978 WMT 0.289421 0.280815 0.326106 0.166978 1.000000 中具有此波动向量:

df_vol

我想拥有协方差矩阵。我不能在实际示例中使用numpy cov,因为波动率和相关性不是来自同一张表。

以下是预期结果:

CNP       0.012789
F         0.014525
GE        0.011579
TSLA      0.026573
WMT       0.011369

2 个答案:

答案 0 :(得分:1)

IIUC,请考虑以下设置

"UK"

Setup

您可以z = io.StringIO(""" ticker CNP F GE TSLA WMT CNP 1.000000 0.302712 0.408604 0.205812 0.289421 F 0.302712 1.000000 0.510077 0.302415 0.280815 GE 0.408604 0.510077 1.000000 0.288827 0.326106 TSLA 0.205812 0.302415 0.288827 1.000000 0.166978 WMT 0.289421 0.280815 0.326106 0.166978 1.000000""") df = pd.read_table(z, delim_whitespace=True) z2= io.StringIO(""" ticker vol CNP 0.012789 F 0.014525 GE 0.011579 TSLA 0.026573 WMT 0.011369""") df2 = pd.read_table(z2, delim_whitespace=True) 的值,并使用stack检索体积值。然后乘以

那么首先map

stack

您得到的

df = df.set_index('ticker').stack().reset_index()
df.columns = ['ticker', 'other', 'corr']

然后过滤掉相等的值(无关紧要)

   ticker other      corr
0     CNP   CNP  1.000000
1     CNP     F  0.302712
2     CNP    GE  0.408604
3     CNP  TSLA  0.205812
4     CNP   WMT  0.289421
5       F   CNP  0.302712
6       F     F  1.000000
7       F    GE  0.510077
8       F  TSLA  0.302415
9       F   WMT  0.280815

还有df = df[df.ticker != df.other]

map

哪个产量

df2 = df2.set_index('ticker')
df['cov'] = df.ticker.map(df2.vol) * df.other.map(df2.vol) * df['corr']

当然,您总是可以df.head() ticker other corr cov 1 CNP F 0.302712 0.000056 2 CNP GE 0.408604 0.000061 3 CNP TSLA 0.205812 0.000070 4 CNP WMT 0.289421 0.000042 5 F CNP 0.302712 0.000056 使其像矩阵一样

pivot_table

或使用df.pivot_table(index=['ticker'], columns=['other'], values=['cov'], fill_value=1) other CNP F GE TSLA WMT ticker CNP 1.000000 0.000056 0.000061 0.000070 0.000042 F 0.000056 1.000000 0.000086 0.000117 0.000046 GE 0.000061 0.000086 1.000000 0.000089 0.000043 TSLA 0.000070 0.000117 0.000089 1.000000 0.000050 WMT 0.000042 0.000046 0.000043 0.000050 1.000000 获取相应的.values

np.array

答案 1 :(得分:0)

IIUC

df.set_index('ticker',inplace=True)
df=pd.DataFrame(s.values*s.values[:,None]*df.values)
df.values[[np.arange(len(df))]*2] = 1
df
Out[24]: 
          0         1         2         3         4
0  1.000000  0.000056  0.000061  0.000070  0.000042
1  0.000056  1.000000  0.000086  0.000117  0.000046
2  0.000061  0.000086  1.000000  0.000089  0.000043
3  0.000070  0.000117  0.000089  1.000000  0.000050
4  0.000042  0.000046  0.000043  0.000050  1.000000