[英]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%
')
我希望這是有道理的。 在嘗試計算累積表現時,我正在努力跟蹤兩只基金的價格。 感謝您的幫助。
我將擴展數據以涵蓋每個人的所有 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)]
當然,日期應該格式化為Date
或IDate
才能正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.