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

按投资者分组并在滚动时间窗口应用自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:25:35