Расчет годовой доходности с неравномерным набором данных панели - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть следующие данные панели:

         id   date     returns  
         1    Jan 09 -0.07142857 
         1    Feb 09 -0.09615385 
         1    Mrz 09  0.03273322  
         1    Apr 09  0.14896989  
         1    May 09  0.06620690  
         1    Jun 09 -0.01811125 
         1    Jul 09 -0.07142857 
         1    Aug 09 -0.09615385 
         1    Sep 09  0.03273322  
         1    Oct 09  0.14896989  
         1    Nov 09  0.06620690  
         1    Dez 09  -0.01811125 

         2    Aug 09 -0.09615385 
         2    Sep 09  0.03273322  
         2    Oct 09  0.14896989  
         2    Nov 09  0.06620690  
         2    Dez 09 -0.01811125 

Я хотел бы получить новый столбец, в котором указаны годовые значения отдельных идентификаторов для каждого года.Если у фирмы нет полных 12 возвратов за год, например, идентификатор 2 в примере, то годовой доход должен основываться на имеющихся месяцах: например, RETannual = prod (1 + RETmonthly) ^ (1/5)

Результат должен выглядеть следующим образом:

         id   date     returns     RETan
         1    Jan 09 -0.07142857 
         1    Feb 09 -0.09615385 
         1    Mrz 09  0.03273322  
         1    Apr 09  0.14896989  
         1    May 09  0.06620690  
         1    Jun 09 -0.01811125 
         1    Jul 09 -0.07142857 
         1    Aug 09 -0.09615385 
         1    Sep 09  0.03273322  
         1    Oct 09  0.14896989  
         1    Nov 09  0.06620690  
         1    Dez 09  -0.01811125  0.00697433


         2    Aug 09 -0.09615385 
         2    Sep 09  0.03273322  
         2    Oct 09  0.14896989  
         2    Nov 09  0.06620690  
         2    Dez 09 -0.01811125   0.023432056

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Используя data.table, вы можете попробовать

df<- read.table(stringsAsFactors = FALSE, header = TRUE, text ="id   date     returns  
1    Jan-09 -0.07142857 
1    Feb-09 -0.09615385 
1    Mrz-09  0.03273322  
1    Apr-09  0.14896989  
1    May-09  0.06620690  
1    Jun-09 -0.01811125 
1    Jul-09 -0.07142857 
1    Aug-09 -0.09615385 
1    Sep-09  0.03273322  
1    Oct-09  0.14896989  
1    Nov-09  0.06620690  
1    Dez-09  -0.01811125 
2    Aug-09 -0.09615385 
2    Sep-09  0.03273322  
2    Oct-09  0.14896989  
2    Nov-09  0.06620690  
2    Dez-09 -0.01811125")

library(data.table)
setDT(df)[, .(RETan = prod(1+returns)^(1/.N)), by = id]

#returns
   id    RETan
1:  1 1.006974
2:  2 1.023432

Конечно, я не получаю тот же формат, что и вы, для этого вы можете попробовать:

setDT(df)[, .(date = date, RETan = c(rep(NA,.N-1),prod(1+returns)^(1/.N))), by = id]

#returns
    id   date    RETan
 1:  1 Jan-09       NA
 2:  1 Feb-09       NA
 3:  1 Mrz-09       NA
 4:  1 Apr-09       NA
 5:  1 May-09       NA
 6:  1 Jun-09       NA
 7:  1 Jul-09       NA
 8:  1 Aug-09       NA
 9:  1 Sep-09       NA
10:  1 Oct-09       NA
11:  1 Nov-09       NA
12:  1 Dez-09 1.006974
13:  2 Aug-09       NA
14:  2 Sep-09       NA
15:  2 Oct-09       NA
16:  2 Nov-09       NA
17:  2 Dez-09 1.023432
0 голосов
/ 12 сентября 2018

Мы можем сделать группу по операции

library(tidyverse)
library(zoo)
df1 %>% 
 group_by(id, year = year(as.yearmon(date, format = "%b %y"))) %>% 
 mutate(RETan =prod(1+returns)^(1/n()),
        RETan = replace(RETan, row_number() < n(), NA_real_))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...