Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的滚动平均成对相关_Python_Pandas_Average_Correlation - Fatal编程技术网

Python中的滚动平均成对相关

Python中的滚动平均成对相关,python,pandas,average,correlation,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'] s

我每天从三个市场(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()
这将创建一组相关矩阵。然而,提取较低(或较高)的三角形,删除对角线,然后计算每个观测值的平均值,这是我画空白的地方。理想情况下,我希望每个日期的输出是在一个系列中,然后我可以通过日期索引它


也许我是从错误的地方开始的,但如果有任何帮助,我将不胜感激。

要获得平均成对相关性,你可以找到相关矩阵的和,减除
n
(对角线上的一个),除以2(对称),最后除以
n
(平均)。我认为这应该做到:

>n=len(股票)
>>>((rollingcor.sum(skipna=0).sum(skipna=0)-n)/2)/n
日期
2010-01-05南
2010-01-06南
2010-01-07南
...   
2015-12-29    0.164356
2015-12-30    0.168102
2015-12-31    0.166462
数据类型:64

您可以使用
numpy
tril
访问数据帧的下三角

def tril_sum(df):
    # -1 ensures we skip the diagonal
    return np.tril(df.unstack().values, -1).sum()
计算矩阵下三角形的和。注意在中间的代码< > unSTACK()/<代码>。我希望有一个多索引系列,我将需要转向一个数据帧

def tril_sum(df):
    # -1 ensures we skip the diagonal
    return np.tril(df.unstack().values, -1).sum()
然后将其应用到面板上

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


这个答案跳过了对角线。

通过平均相关性,您的意思是在这种情况下,每个日期的平均值为3?(所有成对组合)是3个值的平均值。非常好!工作得很有魅力。非常感谢。