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

在R中按ID计算事件日前后(-5~+5)的Buy and Hold收益

R中按ID计算事件日前后11天的买入持有收益解决方案

需求说明

针对每个ID,以EventDate为基准,计算事件日前5天到后5天(共11天)的买入持有收益(Buy and Hold return),计算逻辑为:当日Price ÷ 事件日前6天的Price - 1,非该时间范围内的记录收益值设为NA。

解决方案代码

library(dplyr)
library(lubridate)

# 确保日期列是日期格式(若原始数据未转换)
data$Date <- as.Date(data$Date)
data$EventDate <- as.Date(data$EventDate)

# 分组计算收益
data <- data %>%
  group_by(ID) %>%
  # 提取每个ID对应的基准价:EventDate前6天的Price
  mutate(base_price = Price[Date == EventDate - days(6)]) %>%
  # 仅在事件日前后5天范围内计算收益,其余设为NA
  mutate(BuyHoldReturn = if_else(
    Date >= EventDate - days(5) & Date <= EventDate + days(5),
    (Price / base_price) - 1,
    NA_real_
  )) %>%
  ungroup()

关键说明

  • 若某ID的EventDate前6天无对应Price记录,base_price会返回NA,对应的收益值也会是NA,可根据业务需求添加过滤或填充逻辑(比如filter(!is.na(base_price)))
  • 若日期数据是连续的日度数据,也可以不用lubridate,直接用EventDate - 6做日期减法(前提是日期列已转换为Date类型)
  • 代码中用if_else替代ifelse,是因为if_else在dplyr分组操作中类型一致性更好,避免隐式类型转换问题

示例验证

示例输入(简化版)

IDDateEventDatePrice
12023-01-012023-01-07100
12023-01-022023-01-07102
12023-01-032023-01-07101
12023-01-072023-01-07105
12023-01-122023-01-07108

示例输出(简化版)

IDDateEventDatePriceBuyHoldReturn
12023-01-012023-01-07100NA
12023-01-022023-01-071020.02
12023-01-032023-01-071010.01
12023-01-072023-01-071050.05
12023-01-122023-01-071080.08

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:24:14