我正在处理每日股票数据,并试图从t-11个月时间窗口的每日股票数据中计算月β值(例如,Dec的beta值包含从1月到12月的每日股票数据)。另外,我想在回归方程中包含至少150个观测值。->Link to data screenshot
我想通过计算过去12个月超额股票回报率的回归系数来计算β值。我的样本数据列出了每只股票的超额回报(股票按一个数字分类)和最后一栏中的市场回报mktrf。
我想出了以下代码,但不幸的是我找不到错误:我在过去的12个月中使用了width=252,但还没有在代码中包含至少150个观察的先决条件。当股票被退市时,我也遇到了NAs的麻烦。我已经搜索了论坛,我只能在答案中找到相同的代码,所以我不知道我做错了什么。
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创建的示例:
结构(Date=structure(Date= structure(c(16804,16805,16806,16807,16808,16811,16812,16813,16814,16815),class = "Date"),
10001= c(NA,-0.0132978723404255,0.0132978723404255,0.0132978723404255,10001=c),93436=c,93436= c(NA,8.95215075422673e-05,-05,-0.0215627173661025,-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”
发布于 2019-09-28 20:22:12
我无法读取您的数据,但是使用BOD (即R附带的),我们使用5行窗口执行滚动回归,如果5行不可用,则使用可用的行数,前提是至少有3行可用。此外,我们检查至少有3个完整的案例。
我们使用宽度向量而不是单一宽度来完成上述操作。此向量指示要使用的行数。如果至少有5行可用,我们使用5,否则使用可用行数;但是,如果可用行数小于3,则使用3,这将导致为该行生成NAs。
在coefs中,我们还检查是否有少于3个完整的情况,如果有,则返回NAs。
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,否则我们返回NAs。另外,如果coefs的话,我们至少要使用3种完整的情况。
我们将DF转换成一个动物园对象,并假设最后一列(第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")https://stackoverflow.com/questions/58149846
复制相似问题