使用tidyquant等R包计算股票滚动Beta的代码报错如何解决
问题原因
- 你定义的
roll_beta函数内部调用tq_performance返回的是包含多列指标的CAPM结果表,不是单个标量值,rollify默认无法直接处理多输出结果 - 直接将整个数据框传入
rollify生成的函数时,参数传递逻辑不匹配,函数无法识别输入窗口内的daily_return和mkt_daily_return列
可行修正方案(符合tidy编码规范)
方案1:调整rollify逻辑,单独提取Beta值
修改自定义函数,直接提取CAPM结果中的Beta列返回单个值,同时调整rollify的调用方式即可正常运行:
# 重新定义滚动Beta函数,仅返回Beta值 roll_beta <- rollify( .f = function(ra, rb) { # 构造临时窗口数据框 window_df <- tibble(daily_return = ra, mkt_daily_return = rb) # 计算并提取Beta值 tq_performance( data = window_df, Ra = daily_return, Rb = mkt_daily_return, scale = 252, performance_fun = table.CAPM ) %>% pull(Beta) }, window = 40 ) # 运行计算,将两列收益作为参数传入 all_returns_df <- all_returns_df %>% mutate(rolling_beta = roll_beta(daily_return, mkt_daily_return))
方案2:使用tidy生态更推荐的slider包实现滚动计算
slider是tidyverse官方维护的滚动计算包,兼容性和灵活度更高,实现逻辑更清晰:
# 首次使用先安装包,已安装可跳过 # install.packages("slider") library(slider) all_returns_df <- all_returns_df %>% mutate( rolling_beta = slide_dbl( .x = cur_data(), # 取当前分组的所有列 .f = ~ tq_performance( data = .x, Ra = daily_return, Rb = mkt_daily_return, scale = 252, performance_fun = table.CAPM ) %>% pull(Beta), .before = 39, # 窗口大小40=当前行+前39行 .complete = TRUE # 仅返回完整窗口的计算结果,前39行返回NA ) )
结果验证
执行以下代码即可查看滚动Beta的计算结果:
all_returns_df %>% slice(1:50) %>% view()
内容的提问来源于stack exchange,提问作者cephalopod
相关产品推荐
相关产品推荐

