多次滚动回归(Fama-Macbeth过程)

时间:2020-04-26 16:16:22

标签: r linear-regression na rolling-computation

问题简介

大家好,

我目前正在使用著名的Fama-Macbeth滚动窗口过程来完成我的论文,以估计具有许多自变量且面板数据不平衡的模型。将与不同的多因素模型进行比较。这里我要求完整的代码(8个因素),因为完整的代码将用作较小模型的参考。

问题就在这里出现,因为网络上的许多教程都涉及滚动回归,但很少有以多元回归的方式展示它的。我的编码知识目前不足以在没有足够参考以前的示例的情况下提出这样的问题。 而且,如果有人对Python有更好的了解,我也将非常感谢此代码的Python版本。

我研究了许多类似的问题,但是除了一个问题,我找不到适合我的数据的东西。似乎最快的方法之一是使用矩阵代数或“ rollRegres”。好吧,“ rollRegres”版本可以正常工作,直到我的数据显示缺失值(空白单元格)自动转换为“ NA”为止。但是,这些丢失的数据按不同的证券显示不同的发行日期,这意味着对这些丢失的单元格不采取任何措施。

因此,如果有人知道如何加快此代码的速度(在大型数据集的情况下效率不高),提出其他建议或正确地向我展示如何以矩阵形式进行操作,我将由衷地感谢。 / p>

摘要:

  • 滚动回归(8天+ 1300 dep。var,窗口为60天)-需要beta
    • 大型数据集“ Y”(每个具有1000个条目的1300个深度变量)
    • 数据集“ X”(8个ind。var's-factor-全部具有1000个条目)
  • 任何使它健壮的可能性(用成功的库MASS的rlm()替换lm()
  • 由于发布日期(数据的特殊性)不同,数据集“ Y”中的不适用
  • 效率(速度问题)
  • 输出(导出问题)

代码

公平地复制我的数据集如下。请记住,原始数据集要大得多,而这样的代码将远非高效。

###LIBRARIES
library(zoo)


###DATASET

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)))


###REGRESSION

#Setting the problem
z <- read.zoo(df, FUN = as.yearmon, format = "%Y/%m/%d")
View(z)

getCoef <- function(z, lhs, rhs) {
  if (all(is.na(z[, lhs]))) "Empty"         #"Empty" is for me to spot empty cells due to different issue dates
  else coef(lm(paste(lhs, "~", rhs), z))
}

roll <- function(z, lhs, rhs = "MKTRF + SMB + HML + RMW + CMA + MOM + TERM + DEF") {
  rollapplyr(z, 60, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs)
}

ynames <- c("B1", "B2", "B3", "B4", "B5", "GB1", "GB2", "GB3", "GB4", "GB5")

#Regress
L <- lapply(ynames, roll, z = z)

#Save outputs
output <- Map(fortify.zoo, L)


此代码源于Stack-Overflow上的类似问题,虽然有效,但在输出中显示了一个小问题(在屏幕截图中将变得很清楚-数据的第一行呈金字塔形)。而且,它对于长数据集绝对不是有效的。最后,我想以简洁明了的方式导出每种安全性的所有beta(在本例中为B1:GB5);现在这些保留在“输出”列表中;最好在桌子上打开并带有注释。

如果有人愿意提出任何类型的改进,那么将不胜感激。而且,我认为这对于处理此类回归问题的其他人可能仍然是可靠的参考。

Image - Pyramidal_outputs

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以进行一些改进:

  • 使用矩阵X和Y
  • 对于每个子集,我们可以一次回归所有Y列,从而将对回归函数的调用次数减少一个数量级
  • 处理NA错误
  • 在索引上而不是数据上滚动
  • 使用.lm.fit代替lm
  • 将结果重塑为3d数组

这将导致以下代码。


exports.handler = async (event, context, callback) => {
    console.log('function started')
    let params = {
        TableName: "documents"
    }

    console.log('params get')
    let respond = await db.scan(params, (err, data) => {
        console.log('scan started')
        if (err) console.log(err, err.stack);
        else {
            console.log('else started')

           return data
        }
    })
    console.log('Respons IS: ')
    console.log(respond)
};