我正在尝试在财务数据(窗口大小= 60)上创建一组滚动协方差矩阵。返回值为125x3 df。
import pandas as pd
roll_rets = returns.rolling(window=60)
Omega = roll_rets.cov()
Omega是一个375x3数据帧,看起来像一个多索引 - 即每个时间戳有3个值。
我真正想要返回的是一组66个3x3协方差矩阵(即每个时段一个),但我无法弄清楚如何正确迭代返回来执行此操作。我想我错过了一些明显的东西。感谢。
答案 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)