Quantstrat applyОшибка стратегии

Я использую quantstart, но по какой-то причине функция applyStrategy не выдает никакой информации. Это просто проходит. В результате, когда я выполняю функцию tradeStats, я получаю null. Вот код, который я использовал: Спасибо!

library(quantstrat)
library(quantmod)
initDate = "1999-01-01"
from = "2003-01-01"
to = "2015-12-31"

Sys.setenv (TZ = "UTC")
currency ("USD")
getSymbols ("SPY", from = from,
 to = to, src = "yahoo",
 adjust = TRUE)

tradesize <- 100000
initeq <- 100000
strategy.st <- portfolio.st <- account.st <- "firststrat"
rm.strat(strategy.st)
initPortf(portfolio.st,
 symbols = "SPY",
 initDate = initdate,
 currency = "USD")
initAcct(account.st,
 portfolios = portfolio.st,
 initDate = initdate,
 currency = "USD",
 initEq = initeq)
initOrders(portfolio.st, initDate = initdate)
strategy(strategy.st, store = TRUE)

add.indicator(strategy = strategy.st,
 name = "SMA",
 arguments = list(x = quote(Cl(mktdata)), n = 200),
 label = "SMA200")

add.indicator(strategy = strategy.st,
 name = "SMA",
 arguments = list(x = quote(Cl(mktdata)), n = 50),
 label = "SMA50")

test4 <- applyIndicators(strategy = strategy.st, mktdata) 

add.signal(strategy.st,
 name = "sigCrossover",
 arguments = list(columns = c("SMA50", "SMA200"),
 relationship = "gt"),
 label = "longfilter")

add.signal(strategy.st,
 name = "sigComparison",
 arguments = list(columns = c("SMA50", "SMA200"),
 relationship = "lt" ),
 label = "filterexit")

test4 <- applySignals(strategy.st, mktdata)

add.rule(strategy.st, name = "ruleSignal",
 arguments = list(sigcol = "filterexit", sigval = TRUE,
 orderqty = "all", ordertype = "market",
 orderside = "long", replace = FALSE,
 prefer = "Open"),
 type = "exit")

add.rule(strategy.st, name = "ruleSignal",
 arguments = list(sigcol = "longfilter", sigval = TRUE,
 orderqty = "all", ordertype = "market",
 orderside = "long", replace = FALSE,
 prefer = "Open"),
 type = "enter")



applyStrategy(strategy.st, portfolio.st)

updatePortf(portfolio.st)
daterange <- time(getPortfolio(portfolio.st)$summary)[-1]

updateAcct(account.st, daterange)
updateEndEq(account.st)

tradeStats(Portfolios = portfolio.st)

```


person Quicksilver    schedule 13.05.2017    source источник


Ответы (1)


Вот ваши проблемы:

1) Ваш initDate должен быть initdate в строке 3, чтобы быть последовательным. 2) Не используйтеorderqty = "all" для правил типа "ввод". Используйте фактическое количество. См. правило добавления записи ниже. ниже для того, как вы, вероятно, намеревались запустить код. Как правило, используйте orderqty = "all" для правил выхода/стоп/тейк-профита. «все» используется, когда вы хотите выйти из существующей позиции, не указывая, какой может быть эта позиция в данный момент (вы можете не знать заранее, если вы создаете пирамиду сделок с желаемыми рисками).

3) Вы можете столкнуться с другой ошибкой, связанной со сравнением объектов date и POSIXct, если вы не установите аргумент index.class, как показано ниже, в вызове getSymbols.

4) Вы не определили объект инструмента для SPY. то есть ваш код, который вы разместили, отсутствует stock("SPY", currency = "USD")

5) Ваш код не воспроизводится как есть. Такие звонки:

test4 <- applyIndicators(strategy = strategy.st, mktdata)

работать только после того, как у вас есть объект marketdata (который существует после вызова applyStrategy).

Эта отредактированная форма вашего кода работает:

library(quantstrat)
library(quantmod)
initdate = "1999-01-01"
from = "2003-01-01"
to = "2015-12-31"

currency ("USD")
stock("SPY", currency = "USD")

Sys.setenv (TZ = "UTC")

getSymbols ("SPY", from = from,
            to = to, src = "yahoo",
            adjust = TRUE,
            index.class=c("POSIXt","POSIXct"))

tradesize <- 100000
initeq <- 100000
strategy.st <- portfolio.st <- account.st <- "firststrat"
rm.strat(strategy.st)
initPortf(portfolio.st,
          symbols = "SPY",
          initDate = initdate,
          currency = "USD")
initAcct(account.st,
         portfolios = portfolio.st,
         initDate = initdate,
         currency = "USD",
         initEq = initeq)
initOrders(portfolio.st, initDate = initdate)
strategy(strategy.st, store = TRUE)

add.indicator(strategy = strategy.st,
              name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), n = 200),
              label = "SMA200")

add.indicator(strategy = strategy.st,
              name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), n = 50),
              label = "SMA50")

add.signal(strategy.st,
           name = "sigCrossover",
           arguments = list(columns = c("SMA50", "SMA200"),
                            relationship = "gt"),
           label = "longfilter")

add.signal(strategy.st,
           name = "sigComparison",
           arguments = list(columns = c("SMA50", "SMA200"),
                            relationship = "lt" ),
           label = "filterexit")

add.rule(strategy.st, name = "ruleSignal",
         arguments = list(sigcol = "filterexit", sigval = TRUE,
                          orderqty = "all", ordertype = "market",
                          orderside = "long", replace = FALSE,
                          prefer = "Open"),
         type = "exit")

add.rule(strategy.st, name = "ruleSignal",
         arguments = list(sigcol = "longfilter", sigval = TRUE,
                          orderqty = tradesize, ordertype = "market",
                          orderside = "long", replace = FALSE,
                          prefer = "Open"),
         type = "enter")



applyStrategy(strategy.st, portfolio.st)

updatePortf(portfolio.st)
daterange <- time(getPortfolio(portfolio.st)$summary)[-1]

updateAcct(account.st, daterange)
updateEndEq(account.st)

tradeStats(Portfolios = portfolio.st)

Последний совет. Перезапустите чистый сеанс r перед запуском кода, который вы хотите воспроизвести, затем проверьте его, запустив исходный код. Многие из проблем, перечисленных выше, можно обнаружить, запустив исходный код в новом чистом сеансе R. (Если вы используете Rstudio, это легко сделать с помощью сочетания клавиш Ctrl + Shift + F10).

person FXQuantTrader    schedule 13.05.2017