тестирование нескольких тикеров

Я построил следующую модель, которая тестирует только шпиона. Моя проблема в том, что я хочу применить эту торговую стратегию к нескольким тикерам (например, как к qqq, так и к шпиону).

Как мне это сделать? Смотри ниже:

getSymbols("spy",from ="2000-01-01", to="2015-01-01")
SPY<-adjustOHLC(SPY)
rsi <- RSI(Cl(SPY),2)
smashort<-SMA(Cl(SPY),10)
smalong<-SMA(Cl(SPY),200)
adx<-ADX(HLC(SPY),10)
adx<-adx[,4]
close<-Cl(SPY)

signal<-ifelse(rsi<15 & close<smashort & smalong<close &adx>27,1,0)
for(i in 1:nrow(signal))
{signal<-ifelse(lag(signal)==1 & close<smashort,1,ifelse(rsi<15 & close<smashort & smalong<close & adx>27,1,0))}
signal<-lag(signal,1)
signal[is.na(signal)] <- 0
ret <- ROC(Cl(SPY))
ret[1] <- 0
equity<-exp(cumsum(ret*signal))
plot(equity)

См. ниже версию с несколькими тикерами:

stockData <- new.env() #Make a new environment for quantmod to store data in
symbols = c("TLT", "USO")
getSymbols(symbols, src='yahoo',from = "2016-9-01",to = Sys.Date())
for(symbol in symbols){
  assign(symbol,adjustOHLC(get(symbol, pos=.GlobalEnv), symbol.name=symbol, 
                           adjust=c("split"), use.Adjusted=FALSE))
}

x <- list()
for (i in 1:length(symbols)) {
  x[[i]] <- get(symbols[i], pos=stockData)  # get data from stockData environment 
  x[[i]]$sma <-SMA(Cl(x[[i]]),10)
  x[[i]]$rsi <-RSI(Cl(x[[i]]),2)
  x[[i]]$close <-(Cl(x[[i]]))
  x[[i]]$signal<-ifelse(x[[i]]$rsi<15 & x[[i]]$close<x[[i]]$sma,1,0)
	
for(i in length(x[[i]]$signal))
{x[[i]]$signal<-ifelse(lag(x[[i]]$signal)==1 & x[[i]]$close<x[[i]]$sma,1,ifelse(x[[i]]$rsi<15 & x[[i]]$close<x[[i]]$sma,1,0))}


}


person np2000    schedule 11.10.2016    source источник
comment
любая помощь, пожалуйста   -  person np2000    schedule 11.10.2016


Ответы (2)


То, что вы хотите сделать, можно легко сделать с помощью quantstrat. Посмотрите демо-папку в пакете (см. стратегию RSI в демо-папке) или погуглите несколько руководств по ней в Интернете.

devtools::install_github("braverock/quantstrat")

В вашем фрагменте кода этот раздел не имеет смысла, поскольку вы пытаетесь зациклить векторную операцию:

for(i in length(x[[i]]$signal))
{x[[i]]$signal<-ifelse(lag(x[[i]]$signal)==1 & x[[i]]$close<x[[i]]$sma,1,ifelse(x[[i]]$rsi<15 & x[[i]]$close<x[[i]]$sma,1,0))}

Также for(i in length(x[[i]]$signal)) просто возвращает i = длину вектора. Может быть, вы хотели что-то вроде for(i in 1:NROW(x[[i]]$signal)).

Похоже, вы хотите что-то вроде этого:

x <- list()
for (i in 1:length(symbols)) {
    x[[i]] <- get(symbols[i], pos=stockData)  # get data from stockData environment 
    x[[i]]$sma <-SMA(Cl(x[[i]]),10)
    x[[i]]$rsi <-RSI(Cl(x[[i]]),2)
    x[[i]]$close <-(Cl(x[[i]]))
    x[[i]]$signal<-ifelse(x[[i]]$rsi<15 & x[[i]]$close<x[[i]]$sma,1,0)
    x[[i]]$signal2 <-ifelse(lag.xts(x[[i]]$signal) ==1 & x[[i]]$close<x[[i]]$sma,1,ifelse(x[[i]]$rsi<15 & x[[i]]$close<x[[i]]$sma,1,0))
}
person FXQuantTrader    schedule 11.10.2016
comment
я попытаюсь использовать quanstrat, но я также пытаюсь сделать это правильно без него. это то, что я использовал, и я думаю, что это решает проблему. однако у меня проблема со вторым циклом for. не могли бы вы помочь мне с этим? я не понимаю, что пошло не так, поскольку цикл for работает с одним тикером, как вы можете видеть выше. см. код ниже - person np2000; 12.10.2016
comment
x ‹- list() for (i in 1:length(symbols)) { x[[i]] ‹- get(symbols[i], pos=stockData) # получить данные из среды stockData x[[i]]$ sma ‹-SMA(Cl(x[[i]]),10) x[[i]]$rsi ‹-RSI(Cl(x[[i]]),2) x[[i]]$close ‹ -(Cl(x[[i]])) x[[i]]$signal‹-ifelse(x[[i]]$rsi‹15 & x[[i]]$close‹x[[i]] $sma,1,0) for(i in nrow(x[[i]]$signal)) {x[[i]]$signal‹-ifelse(lag(x[[i]]$signal)==1 & x[[i]]$close‹x[[i]]$sma,1,ifelse(x[[i]]$rsi‹15 & x[[i]]$close‹x[[i]]$ сма,1,0))} - person np2000; 12.10.2016
comment
@ np2000 обновил ответ, который, кажется, исправляет вашу ошибку во фрагменте кода. Попробуйте использовать traceback() и вставьте browser() в части вашего кода, которые вызывают у вас проблемы. - person FXQuantTrader; 12.10.2016

спасибо FX Quant Trader. я придумал другое решение. см. атташе`

x <- list() 
for (i in 1:length(symbols)) {
  x[[i]] <- get(symbols[i], pos=stockData)  # get data from stockData environment 
  x[[i]]$sma <-SMA(Cl(x[[i]]),10)
  x[[i]]$rsi <-RSI(Cl(x[[i]]),2)
  x[[i]]$close <-(Cl(x[[i]]))
  x[[i]]$signal<-ifelse(x[[i]]$rsi<10 & x[[i]]$close<x[[i]]$sma,1,0)
  for(k in 1:nrow(x[[i]]$signal))
{x[[i]]$signal<-ifelse(lag(x[[i]]$signal)==1 & x[[i]]$close<x[[i]]$sma,1,ifelse(x[[i]]$rsi<10 & x[[i]]$close<x[[i]]$sma,1,0))}

x[[i]]$signal<-lag(x[[i]]$signal,1)
x[[i]]$signal[is.na(x[[i]]$signal)] <- 0

x[[i]]$ret <- ROC(Cl(x[[i]]$close))
x[[i]]$ret[1] <- 0

x[[i]]$equity<-exp(cumsum(ret*x[[i]]$signal))
plot(x[[i]]$equity)
}

`

person np2000    schedule 13.10.2016