Всем привет,
Я пытаюсь найти способ получить коэффициенты (бета) для множественной регрессии «Доходность ~ 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