【问题标题】:Adjusting for dividend and splits using quantmod使用 quantmod 调整股息和拆分
【发布时间】:2016-12-10 22:01:25
【问题描述】:

我正在使用 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]]))
}

【问题讨论】:

  • 看看this thread 。这可能会回答您的问题。

标签: r quantmod


【解决方案1】:

您很幸运,您的代码可以正常工作。或者你可能不走运,因为一个错误会让你知道你做错了什么。

您创建了一个stockData 环境,并且评论说您打算存储您在其中提取的数据。但是您没有在对getSymbols 的调用中指定stockData 环境,或者在第一个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 进行分配/访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2020-07-10
    • 2016-05-18
    • 2014-03-15
    相关资源
    最近更新 更多