Блоттер внутридневной реализованный PL

Это вопрос о реализованном PL транзакций в amzn_test demo пакета blotter R. Транзакции представляют собой последовательность из 7 сделок, которые открывают и закрывают позиции внутри дня. Вызов getTxns('amzn_port', 'amzn') возвращается

                    Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL
2010-01-14 00:00:00       0      0.00        0         0         0.00                   0
2010-01-14 10:18:50    -400    127.49        0    -50996       127.49               50996
2010-01-14 10:18:53     400    127.49        0     50996       127.49                   0
...

Почему Net.Txn.Realized.PL не равно нулю для транзакции открытия и ноль для транзакции закрытия? При ежедневных транзакциях реализованные прибыли и убытки будут ненулевыми в день закрытия транзакции.

Я использую blotter 0.9.1666 в 64-битной Windows.

Спасибо за терпеливость.


person mgsot    schedule 09.08.2015    source источник
comment
Теперь это исправлено в редакция 1693.   -  person Joshua Ulrich    schedule 09.08.2015


Ответы (1)


Это похоже на ошибку в addTxns, потому что чистая реализованная прибыль и убытки выглядят разумными, если вы вызываете addTxn для каждой строки в amzn.trades.

require(blotter)
# load the example data
data("amzn")
currency("USD")
stock("amzn",currency="USD",multiplier=1)
# Initialize the Portfolio
initPortf("amzn_port",symbols="amzn",initDate="2010-01-14")
initAcct("amzn_acct",portfolios="amzn_port",initDate="2010-01-14", initEq=10000)
# Add the transactions to the portfolio
for (i in 1:nrow(amzn.trades)) {
  x <- amzn.trades[i,]
  addTxn("amzn_port", "amzn", index(x), coredata(x$TxnQty), coredata(x$TxnPrice))
}
# update the portfolio`
updatePortf("amzn_port",Dates="2010-01-14")
getTxns("amzn_port", "amzn")

Я проверю и сообщу, как только найду/исправлю ошибку.


Теперь это исправлено в редакция 1693. Вот патч:

--- pkg/blotter/R/addTxn.R  2015/04/15 02:33:20 1685
+++ pkg/blotter/R/addTxn.R  2015/08/09 16:29:59 1693
@@ -246,9 +246,11 @@
     NewTxns$Pos.Qty <- cumsum(initPosQty + NewTxns$Txn.Qty)
     # only pass non-zero initial position qty and average cost
     NewTxns$Pos.Avg.Cost <- .calcPosAvgCost_C(initPosQty[1], initPosAvgCost[1], NewTxns$Txn.Value, NewTxns$Pos.Qty, ConMult)
-    # need lagged position average cost
+    # need lagged position average cost and quantity
     lagPosAvgCost <- c(initPosAvgCost[1], NewTxns$Pos.Avg.Cost[-nrow(NewTxns)])
+    lagPosQty <- c(initPosQty[1], NewTxns$Pos.Qty[-nrow(NewTxns)])
     NewTxns$Gross.Txn.Realized.PL <- NewTxns$Txn.Qty * ConMult * (lagPosAvgCost - NewTxns$Txn.Avg.Cost)
+    NewTxns$Gross.Txn.Realized.PL[abs(lagPosQty) < abs(NewTxns$Pos.Qty) | lagPosQty == 0] <- 0
     NewTxns$Net.Txn.Realized.PL <- NewTxns$Gross.Txn.Realized.PL - NewTxns$Txn.Fees
     NewTxns$Con.Mult <- ConMult
person Joshua Ulrich    schedule 09.08.2015