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

R语言计算面板数据可变长度滚动窗口年化收益率

动态滚动窗口年化收益率实现方案

规则对应逻辑

将需求拆解为可直接落地的计算逻辑:

  • 单标的分组内按日期升序排列后,逐行匹配窗口规则
  • 前29条观测(累计观测不足30天)返回空值NA
  • 第30条观测到第249条观测:窗口长度从30天逐行加1,取从序列起点到当前行的全部收益率计算均值,乘以250得到年化收益率
  • 第250条及以后观测:固定取最近250天的收益率计算均值,乘以250得到年化收益率

依赖包与实现代码

需要用到dplyr做分组数据处理,slider做高效滚动计算,未安装的话可先运行install.packages(c("dplyr", "slider"))完成安装。
完整计算代码如下:

library(dplyr)
library(slider)

Data <- Data %>%
  # 将字符型日期转为标准日期格式
  mutate(Date = as.Date(Date, format = "%d.%m.%Y")) %>%
  # 按标的分组
  group_by(Name) %>%
  # 分组内按日期升序排列,保证滚动顺序正确
  arrange(Date, .by_group = TRUE) %>%
  mutate(
    Annual_Return = slide_dbl(
      .x = Return,
      # 窗口长度不足30返回NA,否则计算均值*250
      .f = ~ if (length(.x) < 30) NA_real_ else mean(.x) * 250,
      # 动态设置向前取数的行数:累计观测不足250时取全部历史,超过250时固定取前249行+当前行共250行
      .before = ~ min(. - 1, 249),
      .after = 0
    )
  ) %>%
  ungroup()

效果验证

用提供的示例数据测试可得到符合规则的结果:

  • 标的A、B的前29条观测Annual_Return均为NA,符合初始阶段无有效结果的要求
  • 第30条观测(2018年9月29日)窗口长度为30,对应30天收益率均值*250
  • 第31条观测(2018年9月30日)窗口长度为31,对应31天收益率均值*250,和规则指定的节点完全匹配
  • 示例数据单标的仅38条观测,窗口长度最高到38,待数据累计到250条后会自动切换为固定250天滚动窗口,无需额外调整代码

注意事项

  • 如果原始数据存在缺失交易日(即某些标的某交易日无记录),建议先使用tidyr::complete()补全所有标的的交易日序列,再做计算,避免窗口长度统计偏差
  • 计算逻辑默认按日度交易日自然排序,不需要额外处理节假日,只要数据按实际交易日期先后排列即可

内容的提问来源于stack exchange,提问作者remo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:27:35