按投资者分组并在滚动时间窗口应用自定义R函数
3个月滚动窗口计算投资组合波动率实现方案
问题背景
现有两位投资者(Jane和Tom)连续5个月的股票收益及固定权重数据,已实现全周期的投资组合波动率计算,需进一步针对每位投资者,基于3个月滚动窗口(1-3月、2-4月、3-5月)计算加权投资组合波动率。
解决方案
借助dplyr的数据分组能力,结合slider包的滚动窗口函数,可高效实现需求。具体步骤如下:
1. 加载依赖包
library(dplyr) library(slider)
2. 滚动窗口计算代码
# 确保数据按投资者和月份排序,保证滚动窗口逻辑正确 returns_df %>% arrange(Investor, Month) %>% group_by(Investor) %>% mutate( # 计算3个月滚动窗口的投资组合方差 rolling_variance = slide_index_dbl( .x = pick(starts_with("Stock")), # 提取窗口内的股票收益数据 .i = Month, # 按月份作为窗口索引 .f = function(window_data) { # 因权重固定,取窗口内任意一行的权重即可(这里取第一行) window_weights = first(pick(starts_with("Weight"))) lvar(x = window_data, weights = window_weights) }, .before = 2, # 窗口包含当前月份及前2个月,共3个连续月份 .complete = TRUE # 仅返回完整窗口的计算结果,不完整窗口返回NA ), # 波动率为方差的平方根 rolling_volatility = sqrt(rolling_variance) ) %>% ungroup()
代码说明
arrange(Investor, Month):确保数据按投资者和月份顺序排列,避免滚动窗口出现时序混乱;slide_index_dbl:按Month列的顺序创建滚动窗口,自动处理分组内的窗口计算;.before = 2:定义窗口范围为当前行及之前的2行,形成3个月的滚动窗口;.complete = TRUE:仅当窗口包含完整3个月数据时才执行计算,因此每位投资者的前2个月(January、February)会返回NA,从第3个月(March)开始得到有效结果;- 权重处理:由于每位投资者的权重全程固定,窗口内只需提取任意一行的权重即可,无需重复传递全量权重数据。
内容的提问来源于stack exchange,提问作者phinneasduck
相关产品推荐
相关产品推荐

