价格加权平均值,根据r中的新购买和出售进行调整

问题描述 投票:-1回答:1

[我正试图找出我的股票买卖后的最终加权均值。

所以我正在寻找一个加权平均数,可以通过买卖进行调整。

这是我的数据示例。我的股票不只一种,但我可以使用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。因此,它不会使所有平均值相加。

感谢您的贡献!

r price weighted-average
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.