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
相关产品推荐
相关产品推荐

