¿Importar el precio de las acciones de Yahoo Finance a R?

26

Me gustaría importar el precio de la acción "Last Trade" de Yahoo Finance a R. La intención es trabajar con datos (casi) en tiempo real. ¿Hay alguna solución?

Gracias de antemano por cualquier comentario útil.

Steven
fuente
Este hilo también puede ser de interés: las API de datos / feeds disponibles como paquetes de R .
gung - Restablece a Monica

Respuestas:

14

Esto realmente no es una pregunta estadística (¿tal vez esto podría moverse a SO?), Pero hay una buena función en quantmod que hace lo que Dirk ha hecho a mano. Ver getQuote()y yahooQF(). Al escribir yahooQF()aparecerá un menú con todos los posibles formatos de cotización que puede usar.

> require(quantmod)
> getQuote("QQQQ;SPY", what=yahooQF("Last Trade (Price Only)"))
              Trade Time   Last
QQQQ 2011-03-17 12:33:00  55.14
SPY  2011-03-17 12:33:00 128.17
Joshua Ulrich
fuente
Gracias por su respuesta. Soy bastante nuevo aquí en stackexchange. ¿Cómo puedo mover mi pregunta a SO?
Steven
@ Steven: De nada. No estoy seguro de cómo mover las preguntas; Creo que los moderadores pueden hacerlo.
Joshua Ulrich
15

Eso es bastante fácil dado que R puede leer directamente de una URL determinada. La clave es simplemente saber cómo formar la URL. Aquí hay un ejemplo rápido y sucio basado en el código que Dj Padzensky escribió a fines de la década de 1990 y que he estado manteniendo en el módulo Perl Yahoo-FinanceQuote (que por supuesto también está en CPAN aquí ) durante casi el mismo tiempo.

Si conoce un poco de R, el código debe explicarse por sí mismo. Obtener documentación para la cadena de formato es un poco más complicado pero, por ejemplo, el módulo Perl tiene algo.

R> syms <- c("^GSPC", "^IXIC")
R> baseURL <- "http://download.finance.yahoo.com/d/quotes.csvr?e=.csv&f="
R> formatURL <- "snl1d1t1c1p2va2bapomwerr1dyj1x"
R> endURL <- "&s="
R> url <- paste(baseURL, formatURL, endURL, paste(syms, collapse="+"), sep="")
R> read.csv(url, header=FALSE)
     V1                V2      V3        V4     V5 V6    V7
1 ^GSPC S&P 500 INDEX,RTH 1256.88 3/16/2011 4:04pm  0 0.00%
2 ^IXIC  NASDAQ Composite 2616.82 3/16/2011 5:30pm  0 0.00%
          V8 V9 V10 V11     V12     V13               V14
1 4282084608  0 N/A N/A 1256.88 1279.46 1249.05 - 1280.91
2          0  0 N/A N/A 2616.82    0.00       0.00 - 0.00
                V15 V16 V17 V18 V19 V20 V21      V22
1 1010.91 - 1344.07 N/A N/A N/A N/A N/A N/A      SNP
2 2061.14 - 2840.51 N/A N/A N/A N/A N/A N/A NasdaqSC
R> 

La columna tres es tu último intercambio. Durante las horas de mercado abierto obtendrá menos NA y más variabilidad de datos. Pero tenga en cuenta que la mayoría de los precios tienen un retraso de 15 o 20 minutos, pero algunos índices son en tiempo real. Los datos en tiempo real son un gran negocio y un gran ingreso para los intercambios, por lo que tienden a no revelarlos. Además, y si no recuerdo mal, las pantallas más nuevas y en tiempo real en las páginas de Finanzas en Google y Yahoo usan algo más AJAXy que es más difícil de extraer del exterior.

Dirk Eddelbuettel
fuente
esto no funcionó para mí hoy, no he podido descargar el índice Nasdaq compuesto desde antes de 2001, desde mis fuentes de datos habituales (Quandl y quantmod) por alguna razón, y estaba buscando alternativas.
PatrickT
4

Aquí hay una pequeña función que escribí para recopilar y trazar datos "pseudo-en tiempo real" de yahoo:

require(quantmod)
Times <-  NULL
Prices <- NULL
while(1) {

   tryCatch({
      #Load current quote
      Year <- 1970
      currentYear <- as.numeric(format(Sys.time(),'%Y'))
      while (Year != currentYear) { #Sometimes yahoo returns bad quotes
         currentQuote <- getQuote('SPY')
         Year <- as.numeric(format(currentQuote['Trade Time'],'%Y'))
      }

      #Add current quote to the dataset
      if (is.null(Times)) {
         Times <- Sys.time()-15*60 #Quotes are delayed 15 minutes
         Prices <- currentQuote['Last']
      } else {
         Times <- c(Times,Sys.time())
         Prices <- rbind(Prices,currentQuote['Last'])
      } 

      #Convert to 1-minute bars
      Data <- xts(Prices,order.by=Times)
      Data <- na.omit(to.minutes(Data,indexAt='endof'))

      #Plot the data when we have enough
      if (nrow(Data)>5) { 
         chartSeries(Data,theme='white',TA='addRSI(n=5);addBBands(n=5)')
      }

      #Wait 1 second to avoid overwhelming the server
      Sys.sleep(1)

   #On errors, sleep 10 seconds and hope it goes away
   },error=function(e) {print(e);Sys.sleep(10)}) 
}

Produce gráficos como este: Gráfico

También puede usar los datos para otros fines.

Zach
fuente
Gracias por este script, sin embargo, tengo un problema tonto con un "}" No puedo ejecutarlo :(
@acabahe Todavía funciona bien para mí. Asegúrate de agarrar todo, desde require(quantmod)el final }por sí solo en la última línea. Deberá esperar al menos 5 minutos antes de que aparezca un gráfico.
Zach
-1
library(quantmod)
getSymbols("LT.NS",src="yahoo")
usuario107070
fuente