Использование QuantMod PeriodReturn с индексом переменных в среде - PullRequest
1 голос
/ 22 ноября 2011

Я написал следующую функцию для автоматической оценки эффекта пропуска лучших / худших дней торговли в данной акции.К сожалению, одна часть функции, кажется, выходит из строя:

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.

Мои извинения, если я что-то упустил очевидное - я уже давно этим занимаюсь.

Большое спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Не используйте getSymbols как внутри функции. Установите auto.assign=FALSE и назначьте выход getSymbols для d напрямую:

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

Все это подробно описано в ?getSymbols. Я бы посоветовал вам внимательно прочитать его.


UPDATE:

Теперь, когда я думаю об этом немного больше, вероятно, для функции 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)
1 голос
/ 22 ноября 2011

Это потому, что ls оценивает внутри функции envir.Используйте .GlobalEnv, чтобы найти его в глобальной среде.

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

Я не уверен, нужна ли функция envir в get.Но я думаю, это не повредит.

HTH

...