1

我编写了以下函数来自动评估错过给定股票交易的最佳/最差日子的影响。不幸的是,该功能的一部分似乎失败了:

library(quantmod)
    missingDays<- function(ticker,dmiss=10,type="best",period="days",fdate="2000-01-01",tdate=Sys.Date()) {
          getSymbols(ticker,from=fdate,to=tdate) #quantmod to pull ticker info
          d<-get(ls()[1])
          x<-as.data.frame(periodReturn(Cl(d),period=period))
          x<- x[order(x[1]),]
          if(type=="best") {
            (((mean(x[1:(length(x)-dmiss)],na.rm=TRUE)+1)^(251))-1)*100      #average daily return, annualized  
          } else {
            (((mean(x[dmiss:(length(x))],na.rm=TRUE)+1)^(251))-1)*100      #average daily return, annualized
          }  
        }
missingDays("^GSPC",10,type="best",period="daily",fdate="2000-01-01")

错误显然发生在这两行代码中:

  d<-get(ls()[1])
  x<-as.data.frame(periodReturn(Cl(d),period=period))

这很奇怪,因为当我直接运行它而不是在函数中运行时,它可以正常工作。它似乎无法识别d为 xts 对象。

如果我错过了一些明显的事情,我深表歉意——我已经有一段时间了。

非常感谢您的帮助。

4

2 回答 2

2

不要getSymbols在函数中那样使用。直接设置auto.assign=FALSE并分配getSymbolsto的输出d

d <- getSymbols(ticker,from=fdate,to=tdate,auto.assign=FALSE)

这一切都在 中详细描述?getSymbols。我鼓励你仔细阅读。


更新:

现在我想多了,missingDays函数接受来自对 . 的调用的输出可能会更好getSymbols。这样您就不必为不同的参数集下载数据。

missingDays <- function(symbol, dmiss=10, type="best", period="daily",
        fdate="2000-01-01", tdate=Sys.Date()) {
  x <- as.data.frame(periodReturn(Cl(symbol),period=period))
  x <- x[order(x[1]),]
  if(type=="best") {
    #average daily return, annualized
    (((mean(x[1:(length(x)-dmiss)],na.rm=TRUE)+1)^(251))-1)*100
  } else {
    #average daily return, annualized
    (((mean(x[dmiss:(length(x))],na.rm=TRUE)+1)^(251))-1)*100
  }
}
getSymbols("^GSPC", from="2000-01-01")
missingDays(GSPC)
于 2011-11-22T17:34:22.890 回答
1

那是因为ls在函数 envir 内部进行评估。使用.GlobalEnv它在全局环境中查找它。

d <- get(ls(envir = .GlobalEnv), envir = .GlobalEnv)

我不确定是否需要 get 函数中的 envir 。但我想它不会受到伤害。

高温高压

于 2011-11-22T17:26:09.223 回答