Стратегия торговой стратегии Quantstrat - PullRequest
0 голосов
/ 02 июня 2018

У меня проблема с моей торговой стратегией Quantstrat.Результат Endequity не учитывает мой init_equity 100000. Если я изменяю init_equity на 100, я получаю такую ​​же Endequity.Мой код выглядит так.Может кто-нибудь представить, в чем моя проблема?Спасибо

Sys.setenv(TZ = 'UTC')
currency('USD')
init_date <- '2006-12-31'
start_date <- '2007-01-01'
end_date <- '2017-12-31'
init_equity <- '100000'
adjustment <- TRUE


getSymbols(Symbols = 'QQQ', src = 'yahoo', index.class = 'POSIXct', 
from = start_date, to = end_date)


QQQ = na.omit(QQQ)

symbols <- 'QQQ'

stock(symbols, currency = 'USD', multiplier = 1)


strategy.st <- 'basic_strat'
portfolio.st <- 'basic_portfolio'
account.st <- 'basic_account'

rm.strat(strategy.st)
rm.strat(portfolio.st)
rm.strat(account.st)

initPortf(name = portfolio.st, symbols = 'QQQ', initDate = init_date)
initAcct(name = account.st, portfolios = portfolio.st, 
initDate = init_date, initEq = init_equity)
initOrders(portfolio = portfolio.st, symbols = 'QQQ', initDate = init_date)
strategy(strategy.st, store = TRUE)


tradesize <- 100
for (sym in symbols) {
addPosLimit(portfolio.st, sym, start(get(sym)), tradesize)
}

add.indicator(strategy = strategy.st, name = 'DonchianChannel', 
          arguments = list(HL = quote(HLC(mktdata)[, 1:2]), 
                           n = 260),
          label = 'DCH' )

ratioPriceSeries <- function(x, multiplier = 0.85,
                         col = 'high.DCH') {
x$ratioPrice <- multiplier * x[, col]
x[,'ratioPrice']
}

add.indicator(strategy = strategy.st, name = 'ratioPriceSeries', 
          arguments = list(x = quote(mktdata), multiplier = 0.85, col = 'high.DCH'), label = 'Lratio')

mktdata_ind <- applyIndicators(strategy.st, mktdata = QQQ)
mktdata_ind[is.na(mktdata)] = 0
knitr::kable(tail(mktdata_ind))

add.signal(strategy.st, name = 'sigCrossover',
       arguments = list(label = 'co', data = quote(mktdata), columns = c('Close', 'Lratio'),
                        relation = 'gt'), label = 'enterL')

add.signal(strategy.st, name = 'sigCrossover',
       arguments = list(label = 'co', data = quote(mktdata), columns = c('Close', 'Lratio'),
                        relation = 'lt'), label = 'exitL')

mktdata_sig <- applySignals(strategy.st, mktdata = mktdata_ind)
mktdata_sig[is.na(mktdata_sig)] = 0
knitr::kable(tail(mktdata_sig))

sum(mktdata_sig[,'enterL'] == 1,na.rm = TRUE)
sum(mktdata_sig[,'exitL'] == 1, na.rm = TRUE)


add.rule(strategy.st,name='ruleSignal',
     arguments = list(sigcol="enterL",
                      sigval=TRUE,
                      orderqty=100,
                      ordertype='market',
                      orderside='long',
                      osFUN=osMaxPos,
                      threshold=NULL,
                      prefer = 'Open'),
     type='enter',
     label='enterLong'
)

add.rule(strategy.st,name='ruleSignal',
     arguments = list(sigcol="exitL",
                      sigval=TRUE,
                      orderqty='all',
                      ordertype='market',
                      orderside='long',
                      orderset='DC.set',
                      prefer = 'Open'),
     type='exit',
     label='exitLong'
)

applyStrategy(strategy.st, portfolio=portfolio.st)
updatePortf(Portfolio = portfolio.st)
updateAcct(account.st)

здесь я получаю это предупреждение

[1] "basic_account"
Warning message:
In rbind(deparse.level, ...) :
mismatched types: converting objects to numeric

.

updateEndEq(account.st)

orderbook <- getOrderBook(portfolio.st)

trade_stats <- tradeStats(portfolio.st)
trade_stats1 <- as.data.frame(t(tradeStats(portfolio.st)))
knitr::kable(trade_stats1)



chart.Posn(Portfolio = portfolio.st, Symbol = 'QQQ')

Результат выглядит так:

knitr::kable(trade_stats1[c('Portfolio', 'Symbol', 'Num.Txns', 'Num.Trades', 'End.Equity'),])


|           |x               |
|:----------|:---------------|
|Portfolio  |basic_portfolio |
|Symbol     |QQQ             |
|Num.Txns   |17              |
|Num.Trades |8               |
|End.Equity |10570           |

Проблема в End.Equity, который, на мой взгляд, неверен.

1 Ответ

0 голосов
/ 21 июня 2018

Я запустил ваш код и изменил значение с:

init_equity <- '100000' </p>

на

init_equity <- '100 '</p>

Вот результаты, которые я получил по порядку:

End.Eq = 2017-12-29 110570

End.Eq = 2017-12-29 10670

Попробуйте запустить следующий скрипт, чтобы получить End.Eq:

a <- getAccount(account.st)
End.Eq <- tail(a$summary$End.Eq, n = 1)

Код: tradeStats(portfolio.st) просто предоставляет вам совокупный PL, а не конец.Eq

Надеюсь, это помогло!

...