2016-04-22 5 views
-3

Ich möchte um Hilfe bitten, wie neue Spalten kumulative Rückgaben von Bestandsdaten zu erstellen. Meine Daten sind wie folgt aufgebaut:R Programmieren kumulative Rückholperioden Berechnungen mit Datentabelle

Month  Stock Ret 

Jan-2001 A  0.01  
Feb-2001 B  0.02  
Jan-2002 B  0.01  
Feb-2002 B  0.03 

Die Daten sind für 10 Jahre. Ich möchte kumulative Renditen in 12-Monats-Schritten für jede Aktie berechnen.

Zum Beispiel würde die erste Periode der Rückkehr von Januar 2001 bis Dezember 2001 abdecken. Die zweite Periode wäre von Februar 2001 bis Jan-2002 und so weiter.

Diese Berechnungen würden pro Bestand durchgeführt werden und würden für jede Periodenberechnung nicht kumulative Erträge verwenden. Da ich viele Jahre lang viele Aktien hatte, wollte ich sehen, ob es eine effizientere Möglichkeit gibt, diese Berechnungen durchzuführen als eine For-Schleife.

Ich habe nach Möglichkeiten gesucht, es mit data.table Paket zu versuchen, aber ich bin unsicher, wie das geht.

Edit:

Vielleicht ist meine Loop-Funktion kann besser erklären, was ich erreichen will.

my.data <- data.frame(Date = seq.Date(as.Date('2001-01-01'), by ='month', length = 24), stock = factor(c(rep('A', 2*12), rep('B', 2*12))), Ret = c(rep(c(.02,.01,0,.03,.02,.01,02,.01,0,.03,.02,.01), 2))) 

final_table <- list() 
num_periods <- 2*12-12 


for(i in unique(my.data$stock)){ 

    ts_i = ts(my.data[my.data$stock==i, 'Ret']) 

    table_i = matrix(nrow=length(ts_i), ncol=15) 

    num_periods = length(ts_i)-12 

    table_i[,1] = ts_i 

    table_i[,14] = i 

    table_i[,15] = ts(my.data[my.data$stock==i,'Date']) 

    for(j in 1:num_periods){ 
    myperiod = cumprod(ts_i[j:(j+11)]+1)-1 
    table_i[12+j,2:13] = myperiod 
    } 
colnames(table_i) = c('original', paste0('p',-12:-2),'p1','stock','Date') 
final_table[[i]] = table_i 
} 

new.my.data = do.call('rbind',final_table) 

new.my.data = na.omit(new.my.data) 
+0

Frage fehlt reproduzierbaren Beispiel – jangorecki

+0

Vielleicht kann meine Loop-Funktion besser erklären, was ich erreichen möchte. – Joshua

Antwort

0

Wenn ich richtig verstanden habe, wollen Sie jährliche Summe von Ret für einzelne Aktien. Erstens würde ich Jahre aus Ihren Daten extrahieren, indem

df <- cbind(do.call('rbind',strsplit(df$Month,"-")),df[,c(2,3)]) 
names(df)[c(1,2)] <- c("Month","Year") 

Dann

aggregate(df[,"Ret"],by=list("Year" = df$Year,"Stock"=df$Stock),FUN=sum) 

Welche df in diesem Format produziert

Year Stock x 
1 2001  A 0.04 
2 2002  B 0.04 
3 2003  B 0.02 

die Daten nach Jahr und Lager aggregieren und es sollte nicht sein ein Problem, das zu visualisieren.

Bearbeiten:

Was ist damit?

aggregate(df[,"Ret"],by=list("Year" = df$Year,"Stock"=df$stock),FUN= function(x) {return (cumprod (x+1)-1)}) 

, die so etwas wie dies produzieren sollte:

Year Stock  x.1  x.2  x.3  x.4  x.5  x.6   x.7  x.8  x.9  x.10  x.11  x.12 
1 2001  A 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
2 2002  A 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
3 2001  B 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
4 2002  B 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 

Dies wird berichtet, pro Jahr, aber ich denke, Sie bearbeiten können und Monat/Jahr kategorisieren, so dass es leicht Ihren Anforderungen entspricht.

+0

Hallo Marek, danke für deine Antwort. Das Beispiel, das Sie angegeben haben, ist nicht ganz das, wonach ich suche. Ich habe meine Frage so bearbeitet, dass sie einen Beispielcode enthält, nach dem ich suche. – Joshua

Verwandte Themen