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

