用dplyr滚动窗口找到因子的值

时间:2017-09-13 03:08:33

标签: r dplyr

我有一个像这样的矩阵

 head(a)
# A tibble: 6 x 4
    date          ROE          ROFE        ROTFE
   <date>        <dbl>         <dbl>        <dbl>
1 2000-01-31  0.033968932  0.0324214815  0.010205926
2 2000-02-29  0.006891111 -0.0003352941 -0.005230147
3 2000-03-31  0.006158519  0.0213992647  0.040399265
4 2000-04-28  0.060022222  0.0151191176  0.047586029
5 2000-05-31 -0.016960000 -0.0287617647 -0.036209559
6 2000-06-30  0.034133577  0.0144456522  0.030756522

我想选择一个因素,该值在过去2个月内累积回报率最高。 我做过这样的事情并且有效。 但是,我的朋友告诉我,可以用一两行dplyr完成,我想知道你是否可以告诉我该怎么做。

index = as.Date(unique(a$date))
nmonth = 2;
mean.ROE = numeric()
for (i in 1:(length(index) - nmonth)) { # i = 2
    index1 = index[i]
    index2 = index[nmonth + i]
    index3 = index[nmonth + i+1]
    # Take a 2-month window of ROE returns:
    b = a[a$date >= index1 & a$date < index2,] %>% mutate(cum.ROE = cumprod(1 + ROE)) %>% mutate(cum.ROFE = cumprod(1 + ROFE)) %>% mutate(cum.ROTFE = cumprod(1 + ROTFE))

    # Use the cumulative return over the 2-month window to determine which factor is best.
    mean.ROE1 = ifelse(b$cum.ROE[nmonth] > b$cum.ROFE[nmonth] & b$cum.ROE[nmonth] > b$cum.ROTFE[nmonth], a[a$date == index3,]$ROE, ifelse(b$cum.ROFE[nmonth] > b$cum.ROE[nmonth] & b$cum.ROFE[nmonth] > b$cum.ROTFE[nmonth], a[a$date == index3,]$ROFE, a[a$date == index3,]$ROTFE))

    # Bind the answer to the answer vector
    mean.ROE = rbind(mean.ROE, mean.ROE1)
} 

1 个答案:

答案 0 :(得分:2)

创建一个函数maxret,它需要2 + nmonth行x,并计算前两行每列的累积回报r。对于其中最大的那些,返回x的最后一行中的值。

现在使用rollapplyr将其应用于宽度为2 +月的滚动窗口:

library(zoo)

maxret <- function(x) {
    r <- apply(1 + x[1:2, ], 2, prod)
    x[2 + nmonth, which.max(r)]
}

z <- read.zoo(as.data.frame(a))
res <- rollapplyr(z, 2 + nmonth, maxret, by.column = FALSE)

给动物园系列:

 > res
 2000-04-28  2000-05-31  2000-06-30 
 0.06002222 -0.03620956  0.03075652 

如果您想要数据框使用fortify.zoo(res)

注意:1 在问题中没有以可复制的形式提供输入,所以我假设了这个数据。框架:

Lines <- 
"date          ROE          ROFE        ROTFE
1 2000-01-31  0.033968932  0.0324214815  0.010205926
2 2000-02-29  0.006891111 -0.0003352941 -0.005230147
3 2000-03-31  0.006158519  0.0213992647  0.040399265
4 2000-04-28  0.060022222  0.0151191176  0.047586029
5 2000-05-31 -0.016960000 -0.0287617647 -0.036209559
6 2000-06-30  0.034133577  0.0144456522  0.030756522"
a <- read.table(text = Lines, header = TRUE)

注2:使用注释1中的输入或动物园1.8.1(动物园的开发版本)中的输入:

z <- read.zoo(as.data.frame(a))

可以简化为:

z <- read.zoo(a)

但是我们在主代码中添加了as.data.frame部分,因此即使在CRAN上使用当前版本的zoo,它也可以与tibbles和直接数据帧一起使用。