2015-07-26 3 views
1

При программировании стратегии в блоттере я столкнулся с проблемой, что 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 

Итак, мои два вопроса:

  1. В поисках объяснения, как Unrealized.PL произошло?
  2. Как я могу избежать этого, если это возможно?

ответ

0

Во-первых, вы должны только вызывать функции update*, когда вам нужно пометить книгу. Неэффективно вызывать их после каждой транзакции, если вам действительно не нужно использовать некоторые из значений, которые они вычисляют.

Во-вторых, вы вызываете функции update* с одной датой, которая (как правило) не имеет смысла. Это заставляет книгу отмечать только одну единственную дату, что не особенно полезно. Было бы разумнее использовать диапазон дат, например "2008-04-30/2008-05-30".

Ненулевого Unrealized.PL потому, что ваша позиция закрывающей сделка происходит на конце из 2008-05-30, а это значит, у вас есть нереализованный P & L на этот день.

Модифицированная версия вашего кода, приведенного ниже, должна давать ожидаемые результаты.

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) 
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-04-30/2008-05-30") 
updateAcct(b.strategy, Dates = "2008-04-30/2008-05-30") 
updateEndEq(b.strategy, Dates = "2008-04-30/2008-05-30") 

perTradeStats(b.strategy, "MDY") 
tradeStats(b.strategy) 
getAccount(b.strategy)$summary 
getPortfolio(b.strategy)$summary 
+0

Большое спасибо Джошуа! Это сделал трюк. Именно то, что мне нужно. – JBlohm