You need to enable JavaScript to run this app. R语言事件研究按ISIN、事件分组回归计算alpha、beta的方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 22:54:04