Генерация индикаторов различной периодичности в кванстрате
Я хотел бы использовать индикаторы таймфреймов, отличных от данных, которые я использую. Я видел, как это спрашивали несколько раз, но пока никаких решений (по крайней мере, для меня).
В приведенном ниже примере используются ежедневные биржевые данные, однако фактический проект использует внутридневные валютные данные. Теперь у меня есть простая работа по импорту внутридневных csv-данных, поэтому пример и реальный мир должны быть достаточно взаимозаменяемы.
library(quantstrat)
initDate="2000-01-01"
from="2003-01-01"
to="2016-12-31"
#set account currency and system timezone
currency('USD')
Sys.setenv(TZ="UTC")
#get data
symbols <- "SPY"
getSymbols(symbols, from=from, to=to, src="yahoo", adjust=TRUE)
stock(symbols, "USD")
#trade sizing and initial equity settings
tradeSize <- 100000
initEq <- tradeSize*length(symbols)
#set up the portfolio, account and strategy
strategy.st <- portfolio.st <- account.st <- "mtf.strat"
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, 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)
#SMA length
nSMA <- 14
Добавление SMA как, в этом случае индикатор работает лечить
add.indicator(strategy.st, name="SMA",
arguments=list(x=quote(Cl(mktdata)), n=nSMA, maType = "SMA"),
label="SMA")
test <- applyIndicators(strategy.st, mktdata=OHLC(SPY))
Еще пытаюсь добавить, в данном случае еженедельный SMA
add.indicator(strategy.st, name="SMA",
arguments=list(x=quote(to.period(Cl(mktdata), period = "weeks", k = 1, indexAt = "startof")), n=nSMA, maType = "SMA"),
label="SMAw1")
## Or this
add.indicator(strategy.st, name="SMA",
arguments=list(x=quote(to.weekly(Cl(mktdata))), n=nSMA, maType = "SMA"),
label="SMAw1")
test <- applyIndicators(strategy.st, mktdata=OHLC(SPY))
# Error in runSum(x, n) : ncol(x) > 1. runSum only supports univariate 'x'
Вызов столбца Close напрямую без Cl(x)
приводит к той же ошибке. Я сделал это, так как TTR:::runSum
выдаст вышеуказанную ошибку, если дано более одного столбца данных.
Я не совсем уверен, в чем проблема, поэтому некоторая помощь была бы отличной.1 ответ:
Проблема в том, что
to.period
(и, следовательно,to.weekly
) возвращает объекты OHLC, а не одномерный ряд, как ожидаетTTR::SMA
. Поэтому вам нужно обернуть выходные данныеto.period
вCl
.add.indicator(strategy.st, name="SMA", arguments=list(x=quote(Cl(to.weekly(Cl(mktdata)))), n=nSMA, maType = "SMA"), label="SMAw1") test <- applyIndicators(strategy.st, mktdata=OHLC(SPY))
Теперь этот код работает, но это все еще может быть проблемой для вашей стратегии. Будет много
NA
, когда этот индикатор объединится с дневнымmktdata
.R> tail(merge(SPY, test$SMA)) SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted SMA.SMAw1 2016-11-25 221.10 221.56 221.01 221.52 37861800 221.52 215.0720 2016-11-28 221.16 221.48 220.36 220.48 70284100 220.48 NA 2016-11-29 220.52 221.44 220.17 220.91 67079400 220.91 NA 2016-11-30 221.63 221.82 220.31 220.38 99783700 220.38 NA 2016-12-01 220.73 220.73 219.15 219.57 77230500 219.57 NA 2016-12-02 219.67 220.25 219.26 219.68 70863400 219.68 215.3207
Так что это хорошая идея, чтобы создать свою собственную функцию SMA оболочки для обработки всех этих шагов. Затем вызовите
add.indicator
с помощью вашей оболочки функция.mySMA <- function(x, on = "days", k = 1, n = 10) { agg <- x[endpoints(x, on, k)] sma <- SMA(agg, n) # merge with zero-width xts object w/original index, filling NA result <- merge(sma, xts(,index(x)), fill = na.locf) return(result) } add.indicator(strategy.st, name = "mySMA", arguments = list(x = quote(Cl(mktdata)), on = "weeks", n = nSMA), label = "SMAw1") test <- applyIndicators(strategy.st, mktdata = OHLC(SPY))
Теперь индикатор будет иметь значение для каждого наблюдения в
mktdata
, когда он объединен.> tail(merge(SPY, test$SMA)) SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted SMA.SMAw1 2016-11-25 221.10 221.56 221.01 221.52 37861800 221.52 215.0720 2016-11-28 221.16 221.48 220.36 220.48 70284100 220.48 215.0720 2016-11-29 220.52 221.44 220.17 220.91 67079400 220.91 215.0720 2016-11-30 221.63 221.82 220.31 220.38 99783700 220.38 215.0720 2016-12-01 220.73 220.73 219.15 219.57 77230500 219.57 215.0720 2016-12-02 219.67 220.25 219.26 219.68 70863400 219.68 215.3207