【问题标题】:multiple tickers backtesting多个股票回测
【发布时间】:2016-10-11 08:19:00
【问题描述】:

我已经建立了以下模型,它只对间谍进行回测。 我的问题是我想将此交易策略应用于多个代码(例如 qqq 和 spy)。

我该怎么做? 见下文:

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))}


}

【问题讨论】:

  • 请帮忙

标签: r quantmod trading back-testing


【解决方案1】:

使用quantstrat 可以轻松完成您想做的事情。查看包中的demo文件夹(查看demo文件夹中的RSI策略),或者google多个在线教程。

devtools::install_github("braverock/quantstrat")

在您的代码 sn-p 中,此部分没有意义,因为您尝试循环遍历向量操作:

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))
}

【讨论】:

  • 我会尝试使用 quanstrat,但我也会尝试在没有它的情况下正确使用它。这就是我使用的,我认为它解决了问题。但是我对第二个 for 循环有疑问。你能帮帮我吗?正如您在上面看到的那样,我不明白 for 循环与单个股票代码一起工作时出了什么问题。看下面的代码
  • x
  • @np2000 已更新答案,似乎可以纠正您在代码 sn-p 中的错误。尝试使用traceback() 并在导致问题的部分代码中插入browser()
【解决方案2】:

感谢外汇量化交易者。我想出了另一个解决方案。见附件`

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)
}

`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2021-03-23
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多