R语言事件研究按ISIN、事件分组回归计算alpha、beta的方案咨询
R语言市场模型事件研究的分组回归与窗口ID统一方案
一、按ISIN+事件分组回归实现方案
直接用tidyverse生态的dplyr、tidyr、broom工具链即可完成需求,步骤如下:
- 先对数据按ISIN、日期排序,保证时序正确
- 生成全局统一的事件ID,作为前后窗口、回归结果的匹配主键
- 按ISIN+事件ID分组筛选对应前置窗口,批量执行回归后提取系数回绑到原数据
参考代码:
library(tidyverse) library(broom) # 1. 预处理生成统一事件ID data <- data %>% arrange(ISIN, Date) %>% group_by(ISIN) %>% # 非零评级变动时事件ID+1,从1开始计数 mutate(event_id = cumsum(if_else(Rating_Change != 0, 1, 0))) %>% # 修正第一个事件前的观测ID为1,匹配首个事件的前置窗口 mutate(event_id = if_else(event_id == 0, 1, event_id)) %>% ungroup() # 2. 筛选每个事件的前置窗口(示例为事件前3期+事件当期,可自行调整偏移量) window_data <- data %>% group_by(ISIN, event_id) %>% mutate(event_row = which(Rating_Change != 0)) %>% filter(row_number() >= event_row - 3 & row_number() <= event_row) %>% ungroup() # 3. 分组跑回归提取系数 coef_result <- window_data %>% nest(data = -c(ISIN, event_id)) %>% mutate( model = map(data, ~ lm(R ~ STOXX_Return, data = .x)), alpha = map_dbl(model, ~ coef(.x)[[1]]), beta = map_dbl(model, ~ coef(.x)[[2]]) ) %>% select(ISIN, event_id, alpha, beta) # 4. 系数回绑到原数据 final_data <- left_join(data, coef_result, by = c("ISIN", "event_id"))
二、前后置窗口ID统一方案
你之前ID不一致的核心原因是前置窗口用了lag逻辑导致计数少1,直接使用上述第一步生成的event_id作为唯一匹配主键即可,前后窗口都基于该ID筛选:
- 前置窗口筛选规则:同一
event_id下,行号处于[事件行号-前置期数, 事件行号]区间 - 后置窗口筛选规则:同一
event_id下,行号处于[事件行号, 事件行号+后置期数]区间
也可以直接基于统一ID生成窗口标识,参考代码:
data <- data %>% group_by(ISIN, event_id) %>% mutate( event_row = which(Rating_Change != 0), # 前置窗口标识,示例为前3期+当期共4期 is_pre_window = if_else(row_number() >= event_row -3 & row_number() <= event_row, 1, 0), # 后置窗口标识,示例为当期+后3期共4期 is_post_window = if_else(row_number() >= event_row & row_number() <= event_row +3, 1, 0) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者antonia_pi
相关产品推荐
相关产品推荐

