我正在从一个大型数据集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)