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

如何在R中使用循环计算匹配事件数据与商品收益率完成异常检验

解决方案

首先需要将两个数据框的时间列转为R可识别的时间格式,再通过自定义函数批量处理所有事件即可,完整实现代码如下:

# 先安装依赖包(已安装可跳过)
install.packages(c("dplyr", "lubridate", "writexl"))

# 加载依赖包
library(dplyr)
library(lubridate)
library(writexl)

# ------------- 1. 预处理:统一时间格式 -------------
# 你的数据时间格式为年-月-日 时:分:秒,直接用ymd_hms转换即可
# 如果TIME列导入时被识别为因子,要先转成字符:as.character(price_data$TIME)
price_data$TIME <- ymd_hms(price_data$TIME)
event_data$TIME <- ymd_hms(event_data$TIME)

# ------------- 2. 自定义异常收益率计算函数 -------------
calc_abnormal <- function(event_time) {
  # 提取事件前t=-5到t=-2的4个时间点
  pre_times <- event_time - minutes(c(5,4,3,2))
  pre_returns <- price_data$return[price_data$TIME %in% pre_times]
  # 缺失前置数据则返回NA,避免计算报错
  if(length(pre_returns) < 4) return(c(`t=-1`=NA, `t=0`=NA, `t=1`=NA))
  exp_return <- mean(pre_returns)
  # 提取t=-1、0、1三个时点的收益率
  t_neg1 <- price_data$return[price_data$TIME == event_time - minutes(1)]
  t_0 <- price_data$return[price_data$TIME == event_time]
  t_pos1 <- price_data$return[price_data$TIME == event_time + minutes(1)]
  # 计算并返回异常值
  return(c(
    `t=-1` = ifelse(length(t_neg1) == 1, t_neg1 - exp_return, NA),
    `t=0` = ifelse(length(t_0) == 1, t_0 - exp_return, NA),
    `t=1` = ifelse(length(t_pos1) == 1, t_pos1 - exp_return, NA)
  ))
}

# ------------- 3. 批量计算所有事件并导出 -------------
result <- event_data %>%
  rowwise() %>%
  mutate(res = list(calc_abnormal(TIME))) %>%
  unnest_wider(res)

# 导出为Excel
write_xlsx(result, "事件异常收益率结果.xlsx")

如果价格数据存在缺失时间点,对应事件的计算结果会返回NA,可后续手动排查补全。如果不想使用tidyverse语法,用基础R的for循环遍历事件表每一行调用上述函数,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:18:03