data.table 中的 Newey West 调整

Newey West Adjustment in data.table

我有一个关注者data.table

PrevMonth   Portfolio   ExcessReturn
196306  Portfolio 1 -0.3035362
196306  Portfolio 10    -1.250766
196306  Portfolio 2 1.08474287
196306  Portfolio 3 -0.628247
196306  Portfolio 4 -0.2490027
196306  Portfolio 5 0.47310531
196306  Portfolio 6 0.36409036
196306  Portfolio 7 -0.8392494
196306  Portfolio 8 -0.5734843
196306  Portfolio 9 -1.9914358
196306  Portfolio LS    -0.9472298
196307  Portfolio 1 3.29524841
196307  Portfolio 10    6.47879571
196307  Portfolio 2 2.8880775
196307  Portfolio 3 4.35083011
196307  Portfolio 4 4.2523679
196307  Portfolio 5 4.30965798
196307  Portfolio 6 4.68137361
196307  Portfolio 7 4.34311633
196307  Portfolio 8 7.04824776
196307  Portfolio 9 7.35395871
196307  Portfolio LS    3.18354731
196308  Portfolio 1 -0.4837659
196308  Portfolio 10    -0.8704307
196308  Portfolio 2 -1.8642527

我希望能够执行 t 检验以拒绝每月平均超额 Return 为零的空值,为此我想进行 Newey West 调整,滞后为 1错误。因此,我对按月分​​组的常数进行 Excess Return 回归,并进行 Newey West 调整。

我最后想报告每个投资组合的 Newey West 调整后 t 统计和每月平均超额 return。

这是我所做的:

TS_Sample_Beta_Portfolio_Final<-Sample_Beta_Portfolio_Final[,list(coeftest(lm(ExcessReturn~1),
                                  vcov = NeweyWest(lm(ExcessReturn~1),lag = 12))),by=c("PrevMonth")]

其中Sample_Beta_Portfolio有以上数据。

但这似乎不起作用。

如有任何帮助,我们将不胜感激!

问题是您的 list 调用将 coeftest 的输出封装在一个列表中,即包含一个 class coeftest 元素的列表。相反,您想要的是一个列表,其中包含 coeftest 生成的每个单独的统计信息。所以你可以使用 as.list 代替:

Sample_Beta_Portfolio_Final[, as.list(coeftest(lm(ExcessReturn~1), 
                                               vcov=NeweyWest(lm(ExcessReturn~1), 
                                                              lag=12))),
                            by=c("PrevMonth")]

这种方法的问题在于它不会正确命名您的结果,因为 as.list 丢弃了您的 dimnames。另一种方法是编写一个 fit 函数来重命名输出列表。

首先,加载库和数据:

library(data.table)
library(sandwich)
library(lmtest)

dat = fread("PrevMonth -Portfolio   ExcessReturn
196306-Portfolio 1 -0.3035362
196306-Portfolio 10    -1.250766
196306-Portfolio 2 1.08474287
196306-Portfolio 3 -0.628247
196306-Portfolio 4 -0.2490027
196306-Portfolio 5 0.47310531
196306-Portfolio 6 0.36409036
196306-Portfolio 7 -0.8392494
196306-Portfolio 8 -0.5734843
196306-Portfolio 9 -1.9914358
196306-Portfolio LS    -0.9472298
196307-Portfolio 1 3.29524841
196307-Portfolio 10    6.47879571
196307-Portfolio 2 2.8880775
196307-Portfolio 3 4.35083011
196307-Portfolio 4 4.2523679
196307-Portfolio 5 4.30965798
196307-Portfolio 6 4.68137361
196307-Portfolio 7 4.34311633
196307-Portfolio 8 7.04824776
196307-Portfolio 9 7.35395871
196307-Portfolio LS    3.18354731
196308-Portfolio 1 -0.4837659
196308-Portfolio 10    -0.8704307
196308-Portfolio 2 -1.8642527")

然后,定义fit函数并将其应用于每个组:

fit = function(x) {
  m = lm(ExcessReturn~1, x)
  v = NeweyWest(m, lag=12)
  ct = coeftest(m, vcov=v)
  out = as.list(ct)
  names(out) = dimnames(ct)[[2]]
  out[["r2"]] = summary(m)$r.squared
  out
}

dat[, fit(.SD), by="PrevMonth"]

#>           PrevMonth   Estimate Std. Error   t value     Pr(>|t|) r2
#> 1: 196306-Portfolio -0.4419102  0.1596251 -2.768425 1.984085e-02  0
#> 2: 196307-Portfolio  4.7441110  0.2203860 21.526374 1.044449e-09  0
#> 3: 196308-Portfolio -1.0728164  0.1614823 -6.643553 2.191480e-02  0

请注意,这会产生警告,因为您指定的滞后多于每个组中的观察值。