R - скользящая регрессия по группам (процедура Фама-Макбета - первый проход) - PullRequest
0 голосов
/ 06 мая 2020

Всем привет,

Я пытаюсь найти способ получить коэффициенты (бета) для множественной регрессии «Доходность ~ MKTRF + SMB + HML + RMW + CMA + MOM + TERM + DEF». Это известно как «первый проход» процедуры Фамы-Макбета на многофакторной основе.

Проблема в том, что эта регрессия должна выполняться на скользящей основе с окно установлено на 60 периодов , но самое главное по группам .

Хотя на этой странице есть множество примеров такой "скользящей по группам регрессии" , они почти исключительно имеют дело с однофакторной регрессией, что мешает мне правильно извлечь все необходимые коэффициенты (да, я новичок в R).

Чтобы опустить NA, которые вызывают проблемы, и сделать это быстрее, я преобразовал набор данных в его «длинную» версию. Обратите внимание, что НП появляются в первом фрейме данных из-за разных дат выпуска для разных ценных бумаг (B1: GB5) и могут быть удалены только без исключения других данных, которые не должны быть исключены, когда данные преобразуются в вертикальные (или длинные). ). Это приводит к появлению переменных «Компания» и «Доходность».

Наконец, после завершения регрессии, я хотел бы сохранить коэффициенты для каждой ценной бумаги в удобном и удобочитаемом виде с соответствующими метками, если это возможно. , и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...