Python中的滚动平均成对相关

时间:2016-05-25 00:02:13

标签: python pandas average correlation

我有三个市场(GLD,SPY和USO)的每日回报。我的目标是从130天的滚动基础上的相关矩阵计算平均成对相关性。

我的出发点是:

import numpy as np
import pandas as pd
import os as os
import pandas.io.data as web
import datetime as datetime
from pandas.io.data import DataReader

stocks = ['spy', 'gld', 'uso']
start = datetime.datetime(2010,1,1)
end = datetime.datetime(2016,1,1)

df = web.DataReader(stocks, 'yahoo', start, end)
adj_close_df = df['Adj Close']

returns = adj_close_df.pct_change(1).dropna()
returns = returns.dropna()

rollingcor = returns.rolling(130).corr()

这将创建一组相关矩阵。然而,提取下部(或上部)三角形,移除对角线然后计算每个观察的平均值是我绘制空白的地方。理想情况下,我希望每个日期的输出都在一个系列中,然后我可以按日期对其进行索引。

也许我从错误的地方开始,但任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

要获得平均成对相关,您可以找到相关矩阵的总和,减去n(对角线上的那些),除以2(对称),最后除以n(平均)。我认为应该这样做:

>>> n = len(stocks)
>>> ((rollingcor.sum(skipna=0).sum(skipna=0) - n) / 2) / n
Date
2010-01-05         NaN
2010-01-06         NaN
2010-01-07         NaN
                ...   
2015-12-29    0.164356
2015-12-30    0.168102
2015-12-31    0.166462
dtype: float64

答案 1 :(得分:0)

您可以使用numpy的{​​{1}}来访问数据框的下三角形。

tril

计算矩阵下三角的总和。注意中间的def tril_sum(df): # -1 ensures we skip the diagonal return np.tril(df.unstack().values, -1).sum() 。我期待有一个多索引系列,我需要转向数据帧。

然后将其应用到您的面板

unstack()

看起来像:

n = len(stock)
avg_cor = rollingcor.dropna().to_frame().apply(tril_sum) / ((n ** 2 - n) / 2)

这个答案会跳过对角线。