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.
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.
Respuestas:
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
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.
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:
También puede usar los datos para otros fines.
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.
library(quantmod)
getSymbols("LT.NS",src="yahoo")