使用quantmod调整红利和分割

时间:2016-11-17 14:11:43

标签: r quantmod

我使用quantmod来调整股息和拆分。它似乎工作,但我发现了以下问题:当调整我的sma(200,0)时,历史值是错误的,并且当日期接近当前日期时它们正确。请参阅下面的代码。

stockData <- new.env() #Make a new environment for quantmod to store data in
symbols = c("IWM","SPY","TLT","TSLA")
nr.of.positions<-3
getSymbols(symbols, src='yahoo',from = "2015-10-01",to = Sys.Date())
for (i in 1:length(symbols)) {
  assign (symbols[i], adjustOHLC(get(symbols[i]), 
               adjust=c("split", "dividend"), 
               use.Adjusted=FALSE,
               symbol.name=symbols[i]))
}

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]]$smalong <-SMA(Cl(x[[i]]),200)
  x[[i]]$adx<-ADX(HLC(x[[i]]),10)
  x[[i]]$rsi <-RSI(Cl(x[[i]]),14)
  x[[i]]$close <-(Cl(x[[i]]))
}

1 个答案:

答案 0 :(得分:0)

你的代码很有用。或者也许你运气不好,因为错误会让你知道你做错了什么。

您创建了一个stockData环境,评论表明您打算存储您提取的数据。但是,您未在stockData的通话中指定getSymbols环境,也未在第一个for循环中调用assignget。因此,他们都在分配并从全球环境中获取。

如果您避免在for循环中使用getassign,而是使用便捷函数lapplyeapply,那么您的代码会更清晰。

stockData <- new.env()
symbols <- c("IWM","SPY","TLT","TSLA")
nr.of.positions <- 3
getSymbols(symbols, from = "2015-10-01", env = stockData)

# loop over objects in an environment with eapply
adj <- eapply(stockData, function(x) {
  symbol <- sub("\\.Close$", "", colnames(Cl(x)))
  adjustOHLC(x, symbol.name=symbol)
})

# loop over list returned by eapply
x <- lapply(adj, function(x) {
  x$sma <- SMA(Cl(x),10)
  x$smalong <- SMA(Cl(x),200)
  x$adx <- ADX(HLC(x),10)
  x$rsi <- RSI(Cl(x),14)
  x$close <- Cl(x)
  x
})

如果您在干净的R会话中运行它们,您会注意到我的代码和代码的结果是相同的。因此,您的代码产生“错误”结果的原因可能是因为您使用getassign分配/访问了工作区中的其他对象。