Подтвердить что ты не робот

Загрузка цен на акции Yahoo в R

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

  • пропустите имя тикера, если оно неверно.
  • Каждый элемент в списке является фреймворком данных. Я хочу, чтобы имена тикеров добавлялись к именам переменных в элементарных кадрах элементов.
  • Мне нужен эффективный способ создания фрейма данных, который имеет цены закрытия как переменные.

Вот пример кода для упрощенной версии моей проблемы.

library(tseries)  
tckk <- c("MSFT", "C", "VIA/B", "MMM") # ticker names defined  
numtk <- length(tckk);  
ustart <- "2000-12-30";
uend <- "2007-12-30" # start and end date  
all_dat <- list(); # empty list to fill in the data  
for(i in 1:numtk)  
{  
  all_dat[[i]] <- xxx <- get.hist.quote(instrument = tckk[i], start=ustart, end=uend, quote = c("Open", "High", "Low", "Close"), provider = "yahoo", compression = "m")  
}   

Код останавливается в третьей записи, но я хочу пропустить этот тикер и перейти к "МММ". Я слышал о функции Trycatch(), но не знаю, как ее использовать.

В соответствии с вопросом 2, я хочу, чтобы имена переменных для первого элемента списка были "MSFTopen", "MSFThigh", "MSFTlow" и "MSFTclose". Есть ли лучший способ сделать это, кроме использования комбинации функций loop и paste().

Наконец, для вопроса 3 мне нужен фрейм данных с тремя столбцами, соответствующими ценам закрытия. Опять же, я пытаюсь избежать цикла здесь.

Спасибо.

4b9b3361

Ответ 1

Лучше всего использовать квант-мод и хранить результаты как временные ряды (в этом случае это будет xts):

library(quantmod)
library(plyr)
symbols <- c("MSFT","C","VIA/B","MMM")

#1
l_ply(symbols, function(sym) try(getSymbols(sym))) 
symbols <- symbols[symbols %in% ls()]

#2
sym.list <- llply(symbols, get) 

#3
data <- xts()
for(i in seq_along(symbols)) {
    symbol <- symbols[i]
    data <- merge(data, get(symbol)[,paste(symbol, "Close", sep=".")])
}

Ответ 2

Это также немного поздно... Если вы хотите захватить данные только с помощью базовых функций R без использования каких-либо дополнительных пакетов, просто используйте функцию read.csv(URL), где URL-адрес - это строка, указывающая на нужное место на Yahoo. Данные будут втянуты в качестве фрейма данных, и вам нужно будет преобразовать "Дата" из строки в тип даты, чтобы все графики выглядели хорошо. Ниже приведен фрагмент кода.

URL <- "http://ichart.finance.yahoo.com/table.csv?s=SPY"
dat <- read.csv(URL)
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")

Использование базовых функций R может дать вам больший контроль над обработкой данных.

Ответ 3

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

Функция stockSymbols в TTR выводит символы инструмента из nasdaq.com и настраивает символы, совместимые с Yahoo! Финансы. В настоящее время он возвращает ~ 6500 символов для AMEX, NYSE и NASDAQ. Вы также можете взглянуть на код в stockSymbols, который настраивает тикеры для совместимости с Yahoo! Финансы, чтобы, возможно, скорректировать некоторые тики в вашем файле.

ПРИМЕЧАНИЕ: stockSymbols в версии TTR на CRAN сломан из-за изменения на nasdaq.com, но он исправлен в версии R-forge TTR.

Ответ 4

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

library(fImport)

fecha1<-"03/01/2009"
fecha2<-"02/02/2010"

Sys.time()

y <- format(Sys.time(), "%y")    
m <- format(Sys.time(), "%m")    
d <- format(Sys.time(), "%d")
fecha3 <- paste(c(m,"/",d,"/","20",y), collapse="")

write.table(yahooSeries("GCI", from=fecha1, to=fecha2), file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)
write.table(yahooSeries("GCI", from=fecha2, to=fecha3), file = "GCIupdate.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)

GCI <- read.table("GCI.txt") 
GCI1 <- read.table("GCIupdate.txt")
GCI <- rbind(GCI1, GCI)
GCI <- unique(GCI)

write.table(GCI, file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)

Ответ 5

Немного изменены из вышеперечисленных решений... (спасибо Shane и Stotastic)

 symbols <- c("MSFT", "C", "MMM")

 # 1. retrieve data

 for(i in seq_along(symbols)) {
   URL <- paste0("http://ichart.finance.yahoo.com/table.csv?s=", symbols[i])
   dat <- read.csv(URL)
   dat$Date <- as.Date(dat$Date, "%Y-%m-%d")
   assign(paste0(symbols[i]," _data"), dat)
   dat <- NULL
 }

Ответ 6

Если ваша конечная цель - получить data.frame из трех столбцов цены закрытия, то новый пакет tidyquant может быть лучше подходит для этого.

library(tidyquant)

symbols <- c("MSFT", "C", "VIA/B", "MMM")

# Download data in tidy format. 
# Will remove VIA/B and warn you.
data <- tq_get(symbols)

# Ticker symbols as column names for closing prices
data %>% 
    select(.symbol, date, close) %>% 
    spread(key = .symbol, value = close)

Это будет масштабироваться до любого количества акций, поэтому файл из 1000 тикеров должен работать нормально!

Ответ 7

К сожалению, URL "ichart.finance.yahoo.com" мертв и не работает сейчас. Как я знаю, Yahoo закрыл его, и, похоже, он не будет открыт.

Несколько дней назад я нашел хорошую альтернативу (https://eodhistoricaldata.com/) с API, очень похожим на Yahoo Finance.

В принципе, для R- script, описанного выше, вам просто нужно изменить эту часть:

URL <- paste0("ichart.finance.yahoo.com/table.csv?s=", symbols[i])

:

URL <- paste0("eodhistoricaldata.com/api/table.csv?s=", symbols[i])

Затем добавьте ключ API, и он будет работать так же, как и раньше. Я сохранил много времени для своих R-скриптов.