You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:09:39