2016-05-25 18 views
4

私は3つのマーケット(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

関連する問題