我正在尝试买卖股票后的最终加权均值。
所以我正在寻找一个加权平均数,可以通过买卖进行调整。
这是我的数据示例。我的股票不只一种,但我可以使用group_by申请其他股票。
ledger <-data.table(
ID = c(rep("b",3), rep("x",2)),
Prc = c(10,20,15, 35,40),
Qty= c(300,-50,100, 50,-10),
Op =c("Purchase", "Sale", "Purchase", "Purchase", "Sale")
)
ledger<-ledger %>%group_by(ID)%>%
mutate(Stock = cumsum(Qty))
ledger<-as.data.table(ledger)
View(ledger)
在寻找答案时,我发现了以下代码:
ledger[, Stock := cumsum(Qty)] # compute Stock value
ledger[, `:=` ( id = .I, AvgPrice = NA_real_ ) ] # add id and AvgPrice columns
ledger[ 1, AvgPrice := Prc ] # compute AvgPrice for first row
# work with remaining rows and find the AvgPrice
ledger[ ledger[, .I[-1]], AvgPrice := {
if( Op == "Sale" ){
ledger[ .I-1, AvgPrice ]
} else {
round( ( ( Qty * Prc ) + ledger[ .I-1, AvgPrice * Stock ] ) /
( Qty + ledger[ .I-1, Stock]) ,
digits = 2 )
}
}, by = id ]
ledger[, id := NULL ] # remove id column
效果很好。但是我需要用我的ID来group_by。因此,它不会使所有平均值相加。
感谢您的贡献!
答案 0 :(得分:0)
我认为考虑存储一些有用的中间值以帮助进行计算会有所帮助:
DF$Net_Stocks <- DF$Buy - DF$Sell
DF$Stocks_Owned <- cumsum(DF$Net_Stocks)
DF$Cost <- DF$price * DF$Buy
DF$Sales <- DF$price * DF$Sell
DF$Net_Cost <- DF$Cost - DF$Sales
DF$Total_Cost <- cumsum(DF$Net_Cost)
DF$Cost_Per_Held_Stock <- DF$Total_Cost / DF$Stocks_Owned
现在您可以更好地了解正在发生的事情:
DF
#> ID price Buy Sell Net_Stocks Stocks_Owned Cost Sales Net_Cost Total_Cost Cost_Per_Held_Stock
#> b 10 100 50 50 50 1000 500 500 500 10.00000
#> b 20 200 100 100 150 4000 2000 2000 2500 16.66667
#> b 15 50 0 50 200 750 0 750 3250 16.25000
如果只希望最后一列的公式为:
cumsum((DF$Buy - DF$Sell) * DF$price) / cumsum(DF$Buy - DF$Sell)