Средневзвешенная цена с поправкой на новые покупки и продажи в r

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

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

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

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


person Marina Verçoza Viana    schedule 16.01.2020    source источник
comment
Пожалуйста, покажите ожидаемый результат   -  person akrun    schedule 16.01.2020
comment
Формула не понятна R1 =(Buy-Sell)Price Вы умножаете цену   -  person akrun    schedule 16.01.2020
comment
Пожалуйста, предоставьте полный код, например. включая ваш расчет для R1.   -  person Samuel    schedule 16.01.2020
comment
Да, я умножаю цену. Но для следующей строки мне нужно правильно учитывать значения продаж по весу.   -  person Marina Verçoza Viana    schedule 17.01.2020
comment
Я действительно потерян. Просто распространял и собирал, пытаясь лучше обработать данные.   -  person Marina Verçoza Viana    schedule 17.01.2020


Ответы (1)


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

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)
person Allan Cameron    schedule 16.01.2020
comment
Спасибо, проблема в том, что на стоимость акций влияют предыдущие продажи. Поэтому я не могу просто умножать на строки. - person Marina Verçoza Viana; 17.01.2020