2016-04-15 2 views
1

So sieht mein data.frame aus. Die Spalte ganz rechts (Performance) ist meine gewünschte Spalte.Kumulative Portfolio-Leistung nach Name

library(data.table) 
    dt <- fread(' 
    Name  FundName  SharePrice TotalShares PurchaseDate Performance 
    John  A    10   500   2016-01-01  0% 
    John  A    20   1000   2016-02-01  20%  
    John  A    10   1500   2016-03-01  -25%%   
    John  B    30   500   2016-04-01  -18.18%  
    John  B    60   1000   2016-05-01  4.16%  
    Tom  A    10   500   2016-01-01  0% 
    Tom  A    20   1000   2016-02-01  20%  
    Tom  A    10   1500   2016-03-01  -25%%   
    Tom  B    30   500   2016-04-01  -18.18%  
    Tom  B    60   1000   2016-05-01  4.16%      
     ') 
  • Für die erste Reihe, kaufte John 500 Aktien zu einem Preis von $ 10. Also hat er 5000 Dollar ausgegeben und kann seine Position für 5000 Dollar an diesem Tag verkaufen. Die Leistung für die erste Zeile ist also 0%.
  • Für die zweite Reihe hat John insgesamt (10 * 500) + (20 * 1000) = 25000 ausgegeben und er kann seine Position für (20 * 1500 Aktien) oder 30000 Dollar verkaufen. Also ist seine kumulative Leistung (30000-25000)/25000 oder 20%.
  • Für die dritte Reihe verbrachte er insgesamt (10 * 500 + 20 * 1000 + 10 * 1500) = 40000 Dollar und kann für (10 * 3000 Aktien) oder 30000 Dollar verkaufen, damit die Leistung von -25%.
  • Jetzt für die 4. Reihe gibt es zwei Mittel (A & B); er kann seine A-Position für 30000 immer noch verkaufen, da ich annehme, dass der Preis von A immer noch 10 $ pro Aktie beträgt, und er kaufte seine neue B-Position für (30 * 500) = 15000. So kann er seine Position sowohl für A (A) & B für (30000 + 15000) = 45000 verkaufen, aber er verbrachte (40000 + 15000) oder 55000 so weit. also ist seine kumulative Leistung für die 4. Reihe (55000-45000)/55000 oder -18,18%.

Ich hoffe, es macht Sinn. Ich habe Schwierigkeiten, den Preis beider Fonds zu ermitteln, wenn ich versuche, die kumulative Leistung zu berechnen. Danke für Ihre Hilfe.

Antwort

0

würde ich die Daten erweitert alle Datum Fonds Combos für jede Person zu decken:

dt_skel = dt[, do.call(CJ, c(.SD, unique=TRUE)), 
    by=Name, .SDcols=c("FundName", "PurchaseDate")] 

dt_full = dt[dt_skel, on=names(dt_skel)] 
dt_full[ is.na(TotalShares), TotalShares := 0L] 
dt_full[ , SharePrice := SharePrice[1L], by=.(Name, FundName, cumsum(!is.na(SharePrice)))] 

Dann Aggregat

res = dt_full[!is.na(SharePrice), .(
    PurchaseDate, 
    spent = cumsum(TotalShares*SharePrice), 
    value = cumsum(TotalShares)*SharePrice 
), by=.(Name, FundName)][, .(
    value = sum(value), 
    spent = sum(spent) 
), by=.(Name, PurchaseDate)] 


    Name PurchaseDate value spent 
1: John 2016-01-01 5000 5000 
2: John 2016-02-01 30000 25000 
3: John 2016-03-01 30000 40000 
4: John 2016-04-01 45000 55000 
5: John 2016-05-01 120000 115000 
6: Tom 2016-01-01 5000 5000 
7: Tom 2016-02-01 30000 25000 
8: Tom 2016-03-01 30000 40000 
9: Tom 2016-04-01 45000 55000 
10: Tom 2016-05-01 120000 115000 

Um die Performance-Metrik zu der ursprünglichen Transaktionen Tabelle hinzufügen:


Unter der Annahme, Termine sind immer monatlich, können Sie dt_skel kleiner mit

dt_skel = dt[, MaxDate := max(PurchaseDate), by=Name][, 
    seq(from = PurchaseDate[1L], to =MaxDate[1L], by="month"), by=.(Name, FundName)] 

Natürlich machen, Termine als Date oder IDate für diese arbeiten formatiert werden soll.

+0

Vielen Dank für Ihre Antwort. – gibbz00

+0

Vielen Dank Frank. Die Daten sind in der Regel überall, nicht unbedingt monatlich. – gibbz00