r yahoo quantmod yahoo-finance r-package

No se pueden descargar datos de Yahoo Finance usando Quantmod en R



yahoo-finance r-package (6)

Estoy tratando de descargar datos de Yahoo usando este código:

library(quantmod) getSymbols("WOW", auto.assign=F)

Esto me ha funcionado en el pasado en todas las ocasiones, excepto ahora, 5 días antes de la fecha de entrega de mi grupo.

Excepto que ahora recibo este error:

Error in download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m, : cannot download all files In addition: Warning message: In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m, : URL ''https://ichart.finance.yahoo.com/table.csv? s=WOW&a=0&b=01&c=2007&d=4&e=17&f=2017&g=d&q=q&y=0&z=WOW&x=.csv'': status was ''502 Bad Gateway''



La versión 0.4-9 de quantmod soluciona este problema y ahora está disponible en CRAN .


Las URL de csv del historial de precios parecen haber cambiado

https://chart.finance.yahoo.com/table.csv?s=AAPL&a=2&b=17&c=2017&d=3&e=17&f=2017&g=d&ignore=.csv

Nuevo: https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1492438581&period2=1495030581&interval=1d&events=history&crumb=XXXXXXX

La nueva versión agrega un campo de "miga" que parece reflejar información de cookies en el navegador del usuario. Parece que están bloqueando intencionalmente descargas automáticas de historiales de precios y obligando a las consultas a proporcionar información para validar las cookies en un navegador web



Siempre me he preguntado por qué Yahoo era tan amable de proporcionar descargas de datos y cuán jodido estaría si dejaran de hacerlo. Afortunadamente, la ayuda está en camino por cortesía de Joshua Ulrich.

Por superfluo que pueda ser ahora, codifiqué una solución que muestra un enfoque para solucionar el problema de descarga.

library(xts) getSymbols.yahoo.fix <- function (symbol, from = "2007-01-01", to = Sys.Date(), period = c("daily","weekly","monthly"), envir = globalenv(), crumb = "YourCrumb", DLdir = "~/Downloads/") { #1 # build yahoo query query1 <- paste("https://query1.finance.yahoo.com/v7/finance/download/",symbol,"?",sep="") fromPosix <- as.numeric(as.POSIXlt(from)) toPosix <- as.numeric(as.POSIXlt(to)) query2 <- paste("period1=", fromPosix, "&period2=", toPosix, sep = "") interval <- switch(period[1], daily = "1d", weekly = "1wk", monthly = "1mo") query3 <- paste("&interval=", interval, "&events=history&crumb=", crumb, sep = "") yahooURL <- paste(query1, query2, query3, sep = "") #'' requires browser to be open utils::browseURL("https://www.google.com") #'' run the query - downloads the security as a csv file #'' DLdir defaults to download directory in browser preferences utils::browseURL(yahooURL) #'' wait 500 msec for download to complete - mileage may vary Sys.sleep(time = 0.5) yahooCSV <- paste(DLdir, symbol, ".csv", sep = "") yahooDF <- utils::read.csv(yahooCSV, header = TRUE) #'' ------- #'' if you get: Error in file(file, "rt") : cannot open the connection #'' it''s because the csv file has not completed downloading #'' try increasing the time for Sys.sleep(time = x) #'' ------- #'' delete the csv file file.remove(yahooCSV) # convert date as character to date format yahooDF$Date <- as.Date(yahooDF$Date) # convert to xts yahoo.xts <- xts(yahooDF[,-1],order.by=yahooDF$Date) # assign the xts file to the specified environment # default is globalenv() assign(symbol, yahoo.xts, envir = as.environment(envir)) print(symbol) } #1

Funciona así:

  • Vaya a https://finance.yahoo.com/quote/AAPL/history?p=AAPL
  • Haga clic derecho en "descargar datos" y copie el enlace
  • Copie la miga después de "& crumb =" y úsela en la llamada de función
  • Establezca DLdir en el directorio de descarga predeterminado en las preferencias de su navegador
  • Establecer envir = as.environment ("yourEnvir") - por defecto es globalenv ()
  • Después de la descarga, el archivo csv se elimina de su directorio de descargas para evitar el desorden
  • Tenga en cuenta que esto dejará una ventana "sin título" abierta en el navegador
  • Como una prueba simple: getSymbols.yahoo.fix ("AAPL")
  • -

También puede usar getSymbols.yahoo.fix con lapply para obtener una lista de datos de activos

from <- "2016-04-01" to <- Sys.Date() period <- "daily" envir <- globalenv() crumb <- "yourCrumb" DLdir <- "~/Downloads/" assetList <- c("AAPL", "ADBE", "AMAT") lapply(assetList, getSymbols.yahoo.fix, from, to, envir = globalenv(), crumb = crumb, DLdir)}

Codificado en RStudio en Mac OSX 10.11 usando Safari como mi navegador predeterminado. También parece funcionar con Chrome, pero deberá utilizar la miga de cookies para Chrome. Utilizo un bloqueador de cookies pero tuve que incluir en la lista blanca finance.yahoo.com para conservar la cookie para futuras sesiones del navegador.

getSymbols.yahoo.fix puede ser útil. qauantmod :: getSymbols de necesidad, tiene más código incorporado para opciones y manejo de excepciones. Estoy codificando para el trabajo personal, por lo que a menudo levanto las piezas de código que necesito de las funciones del paquete. No he evaluado getSymbols.yahoo.fix porque, por supuesto, no tengo una versión funcional de GetSymbol para comparar. Además, no podía dejar pasar la oportunidad de ingresar mi primera respuesta de .


Yo también estoy encontrando este error. Un usuario en mrexcel fourm (jonathanwang003) explica que la nueva URL usa Unix Timecoding para las fechas. El código VBA actualizado se vería así:

qurl = "https://query1.finance.yahoo.com/v7/finance/download/" & Symbol qurl = qurl & "?period1=" & (StartDate - DateSerial(1970, 1, 1)) * 86400 & _ "&period2=" & (EndDate - DateSerial(1970, 1, 1)) * 86400 & _ "&interval=1d&events=history&crumb=" & **Crumb** QueryQuote: With Sheets(Symbol).QueryTables.Add(Connection:="URL;" & qurl, Destination:=Sheets(Symbol).Range("a1")) .BackgroundQuery = True .TablesOnlyFromHTML = False .Refresh BackgroundQuery:=False .SaveData = True End With

La pieza que falta aquí es cómo recuperar el campo "Crumb" que contiene información de cookies del navegador. Alguien tiene alguna idea. Encontré esta publicación, que puede ayudar: https://www.mrexcel.com/forum/excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html (mira por último publicado por john_w).