R语言如何按指定起止月份分组计算股票累计收益率
R实现按股票分组计算指定区间月度累计收益率
核心实现思路
你需要的t月累计收益规则为:按股票ID分组,取t-11月到t-1月共11个月的收益率,通过复利公式计算累计值,即区间累计收益 = ∏(1 + 单月RETURN) - 1,和你已知的cumprod(1+RETURN)逻辑一致,只是把全量累计改成指定窗口的滚动累计。
计算前必须先保证单只股票的观测数据按月份升序排列,否则结果会出错。
方法1:滚动窗口实现(数据无缺月时效率最高)
用dplyr做分组处理,slider包实现规则化滚动窗口计算,不用手动匹配月份:
# 加载需要的包,未安装可先运行 install.packages(c("dplyr","slider")) library(dplyr) library(slider) # 第一步:按ID分组、按月份升序排序 stock_data <- stock_data %>% group_by(ID) %>% arrange(month_date, .by_group = TRUE) %>% # month_date替换为你表中存储月度时间的列名 ungroup() # 第二步:滚动计算目标区间累计收益 stock_data <- stock_data %>% group_by(ID) %>% mutate( cum_ret_t = slide_dbl( .x = RETURN, .f = ~prod(1 + .x) - 1, .before = 11, # 取当前行之前的11行(对应t-1到t-11月) .after = -1, # 不包含当前行(排除t月本身) .complete = TRUE # 窗口不满11个月时返回NA,避免样本不足时计算错误 ) ) %>% ungroup()
方法2:匹配辅助列起止日期实现(存在缺月时结果更准确)
如果你已经生成了new_11(区间起始月)、new_1(区间结束月)两个辅助列,怕数据缺月导致按行号滚动出错,可以直接按日期区间匹配计算:
library(dplyr) library(purrr) stock_data <- stock_data %>% group_by(ID) %>% mutate( cum_ret_t = pmap_dbl( list(new_11, new_1), function(start_mon, end_mon) { # 提取当前股票在目标时间区间内的所有收益率 period_ret <- RETURN[month_date >= start_mon & month_date <= end_mon] # 区间满11个月才计算收益,否则返回NA ifelse(length(period_ret) == 11, prod(1 + period_ret) - 1, NA_real_) } ) ) %>% ungroup()
注意事项
如果RETURN列存在缺失值,可以根据业务规则调整计算逻辑:比如缺失月份收益按0计算,就把
prod(1 + period_ret)替换为prod(1 + tidyr::replace_na(period_ret, 0));如果需要直接剔除缺失值,在prod函数内加na.rm = TRUE参数即可。
内容的提问来源于stack exchange,提问作者Antisa Qipro
相关产品推荐
相关产品推荐

