[Groupby Rolling agg自定义函数用于投资组合beta

问题描述 投票:1回答:2

感谢您阅读,并预先获得任何答案。

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

除了端口1和端口2之类的更多列之外。

我想创建一个包含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'])

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

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

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

感谢您阅读,并预先获得任何答案。 Beta是衡量投资组合的系统风险的度量。它是通过将投资组合收益与...

python pandas group-by finance
2个回答
0
投票
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

0
投票

IIUC,您可以set_index列PERIOD和BM,filter包含PORT的列(如果您还有其他列,则不想应用beta函数),然后使用rolling.apply像:

© www.soinside.com 2019 - 2024. All rights reserved.