用于投资组合 beta 的 groupby rolling agg 自定义函数

Beta 是衡量投资组合系统性风险的指标。它的计算方法是将投资组合回报率与基准/市场的协方差除以市场方差。我想根据许多投资组合滚动计算。


我有一个 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。


我想创建一个与 BM 列相比具有滚动 beta 的数据集。


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


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'])

所以这有助于我找到我输入的两列之间的 beta...问题是如何对我上面的数据和包含许多列/投资组合的数据执行此操作?然后如何在滚动的基础上做到这一点?从我上面看到的相关性来看,下面应该是可能的,在每一列与一个指定列中运行每个滚动的 3 个月数据集。


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

任何指向正确方向的指针将不胜感激


青春有我
浏览 244回答 2
2回答

拉莫斯之舞

IIUC,你可以set_index使用 PERIOD 和 BMfilter列,其中包含 PORT 的列(如果你有其他列你不想应用该beta功能),然后rolling.apply像这样使用: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     PORT20   201504 -0.013       NaN       NaN1   201505  0.022       NaN       NaN2   201506 -0.039  0.714514  0.8986133   201507  0.017  0.814734  1.0557984   201508 -0.081  0.736486  0.9073365   201509 -0.032  0.724490  0.8877556   201510  0.090  0.598332  0.7369647   201511  0.038  0.715848  0.7892218   201512 -0.044  0.787248  0.7787039   201601 -0.057  0.658877  0.79494910  201602 -0.011  0.412270  0.78956711  201603  0.026  0.354829  0.69057312  201604  0.010  0.562924  0.55808313  201605  0.031  1.716066  1.530471

胡子哥哥

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python