Как использовать функцию sigPeak () в quantstrat - PullRequest
0 голосов
/ 22 октября 2018

Я не могу понять, как правильно использовать sigPeak() в quantstrat .

A (не работает) пример, приведенный ниже.

Я добавляюиндикатор для mktdata:

add.indicator(strategy = name,
              name = 'WinDoPar',
              arguments = list(x = quote(OHLC(mktdata)),
                               n = 300,
                               w = 'run',
                               fun = RSI_dens),
              label = 'pti',
              store = TRUE)

Он должен создать столбец с именем X1.pti из-за метки, и на самом деле это так.Затем я хотел бы использовать sigPeak() для добавления сигнала:

add.signal(strategy = name,
           name = 'sigPeak',
           arguments = list(data = mktdata,
                            column = 'pti',
                            direction = 'peak'),
           label = 'pti.buy',
           store = TRUE)

Для sigPeak() требуется дополнительный аргумент, то есть label: однако я не понял, как его использовать,Таким образом, когда я добавляю подобное правило и применяю стратегию, она терпит неудачу:

add.rule(strategy = name,
         name = 'ruleSignal',
         arguments = list(sigcol = 'pti.buy',
                          sigval = TRUE,
                          orderqty = 1,
                          ordertype = 'market',
                          orderside = 'long',
                          replace = TRUE,
                          osFUN = osTotSize,
                          acct.name = name,
                          TxnFees = TxnFees),
         label = 'pti.buy.enter',
         type = 'enter',
         store = TRUE)

Выдается ошибка:

Error in applyRules(portfolio = portfolio, symbol = symbol, strategy = strategy,  : 
  mktdata does not contain 'sigcol': pti.buy

При ближайшем рассмотрении mktdata обнаруживается, что есть столбецобозначено так: pti.buy.peak.sig.pti.buy, что выглядит довольно странно.

Так как же мне использовать sigPeak() для генерации сигнала на покупку после пиков индикатора?

1 Ответ

0 голосов
/ 20 апреля 2019

Глядя на источник, sigPeak генерирует сигнал, когда у вас фактически есть паттерн «треугольник» в базовом временном ряду, и генерирует сигнал, когда «треугольник» завершен.Имеет смысл использовать этот сигнал в сочетании с другими для генерации значимого торгового сигнала (возможно, сгладить временной ряд sigPeak с помощью EMA и т. Д., Чтобы сделать его более устойчивым, и действовать так, чтобы он нарушал некоторое пороговое значение между 0 и 1 и т. Д.)

Ваша ошибка говорит о том, что pti.buy не является именем столбца в mktdata.Таким образом, ваш add.rule должен изменить аргумент sigcol = "pti.buy" на любое имя столбца, содержащего ваш сигнал входа.Похоже, что это должно быть sigcol = "pti.buy.peak.sig.pti.buy", и тогда все должно работать.

При ближайшем рассмотрении sigPeak, похоже, что имя столбца, выводимого из sigPeak, принимает форму [label] .peak.sig. [метка], когда direction = "peak" или [метка] .valley.sig. [метка], когда direction = "valley" (при использовании тока direction = "bottom" генерируется ошибка в sigPeak из-за ошибки в коде переключателя внутри sigPeak).Не совсем интуитивно.

Простой способ использования sigPeak - изменить функцию и передать ее в качестве функции для add.signal.Я делаю это с sigPeak2 ниже.

Вот воспроизводимый пример с использованием sigPeak, который может помочь:

library(quantstrat)
strategy.st <- "RSI"
initEq=100000
port.st<-'RSI'

rm.strat(strategy.st)
stratRSI <- strategy(strategy.st, store = TRUE)

add.indicator(strategy = strategy.st, name = "RSI", arguments = list(price = quote(getPrice(mktdata))), label="pti")


sigPeak2 <- function (label, data, column, direction = c("peak", "bottom"))  {
    if (!is.numeric(column)) {
        colNum <- match.names(column, colnames(data))
    }
    else colNum <- column
    direction = direction[1]
    switch(direction, peak = {
        ret_sig <- Lag(data[, colNum], 2) < Lag(data[, colNum],
                                                1) & Lag(data[, colNum], 1) > data[, colNum]
    }, bottom = , valley = {
        ret_sig <- Lag(data[, colNum], 2) > Lag(data[, colNum],
                                                1) & Lag(data[, colNum], 1) < data[, colNum]
    })
    if (!missing(label))
        colnames(ret_sig) <- label
    return(ret_sig)
}


add.signal(strategy = strategy.st,
           name = 'sigPeak',
           arguments = list(data = quote(mktdata),
                            column = 'pti',
                            direction = 'peak'),
           label = 'drop')

add.signal(strategy = strategy.st,
           name = 'sigPeak2',
           arguments = list(data = quote(mktdata),
                            column = 'pti',
                            direction = 'bottom'),
           label = 'jump')

add.signal(strategy = strategy.st, name="sigThreshold",
           arguments = list(threshold=70, column="pti",relationship="gt", cross= TRUE),
           label="RSI.gt.70")

add.signal(strategy = strategy.st, name="sigThreshold",
           arguments = list(threshold=60, column="pti",relationship="lt", cross= TRUE),
           label="RSI.lt.60")

add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.gt.70 == 1 & jump == 1"),label="enterLong")

add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.lt.60 == 1 & drop.peak.sig.drop == 1"),label="exitLong")


add.rule(strategy = strategy.st, name='ruleSignal',
         arguments = list(sigcol="enterLong",
                          sigval=TRUE,
                          orderqty= 100,
                          TxnFees=0,
                          ordertype='market',
                          orderside='long',
                          pricemethod='market',
                          replace=FALSE),
         type='enter', path.dep=TRUE)

add.rule(strategy = strategy.st, name='ruleSignal',
         arguments = list(sigcol="exitLong",
                          sigval=TRUE,
                          orderqty='all',
                          TxnFees=0,
                          ordertype='market',
                          orderside='long',
                          pricemethod='market',
                          replace=FALSE),
         type='exit', path.dep=TRUE)



currency("USD")
symbols = c("SPY")
stock.str = symbols

startDate <- "2013-01-01"


getSymbols(stock.str,from=startDate, to= Sys.Date())


for(symbol in symbols){
    stock(symbol, currency="USD",multiplier=1)
}


initPortf(port.st, symbols=symbols)
initAcct(port.st, portfolios=port.st, initEq=initEq)
initOrders(portfolio=port.st)


for(symbol in symbols){ addPosLimit(port.st, symbol, timestamp = startDate, maxpos = 1000) }

applyStrategy(strategy=strategy.st, portfolios=port.st)

updatePortf(strategy.st)
updateAcct(strategy.st)
updateEndEq(strategy.st)


chart.Posn(strategy.st, Symbol = 'SPY', Dates = '2000::')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...