首页 > 解决方案 > 如何在滚动的基础上从数据帧中获取逆协方差矩阵

问题描述

我有十个不同投资组合的 DataFrame 返回 12904 天。我正在尝试获取每个日期的滚动倒协方差矩阵。我用 .rolling() 函数得到协方差矩阵。不幸的是,取反会产生错误。任何帮助是极大的赞赏!

DataFrame 超额返回(12904 行 × 10 列):

             NoDur  Durbl   Manuf   Enrgy   HiTec   Telcm   Shops   Hlth    Utils   Other
Date                                        
1970-01-02   0.0074 0.0188  0.0111  0.0175  0.0069  0.0162  0.0041  -0.0035 0.0159  0.0175
1970-01-05   0.0058 -0.0023 0.0049  0.0099  0.0066  0.0237  -0.0026 -0.0019 0.0122  0.0052
1970-01-06  -0.0032 -0.0135 -0.0085 -0.0107 -0.0050 -0.0002 0.0015  -0.0047 -0.0105 -0.0111
1970-01-07   0.0012 -0.0047 -0.0004 -0.0080 -0.0000 -0.0015 0.0042  0.0007  -0.0038 -0.0012
1970-01-08  -0.0024 -0.0035 0.0021  -0.0034 0.00255 -0.0057 0.0007  0.0062  0.0015  0.0011 

我试过的代码:

rolling_cov_inv = np.linalg.inv(excess_return.rolling(750).cov().shift())

我收到的错误:

LinAlgError: Last 2 dimensions of the array must be square

我也试过:

rolling_cov_inv = excess_return.rolling(750).np.linalg.inv(cov()).shift())

这里的错误信息:

'Rolling' object has no attribute 'np'

预期的输出是每天的 10x10 矩阵。

提前谢谢了!

标签: pythondataframenumpycovariance

解决方案


我想你快到了。以下代码返回一个系列,其中每个日期对应于 750 个观察期的协方差矩阵:

excess_return.rolling(750).cov().groupby('Date').apply(lambda g: pd.DataFrame(np.linalg.inv(g.values), index=g.index, columns=g.columns))

推荐阅读