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

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 mi asignación grupal.

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' 

    El historial de precios de las URL csv parece haber cambiado

    Anterior 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 “migajas” que parece reflejar la información de las cookies en el navegador del usuario. Parece que están bloqueando intencionalmente las descargas automáticas de historiales de precios y forzando consultas para proporcionar información para validar cookies en un navegador web

    La solución se detalla en https://github.com/joshuaulrich/quantmod/issues/157

    Essentialy

     remotes::install_github("joshuaulrich/quantmod", ref="157_yahoo_502") # or devtools::install_github("joshuaulrich/quantmod", ref="157_yahoo_502") 

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

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

    Por superfluo que sea ahora, codifiqué una solución que muestra un enfoque para evitar el problema de la 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 migaja después de "& miga =" y úsela en la llamada de función
    • Establezca DLdir en el directorio de descargas 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 descarga para evitar el desorden
    • Tenga en cuenta que esto dejará abierta una ventana "sin título" en el navegador
    • Como una simple prueba: 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 OS X 10.11 utilizando Safari como mi navegador predeterminado. También parece funcionar con Chrome, pero deberá usar la galleta de migas para Chrome. Utilizo un bloqueador de cookies pero tuve que incluir en la lista blanca a finance.yahoo.com para conservar la cookie para futuras sesiones del navegador.

    getSymbols.yahoo.fix podría ser útil. qauantmod :: getSymbols de necesidad, tiene más código incorporado para las opciones y el manejo de excepciones. Estoy codificando para el trabajo personal, por lo que a menudo elevo esas piezas de código que necesito de las funciones del paquete. No comparé con 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 stackoverflow.

    Yo también estoy encontrando este error. Un usuario en mrexcel fourm (jonathanwang003) explica que la nueva URL utiliza la encoding de tiempo de Unix 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 “Migajas” que contiene información de cookies del navegador. Alguien tiene alguna idea. Encontré esta publicación, que puede ser útil: https://www.mrexcel.com/forum/excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html (mira el último publicado por john_w).