2017-02-08 6 views
2

У меня есть набор временных рядов, и я бы хотел получить 12-месячную совокупную прибыль. Ниже то, что мой код и данные выглядят так:R: Рассчитать 12-месячную совокупную доходность

df <- data.frame(
    A = c(-0.0195, 0.0079, 0.0034, 0.0394, -0.0065, 0.0034, 0.0136, 0.0683, -0.0063, -0.0537, -0.0216, -0.0036, 0.0659, -0.0377, -0.0568, 0.0039, -0.0191, 0.0028), 
    B = c(-0.0211, 0.0021, 0.0014, 0.0358, 0.0009, 0.0153, 0.0071, 0.0658, 0.0033, -0.0542, -0.0261, 0.0064, 0.0665, -0.0304, -0.0507, 0.0089, NA, NA), 
    C= c(-0.0176, 0.0144, 0.0057, 0.0442, -0.0152, -0.0105, 0.0213, 0.0712, -0.0176, -0.0531, -0.0163, -0.0154, 0.0652, NA, NA, NA, NA, NA) 
) 
row.names(df) <- c("2016-10-31", "2016-09-30", "2016-08-31", "2016-07-31", "2016-06-30", "2016-05-31", "2016-04-30", "2016-03-31", "2016-02-29", "2016-01-31", "2015-12-31", "2015-11-30", "2015-10-31", "2015-09-30", "2015-08-31", "2015-07-31", "2015-06-30", "2015-05-31") 

> df 
        A  B  C 
2016-10-31 -0.0195 -0.0211 -0.0176 
2016-09-30 0.0079 0.0021 0.0144 
2016-08-31 0.0034 0.0014 0.0057 
2016-07-31 0.0394 0.0358 0.0442 
2016-06-30 -0.0065 0.0009 -0.0152 
2016-05-31 0.0034 0.0153 -0.0105 
2016-04-30 0.0136 0.0071 0.0213 
2016-03-31 0.0683 0.0658 0.0712 
2016-02-29 -0.0063 0.0033 -0.0176 
2016-01-31 -0.0537 -0.0542 -0.0531 
2015-12-31 -0.0216 -0.0261 -0.0163 
2015-11-30 -0.0036 0.0064 -0.0154 
2015-10-31 0.0659 0.0665 0.0652 
2015-09-30 -0.0377 -0.0304  NA 
2015-08-31 -0.0568 -0.0507  NA 
2015-07-31 0.0039 0.0089  NA 
2015-06-30 -0.0191  NA  NA 
2015-05-31 0.0028  NA  NA 

Я хочу, чтобы получить 12-месячный совокупный доход для каждого месяца, используя формулу prod(1+R)-1 (произведение 12 индивидуальных возвращений периода минус 1). Результаты должны быть:

   A(1-Y) B(1-Y) C(1-Y) 
2016-10-31 0.0198 0.0322 0.0052 
2016-09-30 0.1086 0.1246 0.0898 
2016-08-31 0.0585 0.0881 
2016-07-31 -0.0050 0.0316 
2016-06-30 -0.0390 0.0048 
2016-05-31 -0.0512  
2016-04-30 -0.0517  

B(1-Y) имеет только 5 кумулятивных возвращения из B не имеет никаких данных ранее в 2015-07-31. Таким образом, он не удовлетворяет условию 12 месяцев (существует только 11 месяцев между 2015-07-31 и 2016-05-31).

Я пробовал Return.cumulative(df), но эта функция дает кумулятивные доходы с момента создания, что не то, что я ищу. Любое предложение будет оценено!

+1

Попробуйте 'rollapply' из' zoo', например. 'rollapply (df, 12, function (x) prod (x + 1) -1)' –

ответ

1

Как указывает А.web, rollapply дает желаемый результат. Вы также можете использовать цикл for.

a <- b <- c <- 0 
for(i in (nrow(df)-11):1){ 
    a[i] <- prod(1 + df$A[i:(i+11)]) - 1 
    b[i] <- prod(1 + df$B[i:(i+11)]) - 1 
    c[i] <- prod(1 + df$C[i:(i+11)]) - 1 
} 

cum.returns <- data.frame(a,b,c)