我使用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]]))
}
答案 0 :(得分:0)
你的代码很有用。或者也许你运气不好,因为错误会让你知道你做错了什么。
您创建了一个stockData
环境,评论表明您打算存储您提取的数据。但是,您未在stockData
的通话中指定getSymbols
环境,也未在第一个for循环中调用assign
和get
。因此,他们都在分配并从全球环境中获取。
如果您避免在for循环中使用get
和assign
,而是使用便捷函数lapply
和eapply
,那么您的代码会更清晰。
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会话中运行它们,您会注意到我的代码和代码的结果是相同的。因此,您的代码产生“错误”结果的原因可能是因为您使用get
和assign
分配/访问了工作区中的其他对象。