簡體   English   中英

在面板數據不均衡的情況下計算年化收益

[英]Calculating annualized return with uneven panel data set

我有以下面板數據:

         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 

我想獲得的是一個新列,其中包含每年各個ID的年度回報。 如果公司在一年中沒有完整的12個回報,例如本例中的id 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

我們可以按操作分組

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_))

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM