Python groupby滚动agg组合测试版自定义函数

Python groupby滚动agg组合测试版自定义函数,python,pandas,group-by,finance,Python,Pandas,Group By,Finance,感谢阅读并提前给出答案 贝塔系数是衡量投资组合系统风险的指标。计算方法是将投资组合收益与基准/市场的协方差除以市场方差。我想对许多投资组合进行滚动计算 我有一个df如下 PERIOD,PORT1,PORT2,BM 201504,-0.004,-0.001,-0.013 201505,0.017,0.019,0.022 201506,-0.027,-0.037,-0.039 201507,0.026,0.033,0.017 201508,-0.045,-0.054,-0.081 201509,-0

感谢阅读并提前给出答案

贝塔系数是衡量投资组合系统风险的指标。计算方法是将投资组合收益与基准/市场的协方差除以市场方差。我想对许多投资组合进行滚动计算

我有一个df如下

PERIOD,PORT1,PORT2,BM
201504,-0.004,-0.001,-0.013
201505,0.017,0.019,0.022
201506,-0.027,-0.037,-0.039
201507,0.026,0.033,0.017
201508,-0.045,-0.054,-0.081
201509,-0.033,-0.026,-0.032
201510,0.053,0.07,0.09
201511,0.03,0.032,0.038
201512,-0.05,-0.034,-0.044
201601,-0.016,-0.043,-0.057
201602,-0.007,-0.007,-0.011
201603,0.014,0.014,0.026
201604,0.003,0.001,0.01
201605,0.046,0.038,0.031
除了更多的列,如port1和port2

我想创建一个带有滚动beta和BM列的数据集

我创建了一个类似的滚动关联数据集

df.rolling(3).corr(df['BM'])
…它获取了我的大集合中的每一列,并计算了与我的BM列的相关性

我试着为Beta版制作一个自定义函数,但因为它需要两个参数,所以我很挣扎。下面是我的自定义函数,以及我是如何通过向它提供两列返回来让它工作的

    def beta(arr1,arr2):
    #ddof = 0 gives population covar. the 0 and 1 coordinates take the arr1 vs arr2 covar from the matrix
    return (np.cov(arr1,arr2,ddof=0)[0][1])/np.var(arr2)

    beta_test = beta(df['PORT1'],df['BM'])
因此,这有助于我找到两列之间的测试版,我输入。。。问题是如何对我上面的数据和包含多个列/组合的数据执行此操作?那么如何在滚动的基础上进行呢?从上面我看到的相关性来看,下面应该是可能的,在每一列中运行每个滚动3个月的数据集,而不是一个指定的列

beta_data = df.rolling(3).agg(beta(df['BM']))

任何指向正确方向的指针都会受到欢迎

IIUC,您可以
设置列的索引周期和BM,
过滤
包含端口的列(如果您有其他列,您不想应用
beta
函数),然后使用
滚动

def getbetas(df, market, window = 45):
    """ given an unstacked pandas dataframe (columns instruments, rows
    dates), compute the rolling betas vs the market.
    """
    nmarket = market/market.rolling(window).var()
    thebetas = df.rolling(window).cov(other=nmarket)
    return thebetas
print (df.set_index(['PERIOD','BM']).filter(like='PORT')
         .rolling(3).apply(lambda x: beta(x, x.index.get_level_values(1)))
         .reset_index())
    PERIOD     BM     PORT1     PORT2
0   201504 -0.013       NaN       NaN
1   201505  0.022       NaN       NaN
2   201506 -0.039  0.714514  0.898613
3   201507  0.017  0.814734  1.055798
4   201508 -0.081  0.736486  0.907336
5   201509 -0.032  0.724490  0.887755
6   201510  0.090  0.598332  0.736964
7   201511  0.038  0.715848  0.789221
8   201512 -0.044  0.787248  0.778703
9   201601 -0.057  0.658877  0.794949
10  201602 -0.011  0.412270  0.789567
11  201603  0.026  0.354829  0.690573
12  201604  0.010  0.562924  0.558083
13  201605  0.031  1.716066  1.530471

这很有帮助,谢谢。它解决了我的问题。将BM设置到索引中,然后将其放入索引中,这是我所缺少的。我花了几个小时才走到这一步!感谢您的帮助。谢谢您的回答-已经晚了,我明天会检查这个,如果它好的话,我会批准的。它看起来很优雅。再次感谢