在回归方程式中应用rollroll的问题

问题描述 投票:0回答:1

[我正在使用每日库存数据,我正在尝试从t-11个月时间窗口内的每日库存数据计算出t月份的每月Beta(例如,12月的Beta包含从1月到12月(含)在内的每日库存数据) 。另外,我想在回归方程中至少包含150个观察值。 ->Link to data screenshot

我想通过计算过去12个月中股票超额收益相对市场超额收益的回归系数来计算beta。我的样本数据在最后一列中列出了每只股票的超额收益(股票按数字分类)和市场收益mktrf。

我想出了以下代码,但不幸的是我找不到错误:在过去的12个月中,我以天为单位使用width = 252,但尚未在代码中包含至少150个观察值的先决条件。当股票退市时,我也对NA感到麻烦。我已经搜索了论坛,但只能找到与答案相同的代码,所以我不知道自己在做什么错。

rollingbeta <- rollapply(joined_data,
                     width=252,
                     FUN = function(x) {
                       t = lm(formula=paste0(" ` ", x , " ` ~ mktrf"), data = x, na.rm=T);
                       return(t$coef) },
                     by.column=TRUE, 
                      align="right")

理想情况下,我希望以与输入表相同的数据格式搜索输出。

对此有何想法?不胜感激!

这里是使用dput创建的示例:

structure(list(date = structure(c(16804,16805,16806,16807,16808、16811、16812、16813、16814、16815),类=“日期”,10001 = c(NA,-0.0132978723404255、0.0148247978436657、0.0146082337317397,0.0196335078534031、0.0346598202824133、0.0235732009925558、0,-0.0145454545454544,-0.0172201722017221),93436 = c(NA,8.95215075422673e-05,-0.0196482119679542,-0.0154766252739225,-0.0215627173661025,-0.0149289099526067、0.0101996632186674,-0.0460065723674811,0.0293045779042485,-0.00577165583470751),mktrf = c(-0.0159,0.0012,-0.0135,-0.0244,-0.0111,-6e-04、0.0071,-0.0267、0.0165,-0.0214)),row.names = c(NA,10L),class =“ data.frame”)

r dplyr lm rollapply
1个回答
0
投票

我无法读取您的数据,但是使用BOD(R附带),我们使用5行的窗口执行滚动回归,或者如果5行不可用,则使用至少3行的可用行数可用。我们还要检查至少有3个完整的案例。

我们通过使用宽度矢量而不是单个宽度来进行上述操作。此向量指示要使用的行数。如果至少有5行可用,则使用5,否则使用可用行数;否则,使用5。但是,如果可用的行数少于3,则我们使用3,这将导致为该行生成NA。

coefs内,我们还将检查是否少于3个完整案例,如果是,则返回NA。

library(zoo)

n <- nrow(BOD)  # 6
w <- pmax(pmin(1:n, 5), 3)  # 3 3 3 4 5 5

coefs <- function(x) {
  if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}
rollapplyr(BOD[2:1], w, coefs, by.column = FALSE, fill = NA)

给予:

     (Intercept)     Time
[1,]          NA       NA
[2,]          NA       NA
[3,]    1.833333 5.350000
[4,]    5.450000 3.180000
[5,]    7.750000 2.030000
[6,]   10.674324 1.301351

这给出了相同的内容:

rbind(c(NA, NA), 
      c(NA, NA), 
      coefs(BOD[1:3, 2:1]), 
      coefs(BOD[1:4, 2:1]), 
      coefs(BOD[1:5, 2:1]), 
      coefs(BOD[2:6, 2:1]))

更新

添加的较短的dput输出给出了语法错误,但这一次它足够短,以至于我可以将其编辑(请参见末尾的注释)为有效的内容。

我们使用8的宽度,如果可用的宽度小于8,则使用最小4的宽度,否则返回NA。另外,如果coefs,我们至少使用3个完整的案例。

我们将DF转换为Zoo对象,并假设最后一列(第3列)是因变量,而其他2列是自变量。

library(zoo)

n <- nrow(DF)  # 10
w <- pmax(pmin(1:n, 8), 4)  #  [1] 4 4 4 4 5 6 7 8 8 8


coefs <- function(x) {
  if (sum(complete.cases(x)) >= 3) coef(lm(as.data.frame(x))) else c(NA, NA)
}

z <- read.zoo(DF)[, c(3, 1, 2)]
rollapplyr(z, w, coefs, by.column = FALSE, fill = NA)

给这个动物园对象:

            (Intercept)     `10001`    `93436`
2016-01-04           NA          NA         NA
2016-01-05           NA          NA         NA
2016-01-06           NA          NA         NA
2016-01-07 -0.031077046 -2.44567879 -2.7398798
2016-01-08 -0.034601587 -2.65028219 -3.2757924
2016-01-11  0.003069533  0.35951677  1.2452355
2016-01-12 -0.001737647  0.15052197  0.7341502
2016-01-13 -0.001773568  0.09143210  0.5979455
2016-01-14 -0.001173643  0.07543222  0.6164919
2016-01-15 -0.005337689  0.28461054  0.6305395

注意

DF <- structure(list(date = structure(c(16804, 16805, 16806, 16807, 
16808, 16811, 16812, 16813, 16814, 16815), class = "Date"), `10001` = c(NA, 
-0.0132978723404255, 0.0148247978436657, 0.0146082337317397, 
0.0196335078534031, 0.0346598202824133, 0.0235732009925558, 0, 
-0.0145454545454544, -0.0172201722017221), `93436` = c(NA, 8.95215075422673e-05, 
-0.0196482119679542, -0.0154766252739225, -0.0215627173661025, 
-0.0149289099526067, 0.0101996632186674, -0.0460065723674811, 
0.0293045779042485, -0.00577165583470751), mktrf = c(-0.0159, 
0.0012, -0.0135, -0.0244, -0.0111, -6e-04, 0.0071, -0.0267, 0.0165, 
-0.0214)), row.names = c(NA, 10L), class = "data.frame")
© www.soinside.com 2019 - 2024. All rights reserved.