我的数据是截至2016年9月的最长165个月的证券月度回报。我想计算从2003年1月1日到9月1日每种证券的三年远期回报。30 2013年,但一些证券来来去去,我担心存活者偏见。为了解决这个问题,我需要计算三年的平均年回报率,这将给出一个我可以使用的结果,即使证券在给定的起始点之外有少于36条记录。当我分离计算单个证券和起点的平均年回报所需的37条记录时,这很简单:
library(dplyr)
df <-
df %>%
arrange(date) %>%
mutate(cumProds = cumprod(1 + return))
avgAnnRet <- with(tail(df,1), cumProds^(12/nrow(df)))但对于每种证券,我可以有多达129个起点来计算,我有数千种证券。我已经在dplyr组中尝试了rollapply和cumprod的各种迭代,但我无法让它们中的任何一个起作用。是否可以使用单个语句(dplyr或其他语句)按安全性和开始日期分组,并执行滚动cumprod计算。当然,在我的实例中,无论有37条记录还是更少记录,我都需要它来返回结果。
我写了一个循环,它将完成所需的子集和数学运算,但它显然非常慢。
发布于 2017-03-01 05:20:31
RccpRoll的作者Kevin Ushey好心地给了我一个变通的方法,因为roll_prod不会为部分窗口返回值。它工作得很好,在大约200万条记录上运行得非常快:
df %>%
arrange(secId, date) %>%
group_by(secId) %>%
mutate(product = as.numeric(rollapply(1 + return, 37, prod,
partial = TRUE, align = "left")))发布于 2017-11-20 12:41:42
我有一个类似的问题,部分数据是不可接受的(即,如果37个数据点中只有36个可用,那么我希望产品是NA)。当我在partial = TRUE中使用Tom的rollapply想法时,我得到了一个错误消息,比如
Error in mutate_impl(.data, dots) :
Column `product` must be length 11 (the group size) or one, not 37原来缺少的是fill = NA
df %>%
arrange(secId, date) %>%
group_by(secId) %>%
mutate(product = rollapply(1 + return, 37, prod, fill = NA, partial = FALSE, align = "left"))https://stackoverflow.com/questions/42511751
复制相似问题