在熊猫中创建滚动协方差矩阵

时间:2017-07-12 15:59:55

标签: python pandas matrix covariance

我正在尝试在财务数据(窗口大小= 60)上创建一组滚动协方差矩阵。返回值为125x3 df。

import pandas as pd

roll_rets = returns.rolling(window=60)
Omega = roll_rets.cov()

Omega是一个375x3数据帧,看起来像一个多索引 - 即每个时间戳有3个值。

我真正想要返回的是一组66个3x3协方差矩阵(即每个时段一个),但我无法弄清楚如何正确迭代返回来执行此操作。我想我错过了一些明显的东西。感谢。

1 个答案:

答案 0 :(得分:2)

首先:MultiIndex DataFrame是一个可迭代的对象。 (试试bool(pd.DataFrame.__iter__)。如果您有兴趣,迭代MultiIndex DataFrame的子帧有几个StackOverflow问题。

但直接对你的问题,这是一个字典:键是(结束)日期,每个值是一个3x3 NumPy数组。

import pandas as pd
import numpy as np

Omega = (pd.DataFrame(np.random.randn(125,3), 
                      index=pd.date_range('1/1/2010', periods=125),
                      columns=list('abc'))
         .rolling(60)
         .cov()
         .dropna()) # this will get you to 66 windows instead of 125 with NaNs

dates = Omega.index.get_level_values(0) # or just the index of your base returns
d = dict(zip(dates, [Omega.loc[date].values for date in dates]))

效率这么高吗?不,不是很好。您正在为dict的每个值创建单独的NumPy数组。每个NumPy数组都有自己的dtype等。现在的DataFrame可以说非常适合你的目的。但另一个解决方案是通过扩展ndim的{​​{1}}来创建单个NumPy数组:

Omega.values

这里每个元素都是一个矩阵(同样,很容易迭代,但丢失了你在DataFrame中的日期索引)。

Omega.values.reshape(66, 3, 3)