Quantmod сохранить тикеры в файлы в цикле или LAPPLY - PullRequest
1 голос
/ 19 декабря 2011

Я застрял с незначительной квантовой проблемой; если кто-то может предложить изменить мой код, я был бы очень признателен. Я не знаю, как программировать; может поэтому я скучаю по очевидному. Проблема возникает потому, что getSymbols принимает строку в качестве входных данных (например, "YHOO"), но возвращает только YHOO (без кавычек) в качестве объекта xts, который содержит данные. Кроме того, для рыночных индексов Yahoo включает в коде строку для кода (например, «^ GSPC»), но QuantMod возвращает простой GSPC в качестве объекта данных.

Я пытаюсь загрузить и сохранить в отдельные двоичные файлы данные нескольких тикеров. Это сделано для того, чтобы создать рабочую среду, которая может функционировать на основе данных, хранящихся на диске, вместо того, чтобы обязательно требовать доступ в Интернет.

Я пытался написать функцию:

buildhist <- function(x,start,end) {
  getSymbols(x, from=start, to=end, adjust=TRUE)   
  save(get(x), file= paste(x, "hist.rda", sep="_"), ascii = FALSE)  
}

Тогда используйте

require(quantmod)
tckr <- c("YHOO","XLB")
lapply(tckr,buildhist,start="1995-01-01",end="2011-11-30")

Но, это ошибка в команде сохранения (говоря "объект" get (x) "не найден"). Если я не использую get(x), команда save сохранит только имя тикера в виде строки, поэтому я не могу его использовать. Никакая другая версия, такая как save(noquote(x), file=paste(x, "hist.rda", sep="_"), ascii=FALSE), также не работает.

Какую команду следует использовать, чтобы данные тикера были сохранены с тем же именем объекта, которое было первоначально возвращено QuantMod? В моем коде выше я даже не пытался решить другую проблему - проблему удаления знака каретки с имени, если оно существует. Любые указатели на это тоже будут высоко оценены.

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Можете ли вы подтвердить, что ваш getSymbols вызов был успешным, выполнив что-то вроде summary(YHOO)?Вы определенно не хотите писать (save(get(x)), потому что нет объекта с именем "get (x)".

Я подозреваю, что ваша проблема связана с правильным использованием lapply.Это работает:

foo <- 5
oof <- 4
bar<-c("foo","oof")
lapply(lapply(bar,get),sqrt)

(где, конечно, вы бы использовали buildhist не sqrt)

2 голосов
/ 02 января 2012

Ниже SymbolList - это вектор с символами.т.е.

SymbolList <- c("IBM","GOOG","YHOO")

Получите исторические данные для них, используя getSymbols

getSymbols(SymbolList)

, определите функцию и используйте do.call,

fun <- function(i) {return(adjustOHLC(get(SymbolList[i]),adjust = "split", use.Adjusted=TRUE))}
mydata <- do.call(merge, lapply(1:length(SymbolList), fun))

это даст вамобъединенные данные, пара других вещей, которые вы могли бы использовать, например, если вы хотите только закрывающие значения и скорректировать их для разбиений.

 fun <- function(i) {return(Cl(adjustOHLC(get(SymbolList[i]),adjust = "split", use.Adjusted=TRUE)))}

вы также можете преобразовать их во фрейм данных.

mydata<-as.data.frame(mydata)

оттуда вы можете записать это в CSV-файл.

2 голосов
/ 19 декабря 2011

ОБНОВЛЕНИЕ: Решение, приведенное ниже, не решает проблему ОП (см. Комментарии).См. Редактирование после перехода.

Значение по умолчанию auto.assign=TRUE должно упростить работу при интерактивном использовании getSymbols.Установите auto.assign=FALSE при использовании getSymbols в функции;это сделает все намного проще.

buildhist <- function(x,start,end) {
  y <- getSymbols(x, from=start, to=end, adjust=TRUE, auto.assign=FALSE)
  save(y, file= paste(x, "hist.rda", sep="_"), ascii = FALSE)  
}

Вы можете удалить знаки препинания (включая символ вставки) с помощью gsub.Подробнее см. ?gsub и ?regex.

X <- gsub("[[:punct:]]","",x)  # remove all punctuation
X <- gsub("\\^","",x)          # remove just the carat

Я не проверял свой первоначальный ответ.Это решение должно работать.

buildhist <- function(x,start,end) {
  getSymbols(x, from=start, to=end, adjust=TRUE)
  X <- toupper(gsub("\\^","",x))  # what getSymbols.yahoo does
  save(list=X, file= paste(X, "hist.rda", sep="_"), ascii = FALSE)  
}

require(quantmod)
tckr <- c("^GSPC","YHOO","XLB")
lapply(tckr,buildhist,start="1995-01-01",end="2011-11-30")

Если вы используете ежедневные данные только с небольшим количеством символов, вы можете загрузить их все в одну среду и просто сохранить среду.Это может избавить вас от многих проблем.Затем вы можете загрузить окружение в новый сеанс, присоединить его и иметь все данные у вас под рукой.

myEnv <- new.env()
getSymbols(paste(tckr,sep=";"), start="1995-01-01", end="2011-11-30",
  env=myEnv, adjust=TRUE)
save(myEnv, file="myTickerData.rda")
...