2016-05-25 12 views
4

我有來自三個市場(GLD,SPY和USO)的每日回報。我的目標是從130天的基礎上滾動計算相關矩陣的平均配對相關性。Python中的滾動平均兩兩相關性

我的出發點是:

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() 

這產生相關矩陣的一個面板。然而,提取下部(或上部)三角形,去掉對角線,然後計算每個觀察值的平均值就是我繪製空白的地方。理想情況下,我希望每個日期的輸出都在一個系列中,然後我可以按日期對其進行索引。

也許我從錯誤的地方開始,但任何幫助,將不勝感激。

+0

在這種情況下,平均相關性是指每個日期的平均值爲3個值? (所有配對組合) – aldanor

+0

是3個值的平均值。 – Joe

回答

3

爲了獲得平均配對相關性,可以找到相關矩陣的總和,減去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 
+0

優秀!像魅力一樣工作。謝謝! – Joe

1

你可以使用numpytril訪問數據框的下三角。

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) 

的樣子:

print avg_cor.head() 

Date 
2010-07-12 0.398973 
2010-07-13 0.403664 
2010-07-14 0.402483 
2010-07-15 0.403252 
2010-07-16 0.407769 
dtype: float64 

這個答案跳過對角線。

+0

謝謝!也適用於我。非常感謝你。 – Joe