我正在使用每日库存数据,并且尝试从t-11个月时间窗口内的每日库存数据计算出t月份的每月Beta(例如,12月的Beta包含从1月到12月(含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”)
答案 0 :(得分: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")