在R中创建Fama-Franch三因子回归循环



我正在从一个大型数据集crsp中为每只股票估计3-Fama-French因子和4-Fama-Franch因子模型。我想知道应该在R中运行什么语法,为每个公司创建一个循环,以生成各自的Fama-french回归。我已经尝试了这里建议的一些循环代码,但它们不起作用。我的数据表crsp如下所示:crsp 的屏幕截图

在控制台中,它看起来像

Browse[1]> head(crsp)
date                       COMNAM PERMNO SICCD    PRC    VOL       RET SHROUT
1: 1995-01-31                       AMERCO  81073  6710 19.750   3367  0.136691  32857
2: 1995-01-31            AMERICAN ECO CORP  76481  3089  2.125    295 -0.170732   6822
3: 1995-01-31         AMERICAN STUDIOS INC  77901  7220  2.750   3075  0.000000  21426
4: 1995-01-31                ANGELICA CORP  45583  2337 26.375   3374 -0.045249   9458
5: 1995-01-31 ASSISTED LIVING CONCEPTS INC  81051  8059  7.750   1348 -0.088235   3000
6: 1995-01-31              BLOCK H & R INC  49373  7299 35.750 108603 -0.037037 105596
capitalization   dateff mktrf     smb    hml     rf     umd year
1:      648925.75 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995
2:       14496.75 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995
3:       58921.50 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995
4:      249454.75 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995
5:       23250.00 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995
6:     3775057.00 19950131 0.018 -0.0353 0.0254 0.0042 -0.0182 1995

我需要估计95家公司,每家公司的月度数据数量并不相同,总共有6000多个观察结果。

到目前为止,我使用AMERCO独有的300多个观测值对一家名为AMERCO的公司进行了回归,并编码如下:


### calculate excess return for AMERCO
crsp[, retrf := RET - rf]
AMERCO_PERMNO<- 81073
crsp.AMERCO <- crsp[PERMNO == AMERCO_PERMNO]
View(crsp.AMERCO)
# run 3 FFF for AMERCO
fit2 <- feols(retrf ~ mktrf + smb + hml, data = crsp.AMERCO)
summary(fit2)

这在AMERCO的回归中得到了很好的回报,但现在我不知道下一步该从哪里开始,在一个循环中回归其余94家公司的所有数据。

我是R-studio的新用户,非常感谢您的帮助!Thx提前:(

您可以尝试split+lapply方法:

lapply(split(crsp, crsp$PERMNO), function(x) {
fit2 <- feols(retrf ~ mktrf + smb + hml, data = x)
summary(fit2)
}) -> result

by:相同

by(crsp, crsp$PERMNO, function(x) {
fit2 <- feols(retrf ~ mktrf + smb + hml, data = x)
summary(fit2)
}) -> result

用于回归的函数feols是为更复杂的问题设计的。使用函数lm的简单回归对于Fama French来说应该很好。一个简单的方法是:

fit2 <- sapply(unique(crsp$COMNAM),
FUN = function(x) { fit = lm(RET ~ mktrf + smb + hml,
data = crsp,
subset = (COMNAM == x) ); 
coef(fit) }) 
fit2 <- t(fit2)

或者,像Ronak Shah那样使用split函数,

fit3 <-  sapply(split(crsp, crsp$COMNAM),
FUN = function(x) { fit = lm(RET ~ mktrf + smb + hml,
data = x ); 
coef(fit) })
fit3 <- t(fit3) 

最新更新