簡體   English   中英

按名稱的累積投資組合表現

[英]Cumulative Portfolio performance by Name

這就是我的 data.frame 的樣子。 最右邊的列(性能)是我想要的列。

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%                    
      ')
  • 在第一行,約翰以 10 美元的價格購買了 500 股。 所以他花了5000塊錢,那天他可以賣掉他的頭寸5000塊錢。 所以第一行的性能是 0%。
  • 對於第二行,John 總共花費了 (10*500)+(20*1000)=25000,他可以以(20 * 1500 股)或 30000 美元的價格出售他的頭寸。 所以他的累積表現是(30000-25000)/25000或20%。
  • 第三排他總共花了(10*500+20*1000+10*1500)=40000塊錢,可以賣出(10*3000股)或30000塊錢,從而表現-25%。
  • 現在第四行,有兩只基金(A&B); 他仍然可以以 30000 的價格賣出他的 A 頭寸,因為我假設 A 的價格仍然是每股 10 美元,而他以 (30*500)=15000 的價格買入了新的 B 頭寸。 因此,他可以以 (30000+15000)=45000 的價格出售 A 和 B 的頭寸,但到目前為止他已經花費了 (40000+15000) 或 55000。 所以他在第四排的累積表現是(55000-45000)/55000或-18.18%。

我希望這是有道理的。 在嘗試計算累積表現時,我正在努力跟蹤兩只基金的價格。 感謝您的幫助。

我將擴展數據以涵蓋每個人的所有 Date-Fund 組合:

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

然后聚合

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

將性能指標添加到原始交易表中:

dt[res, ret := value/spent - 1, on=c("Name, PurchaseDate")]

假設日期總是每月,你可以用dt_skel變小

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

當然,日期應該格式化為DateIDate才能正常工作。

暫無
暫無

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

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