我有一个数据框,包含“日期”,“公司”和“回报率”,可以通过下面的代码复制:
library(dplyr)
n.dates <- 60
n.stocks <- 2
date <- seq(as.Date("2011-07-01"), by=1, len=n.dates)
symbol <- replicate(n.stocks, paste0(sample(LETTERS, 5), collapse = ""))
x <- expand.grid(date, symbol)
x$return <- rnorm(n.dates*n.stocks, 0, sd = 0.05)
names(x) <- c("date", "company", "return")
使用这个数据框,我可以计算每日市场平均收益并将结果添加到一个新列"market.ret"中。
x <- group_by(x, date)
x <- mutate(x, market.ret = mean(x$return, na.rm = TRUE))
现在我想按不同的公司(在本例中为2家)对所有数据进行分组。
x <- group_by(x, company)
在完成这个操作之后,我想把 "return" 替换成 "market.ret" 并计算线性回归系数,将斜率存储在一个新的列中。如果我想在给定公司的整个数据集上进行拟合,那么我可以简单地调用 lm() 函数:
group_by(x, company) %>%
do(data.frame(beta = coef(lm(return ~ market.ret,data = .))[2])) %>%
left_join(x,.)
然而,我实际上想要在“滚动”基础上进行线性回归,即针对一个包含20天数据的时间段内的每一天分别进行回归。我想使用rollapply()函数,但不知道如何将两列数据传入该函数。任何帮助或建议都将不胜感激。
注:以下是我用于计算20天滚动收益率标准差的代码,可能会有所帮助:
sdnoNA <- function(x){return(sd(x, na.rm = TRUE))}
x <- mutate(x, sd.20.0.d = rollapply(return, FUN = sdnoNA, width = 20, fill = NA))
?rollapply
,并注意该页面上的滚动回归示例。 - G. GrothendieckRcppRoll
是另一个值得一试的工具。 - Tommy O'Dell