Средневзвешенная цена для с учетом новых партий и продаж в г - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь узнать окончательное средневзвешенное значение после покупок и продаж моих акций.

Поэтому я ищу средневзвешенное значение, которое будет скорректировано покупками и продажами.

Это пример моих данных. У меня есть более одной акции, но я могу подать заявку на другие, используя 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

Это работает очень хорошо. Но мне нужно group_by мой идентификатор. Так что в среднем все не получится.

спасибо за ваш вклад !!

1 Ответ

0 голосов
/ 17 января 2020

Я думаю, что было бы полезно подумать о сохранении некоторых полезных промежуточных значений, чтобы помочь с вычислением:

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