问题描述
我正在使用市场模型进行事件研究:AR(i,t)=R(i,t) - ((alpha(i) + beta(i)*R(m,t))。我很挣扎由于数据格式和过滤,计算 alpha(intercept) 和 beta(slope) 估计量。这就是我的数据目前的样子:
Date ISIN R STOXX_Return rating_Change rating
9 2016-10-01 CH00 0.0175315633 -0.0003749766 0.00 A
10 2016-11-01 CH00 -0.0733760706 -0.0220566972 0.00 A
11 2016-12-01 CH00 -0.0107454123 0.0182991778 0.00 A
12 2017-01-01 CH00 0.0457420548 0.0641541456 1.90 A
...
21 2017-10-01 CH00 0.0250723834 0.0374169332 0.00 A
22 2017-11-01 CH00 -0.0780495570 0.0179348620 0.00 A
23 2017-12-01 CH00 0.0688209502 -0.0312226700 0.00 A
24 2018-01-01 CH00 -0.0064684781 0.0144049186 -0.90 A
..
74 2017-01-01 GB00 0.0409336446 0.0641541456 0.00 B+
75 2017-02-01 GB00 0.0056671717 0.0006470779 0.00 B+
76 2017-03-01 GB00 0.0028145957 0.0364348490 0.00 B+
77 2017-04-01 GB00 0.0366417787 0.0144673074 3.66 B+
...
如果评级变化不为零,则存在“事件”(第 12、24、77 行)。
我需要的是使用 lm() 函数对事件前窗口进行回归(例如 9:11、21:23、74:77 行 - 即事件前 -3:1) .
但是,每个 ISIN 有多个事件
- 意味着我必须按 ISIN 和事件(非零评级变化)和
- 然后对每个事件前窗口和每个 ISIN 使用 lm() (R ~ STOXX_Return) 进行回归和
- 将值保存在事件和事件前窗口旁边的列中。
我没有设法在有条件的 for 循环或 magrittr/dplyr(或任何 google-able :-) )中做到这一点。没有真正解决 - 我只是不知道如何管理 ISIN 和事件的“双过滤器”,以及以下回归和系数的输出。 有没有人解决这个问题的方法?
非常感谢您的任何支持 - 非常感谢!
回复后补充
我尝试了以下方法:
PRE-WINDOW
filter_lmco_pre_tmp1 <- within(data,{
event_pre_window <- if_else(lag(rating_Change!=0),1,0)
event_pre_window <- ave(event_pre_window,lag(ISIN),FUN=cumsum)
})
Date ISIN R STOXX_Return rating_Change rating event_pre_window
10 2016-11-01 CH00 -0.0733761 -0.0220567 0.00 A NA
11 2016-12-01 CH00 -0.0107454 0.0182992 0.00 A 0
12 2017-01-01 CH00 0.0457421 0.0641541 1.90 A 0
13 2017-02-01 CH00 0.0208479 0.0006471 0.00 A 1
14 2017-03-01 CH00 0.0351640 0.0364348 0.00 A 1
22 2017-11-01 CH00 -0.0780496 0.0179349 0.00 A 1
23 2017-12-01 CH00 0.0688210 -0.0312227 0.00 A 1
24 2018-01-01 CH00 -0.0064685 0.0144049 -0.90 A 1
POST-WINDOW
filter_lmco_post_tmp1 <- within(data,{
event_post_window <- if_else(rating_Change !=0,0)
event_post_window <- ave(event_post_window,ISIN,FUN=cumsum)
})
Date ISIN R STOXX_Return rating_Change rating event_post_window
10 2016-11-01 CH00 -0.0733761 -0.0220567 0.00 A 0
11 2016-12-01 CH00 -0.0107454 0.0182992 0.00 A 0
12 2017-01-01 CH00 0.0457421 0.0641541 1.90 A 1
13 2017-02-01 CH00 0.0208479 0.0006471 0.00 A 1
14 2017-03-01 CH00 0.0351640 0.0364348 0.00 A 1
22 2017-11-01 CH00 -0.0780496 0.0179349 0.00 A 1
23 2017-12-01 CH00 0.0688210 -0.0312227 0.00 A 1
24 2018-01-01 CH00 -0.0064685 0.0144049 -0.90 A 2
25 2018-02-01 CH00 -0.0997418 0.0119439 0.00 A 2
您可以看到,如果有事件(第 12 行或第 24 行),则事件前后 ID 是不同的。 pre window 的第一个 event-id 以 0 开头,post window 的第一个 event-id 以 1 开头。这是因为我落后于 pre-events。但是,如果我不滞后,那么实际事件不包括在预事件中。那么有没有办法同时为前后窗口获取一个“ID”,以便之后的匹配成为可能?
解决方法
考虑使用 ifelse
、ave
和 by
为预窗口分配列。然后调用 split
(或 tail
)为每个 ISIN 和事件预窗口创建数据帧列表。最后,使用 # CREATE EVENT PRE-WINDOW COLUMN
my_df <- within(my_df,{
event_pre_window <- ifelse(Rating_change != 0,1,0)
event_pre_window <- ave(event_pre_window,ISIN,FUN=cumsum)
event_pre_window <- ifelse(Rating_Change != 0,event_pre_window-1,event_pre_window)
})
# DEFINE FUNCTION TO PROCESS SINGLE DATAFRAME
my_lm_model <- function(df) {
# ... code to run lm and return results on each pre-window
}
# SPLIT DF BY ISIN AND PRE-WINDOWS
# CALL ABOVE FUNCTION ON EACH TAILED SUBSET
pre_windows_lm_results_list <- by(
my_df,my_df[c("ISIN","event_pre_window")],function(sub) my_lm_model(tail(sub,3))
)
检索最后 3 行并传递给您的建模函数。全部在基础 R 中处理!
[]