При программировании стратегии в блоттере я столкнулся с проблемой, что End.Eq
после моих сделок не соответствовал моим ожидаемым результатам из ручного расчета. Поэтому я написал простой R-код, чтобы лучше понять, как работает промокашка. Также здесь результаты отличаются от того, что я ожидал.Попытка понять учетную запись блоттера Unrealized.PL и End.Eq расчет
Возможно, кто-то с более глубоким пониманием может помочь мне с объяснением.
# R version 3.2.1 (2015-06-18)
# Platform: x86_64-pc-linux-gnu (64-bit)
# blotter: 0.9.1666
require(blotter)
Sys.setenv(TZ="UTC")
rm(list =ls(envir=.blotter), envir=.blotter)
initDate <- '2008-01-01'
initEq <- 1000
currency("USD")
stock("MDY", currency = "USD", multiplier = 1)
getSymbols("MDY", from='2008-01-01', to='2008-06-30', index.class="POSIXct", adjust=T)
b.strategy <- "b.test"
initPortf(name = b.strategy, symbols = "MDY", initDate = initDate)
initAcct(name = b.strategy, portfolios = b.strategy, initDate = initDate, initEq = initEq)
addTxn(b.strategy, Symbol = "MDY", TxnDate = "2008-04-30",
TxnPrice = as.numeric(Cl(MDY["2008-04-30"])), TxnQty = 1, TxnFees = 0)
updatePortf(b.strategy, Dates = "2008-04-30")
updateAcct(b.strategy, Dates = "2008-04-30")
updateEndEq(b.strategy, Dates = "2008-04-30")
addTxn(b.strategy, Symbol = "MDY", TxnDate = "2008-05-30",
TxnPrice = as.numeric(Cl(MDY["2008-05-30"])), TxnQty = -1, TxnFees = 0)
updatePortf(b.strategy, Dates = "2008-05-30")
updateAcct(b.strategy, Dates = "2008-05-30")
updateEndEq(b.strategy, Dates = "2008-05-30")
perTradeStats(b.strategy, "MDY")
tradeStats(b.strategy)
getAccount(b.strategy)$summary
Приведенный выше код инициализирует портфель стоимостью в 1000 долларов США. Я покупаю 1 «MDY» по цене закрытия на «2008-04-30». Затем я закрываю позицию через месяц по цене закрытия на «2008-05-30».
[1] "2008-04-30 00:00:00 MDY 1 @ 151.920844224256"
[1] "2008-05-30 00:00:00 MDY -1 @ 160.178061444191"
Поскольку портфель не содержит открытых позиций больше, я ожидаю, выигрыш в End.Eq
1000 + 8.257217 = 1008.257217, но то, что я вижу, это намного ниже результата из-за Unrealized.PL = -6.72
.
Но откуда это взялось? Все позиции закрыты, поэтому я ожидаю Unrealized.PL = 0
. Хотя транзакция все еще, кажется, дает мне ожидаемый результат от Net.Trading.PL = 8.257217
.
> perTradeStats(b.strategy, "MDY")
Start End Init.Pos Max.Pos Num.Txns Max.Notional.Cost Net.Trading.PL MAE MFE
1 2008-04-30 2008-05-30 1 1 2 151.9208 8.257217 0 8.257217
Pct.Net.Trading.PL Pct.MAE Pct.MFE tick.Net.Trading.PL tick.MAE tick.MFE
1 0.0543521 0 0.0543521 825.7217 0 825.7217
Глядя в портфель счета, я считаю Unrealized.PL = -6.72
, который я не могу объяснить, но ясно также приводит к неожиданному End.Eq
результату.
> getAccount(b.strategy)$summary
Additions Withdrawals Realized.PL Unrealized.PL Interest Gross.Trading.PL Txn.Fees Net.Trading.PL
2008-01-01 0 0 0.000000 0.00 0 0.000000 0 0.000000
2008-04-30 0 0 0.000000 0.00 0 0.000000 0 0.000000
2008-05-30 0 0 8.257217 -6.72 0 1.535756 0 1.535756
Advisory.Fees Net.Performance End.Eq
2008-01-01 0 0.000000 1000.000
2008-04-30 0 0.000000 1000.000
2008-05-30 0 1.535756 1001.536
Итак, мои два вопроса:
- В поисках объяснения, как Unrealized.PL произошло?
- Как я могу избежать этого, если это возможно?
Большое спасибо Джошуа! Это сделал трюк. Именно то, что мне нужно. – JBlohm