Im有N对投资组合权重存储在numpy数组中,希望计算投资组合风险,其中w * E * w_T
是权重转置。我想到的方法是循环遍历每个权重对并应用矩阵乘法。是否有一种矢量化的方法,使得给定一个权重对(或者如果可能的话,N个权重总和为1),我对每一行应用一个协方差矩阵来获得风险(即没有循环)?
import numpy as np
w = np.array([[0.2,0.8],[0.5,0.5]])
covar = np.array([0.000046,0.000017,0.000017,0.000032]).reshape([2,2])
w1 = w[0].reshape([1,2]) # each row in w
#portfolio risk
np.dot(np.dot(w1,covar),w1.T)
最佳答案
@Adam的答案是有效的,但是对于大型数组,可能会导致非常大的临时数组(NxN
)和不必要的计算(计算非对角元素)。
下面是一个类似但效率更高的解决方案:
(我又加了一对砝码,以区分问题的不同方面)
w = np.array([[0.2,0.8],[0.5,0.5], [0.33, 0.67]])
covar = np.array([0.000046,0.000017,0.000017,0.000032]).reshape([2,2])
(np.dot(w, covar) * w).sum(axis=-1)
=> array([ 2.77600000e-05, 2.80000000e-05, 2.68916000e-05])
通过在第二步中使用简单乘法,我避免了不必要的非对角线计算。
编辑:解释临时数组
# first multiplication (in both solutions)
np.dot(w, covar).shape
(3, 2)
# second, my solution
(np.dot(w, covar) * w).shape
(3, 2)
# second, Adam's solution
np.dot(np.dot(w,covar),w.T).shape
(3, 3)
现在,如果您有一组要计算风险的权重(在本例中为
N
),以及投资组合中的N=3
工具(这里为M
)和M=2
,那么您将得到一个使用Adam解(N>>M
)的更大数组。它不仅会消耗更多的内存,填充非对角元素的计算是昂贵的(矩阵乘法),而且是不必要的。关于python - 向量化投资组合风险,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20362495/