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 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 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
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
Prueba Google El CSV es un poco diferente (no tiene el precio ajustado y la fecha tiene otro formato).
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).