Descargar precios de las acciones de Yahoo en R


Esta es una pregunta de novato en R. Estoy descargando datos mensuales de precios de acciones de yahoo finance utilizando R donde los nombres de los tickers se leen de un archivo de texto. Estoy usando un bucle para leer los nombres de los tickers para descargar los datos y ponerlos en una lista. Mi problema es que algunos nombres de ticker pueden no ser correctos, por lo que mi código se detiene cuando se encuentra con este caso. Quiero lo siguiente.

  1. omita el nombre del ticker si no es correcto.
  2. Cada elemento de la lista es un dataframe. Quiero la nombres de ticker que se agregarán a los nombres de variables en los dataframes de los elementos.
  3. Necesito una forma eficiente de crear un dataframe que tenga los precios de cierre como variables.

Aquí está el código de ejemplo para la versión simplificada de mi problema.

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")  
}   

El código se detiene en la tercera entrada, pero quiero omitir este ticker y pasar a "MMM". He oído hablar de la función Trycatch () pero no sé cómo usarla.

Según la pregunta 2, quiero los nombres de las variables para la primera elemento de la lista para ser "MSFTopen", "MSFThigh", "MSFTlow", y "MSFTclose". Hay una mejor manera de hacerlo aparte de usar una combinación de la función loop y paste ().

Finalmente, para la pregunta 3, necesito un dataframe con tres columnas correspondientes a los precios de cierre. Una vez más, estoy tratando de evitar un bucle aquí.

Gracias.

 26
Author: Peter Hall, 2010-08-18

7 answers

Su mejor apuesta es utilizar quantmod y almacenar los resultados como una serie de tiempo (en este caso, será 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=".")])
}
 21
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 15:02:16

Esto también es un poco tarde...Si desea obtener datos con solo las funciones base de R sin tratar con ningún paquete adicional, simplemente use la función read.csv(URL), donde la URL es una cadena que apunta al lugar correcto en Yahoo. Los datos se extraerán como un dataframe, y deberá convertir la 'Fecha' de una cadena a un tipo de fecha para que cualquier gráfica se vea bien. El fragmento de código simple está a continuación.

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

El uso de las funciones base de R puede darle más control sobre los datos manipulación.

 21
Author: stotastic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 14:52:13

Llego un poco tarde a la fiesta, pero creo que esto será muy útil para otros que llegan tarde.

La función stockSymbols en TTR obtiene los símbolos del instrumento de nasdaq.com y ajusta los símbolos para que sean compatibles con Yahoo! Financiación. Actualmente devuelve ~6,500 símbolos para AMEX, NYSE y NASDAQ. También puede echar un vistazo al código en stockSymbols que ajusta los tickers para que sean compatibles con Yahoo! Finanzas para posiblemente ajustar algunos de los tickers en su archivo.

NOTA: stockSymbols en la versión de TTR en CRAN se rompe debido a un cambio en nasdaq.com, pero está arreglado en la versión R-forge de TTR.

 8
Author: Joshua Ulrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-18 02:52:28

Lo hago así, porque necesito tener la lista de precios histórica y un archivo de actualización diaria para ejecutar otros paquetes:

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)
 3
Author: René Bauch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-01 19:32:55

Si su objetivo final es obtener los datos.marco de tres columnas de precios de cierre, entonces el nuevo paquete tidyquant puede ser más adecuado para esto.

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)

Esto escalará a cualquier número de acciones, por lo que el archivo de 1000 tickers debería funcionar bien!

 1
Author: Davis Vaughan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 20:31:12

Ligeramente modificado de las soluciones anteriores... (gracias Shane y 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
 }
 1
Author: Manoj Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-01 19:33:41

Desafortunadamente, URL "ichart.finance.yahoo.com" está muerto y no funciona ahora. Como sé, Yahoo lo cerró y parece que no se abrirá.

Hace varios días encontré una buena alternativa ( https://eodhistoricaldata.com / ) con una API muy similar a Yahoo Finance.

Básicamente, para R-script descrito anteriormente solo necesita cambiar esta parte:

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

A esto:

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

Luego agregue una clave API y funcionará de la misma manera que antes. He salvado un montón de es hora de mis R-scripts en él.

 0
Author: Denis Alaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-01 19:34:47