R-分组滚动回归(Fama-Macbeth程序-首过)

时间:2020-05-06 08:44:05

标签: r regression grouping rolling-computation

大家好,

我正在尝试找到一种方法来获取多元回归“收益〜MKTRF + SMB + HML + RMW + CMA + MOM + TERM + DEF”的系数(β)。在多因素的基础上,这被称为Fama-Macbeth过程的“首过”。

这里的问题是,这种回归应该在滚动的基础上进行,并且窗口设置为60个周期,但最重要的是按组 strong>。

即使此页面上有很多此类“按组滚动回归”的示例,它们几乎都专门处理单因子回归,这使我无法正确提取所需的所有系数(是的,我是新来的R)。

为了省去引起问题的NA并使它更快,我将数据集转换为“长”版本。请注意,NA会由于不同证券的发行日期不同而出现在第一个数据帧中(B1:GB5),并且在将数据转换为垂直(或长期)时,只能将其删除,而不排除其他不应排除的数据)。这也使变量“ Company”和“ Yield”出现。

最后,完成回归后,我想以一种很好的可读方式存储每个证券的系数,并在可能的情况下存储它们各自的标签,并显示由于“滚动”过程而出现的NA(便于理解什么)是什么)。

摘要:

  • 滚动回归
  • 窗口= 60个周期
  • 按组=公司
  • 多元回归
  • 提取系数

谢谢

数据

在下面找到可复制的数据;关于回归的部分是空的,因为我尝试了许多方法,但没有成功。因此,我给您所有的自由去做。

###LIBRARIES
library(readr)
library(tidyr)
library(dplyr)
library(compare)


###DATASET & TRANSFORMATIONS

#a)
set.seed(10000000)

df <- data.frame(
  
  ##Date
  Date = seq(as.Date("2000/01/01"), by = "day", length.out = 5000),  
  
  ##Factors (indep var)
  MKTRF = sample(1:100, 5000, replace=TRUE),
  SMB = sample(1:100, 5000, replace=TRUE),
  HML = sample(1:100, 5000, replace=TRUE),
  RMW = sample(1:100, 5000, replace=TRUE),
  CMA = sample(1:100, 5000, replace=TRUE),
  MOM = sample(1:100, 5000, replace=TRUE),
  TERM = sample(1:100, 5000, replace=TRUE),
  DEF = sample(1:100, 5000, replace=TRUE),
  
  ##Securities (dep var)
  #type 0
  B1 = c(rep(NA, 1000), sample(1:100, 3000, replace=TRUE), rep(NA, 1000)),
  B2 = c(rep(NA, 1500), sample(1:100, 3000, replace=TRUE), rep(NA, 500)),
  B3 = c(sample(1:100, 3000, replace=TRUE), rep(NA, 2000)),
  B4 = c(rep(NA, 1000), sample(1:100, 4000, replace=TRUE)),
  B5 = c(sample(1:100, 5000, replace=TRUE)),
  
  #type 1
  GB1 = c(rep(NA, 1500), sample(1:100, 2000, replace=TRUE), rep(NA, 1500)),
  GB2 = c(rep(NA, 1500), sample(1:100, 3000, replace=TRUE), rep(NA, 500)),
  GB3 = c(sample(1:100, 3000, replace=TRUE), rep(NA, 2000)),
  GB4 = c(rep(NA, 1000), sample(1:100, 4000, replace=TRUE)),
  GB5 = c(sample(1:100, 5000, replace=TRUE)))


#b) transfrom to long dataset
long_df <- df %>% gather(Company, Yield, B1:GB5)
head(long_df, 24)

#c) delete NA rows
omit_df <- na.omit(long_df)

#d) check validity of the process (correct = TRUE)
sum(is.na(omit_df))
sum(is.na(long_df))

a <- nrow(long_df) - nrow(omit_df)
b <- sum(is.na(long_df))

compare(a,b) 


###REGRESSION

#a) The regression is of the form: Yield ~ MKTRF + SMB + HML + RMW + CMA + MOM + TERM + DEF

0 个答案:

没有答案