用于投资组合 beta 的 groupby rolling agg 自定义函数
groupby rolling agg custom function for portfolio beta
感谢您的阅读,并提前感谢您的任何回答。
Beta 是衡量投资组合系统风险的指标。它是通过将该投资组合 returns 与基准/市场的协方差除以市场的方差来计算的。我想对许多投资组合进行滚动计算。
我有一个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 创建一个自定义函数,但因为它需要两个参数,所以我很费劲。下面是我的自定义函数,以及我如何通过为它提供两列 returns 来让它工作。
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...问题是如何对我上面的数据和包含许多 columns/portfolios 的数据执行此操作?然后如何在滚动的基础上做到这一点?从我上面看到的相关性来看,下面应该是可能的,运行 每列中的每个滚动 3 个月的数据集与一个指定的列。
beta_data = df.rolling(3).agg(beta(df['BM']))
任何正确方向的指示将不胜感激
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
IIUC,您可以 set_index
PERIOD 和 BM 列,filter
包含 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 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
感谢您的阅读,并提前感谢您的任何回答。
Beta 是衡量投资组合系统风险的指标。它是通过将该投资组合 returns 与基准/市场的协方差除以市场的方差来计算的。我想对许多投资组合进行滚动计算。
我有一个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 创建一个自定义函数,但因为它需要两个参数,所以我很费劲。下面是我的自定义函数,以及我如何通过为它提供两列 returns 来让它工作。
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...问题是如何对我上面的数据和包含许多 columns/portfolios 的数据执行此操作?然后如何在滚动的基础上做到这一点?从我上面看到的相关性来看,下面应该是可能的,运行 每列中的每个滚动 3 个月的数据集与一个指定的列。
beta_data = df.rolling(3).agg(beta(df['BM']))
任何正确方向的指示将不胜感激
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
IIUC,您可以 set_index
PERIOD 和 BM 列,filter
包含 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 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