Python 在pandas中创建滚动协方差矩阵

Python 在pandas中创建滚动协方差矩阵,python,pandas,matrix,covariance,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协方差矩阵(即每个周期一个),但我不知道如何正确地迭代返回来实现这一点。我想我遗漏了一些明显的东西。谢谢。首先:多索引数据帧是一个可

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

import pandas as pd

roll_rets = returns.rolling(window=60)
Omega = roll_rets.cov()
Omega是一个375x3数据帧,看起来像一个多索引,即每个时间戳有3个值


我实际上想要返回的是一组66个3x3协方差矩阵(即每个周期一个),但我不知道如何正确地迭代返回来实现这一点。我想我遗漏了一些明显的东西。谢谢。

首先:多索引数据帧是一个可编辑的对象。(请尝试
bool(pd.DataFrame.\uuuu iter\uuuu
)。如果您感兴趣,在迭代多索引数据帧的子帧时会遇到几个堆栈溢出问题

但是对于你的问题,这里有一个命令:键是(结束)日期,每个值是一个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数组都有自己的数据类型等。现在的数据帧可以说非常适合您的目的。但另一个解决方案是通过扩展
Omega.values的
ndim
来创建单个NumPy数组

Omega.values.reshape(66, 3, 3)
在这里,每个元素都是一个矩阵(同样,很容易编辑,但会丢失数据框中的日期索引)


问题1:Re:“一组125个3x3协方差矩阵”:对125个观测值使用长度为60的滚动窗口将为您提供66个3x3窗口。这是您的意思吗?问题2:您希望您的数据以什么形式输出?NumPy数组?在其当前形式中,多索引数据帧是一组66个3x3数据帧,每个数据帧都是协方差矩阵。在1上,是的,这是我的意思,并将进行编辑以反映。O理想情况下,我想要一个协方差矩阵字典,或者一些我可以轻松迭代的东西。协方差矩阵只是模型中的一个参数,所以我需要在代码后面将它们与向量等相乘。
Omega.values.reshape(66, 3, 3)[-1] # last matrix/final date
Out[29]: 
array([[ 0.80865977, -0.06134767,  0.04522074],
       [-0.06134767,  0.67492558, -0.12337773],
       [ 0.04522074, -0.12337773,  0.72340524]])