首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R滚动cumprod

R滚动cumprod
EN

Stack Overflow用户
提问于 2017-02-28 22:45:21
回答 2查看 2.2K关注 0票数 1

我的数据是截至2016年9月的最长165个月的证券月度回报。我想计算从2003年1月1日到9月1日每种证券的三年远期回报。30 2013年,但一些证券来来去去,我担心存活者偏见。为了解决这个问题,我需要计算三年的平均年回报率,这将给出一个我可以使用的结果,即使证券在给定的起始点之外有少于36条记录。当我分离计算单个证券和起点的平均年回报所需的37条记录时,这很简单:

代码语言:javascript
复制
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条记录还是更少记录,我都需要它来返回结果。

我写了一个循环,它将完成所需的子集和数学运算,但它显然非常慢。

EN

回答 2

Stack Overflow用户

发布于 2017-03-01 05:20:31

RccpRoll的作者Kevin Ushey好心地给了我一个变通的方法,因为roll_prod不会为部分窗口返回值。它工作得很好,在大约200万条记录上运行得非常快:

代码语言:javascript
复制
df %>%
arrange(secId, date) %>%
group_by(secId) %>%
mutate(product = as.numeric(rollapply(1 + return, 37, prod,
    partial = TRUE, align = "left")))
票数 3
EN

Stack Overflow用户

发布于 2017-11-20 12:41:42

我有一个类似的问题,部分数据是不可接受的(即,如果37个数据点中只有36个可用,那么我希望产品是NA)。当我在partial = TRUE中使用Tom的rollapply想法时,我得到了一个错误消息,比如

代码语言:javascript
复制
Error in mutate_impl(.data, dots) : 
  Column `product` must be length 11 (the group size) or one, not 37

原来缺少的是fill = NA

代码语言:javascript
复制
df %>% 
  arrange(secId, date) %>% 
  group_by(secId) %>% 
  mutate(product = rollapply(1 + return, 37, prod, fill = NA, partial = FALSE, align = "left"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42511751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档