J'essaie de télécharger des données de Yahoo en utilisant ce code:
library(quantmod)
getSymbols("WOW", auto.assign=F)
Cela a fonctionné pour moi dans le passé à chaque occasion, sauf maintenant, 5 jours avant la date de mon affectation de groupe.
Sauf que maintenant je reçois cette erreur:
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'
Les URL csv de l'historique des prix semblent avoir changé
Ancien 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 nouvelle version ajoute un champ "crumb" qui semble refléter les informations des cookies dans le navigateur de l'utilisateur. Il semble qu'ils bloquent intentionnellement les téléchargements automatisés des historiques de prix et forcent les requêtes à fournir des informations pour valider les cookies dans un navigateur Web
Le correctif est détaillé sur 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 version 0.4-9 de quantmod corrige ce problème et est désormais disponible sur CRAN .
Je me suis toujours demandé pourquoi Yahoo était si gentil de fournir des téléchargements de données et à quel point je serais foutu s'ils cessaient de le faire. Heureusement, l'aide est en route avec l'aimable autorisation de Joshua Ulrich.
Aussi superflu qu'il soit maintenant, j'ai codé un correctif qui montre une approche pour contourner le problème de téléchargement.
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
Cela fonctionne comme ceci:
Vous pouvez également utiliser getSymbols.yahoo.fix avec lapply pour obtenir une liste de données sur les actifs
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)}
Codé dans RStudio sur Mac OSX 10.11 en utilisant Safari comme navigateur par défaut. Il semble également fonctionner avec Chrome, mais vous devrez utiliser la miette de cookie pour Chrome. J'utilise un bloqueur de cookies mais j'ai dû mettre en liste blanche finance.yahoo.com pour conserver le cookie pour les futures sessions du navigateur.
getSymbols.yahoo.fix peut être utile. qauantmod :: getSymbols de nécessité, a plus de code intégré pour les options et la gestion des exceptions. Je code pour un travail personnel, donc je soulève souvent les morceaux de code dont j'ai besoin des fonctions de package. Je n'ai pas référencé getSymbols.yahoo.fix car, bien sûr, je n'ai pas de version de travail de GetSymbol pour comparaison. De plus, je ne pouvais pas laisser passer l'occasion d'entrer ma première réponse de stackoverflow.
Je rencontre moi aussi cette erreur. Un utilisateur sur mrexcel fourm (jonathanwang003) explique que la nouvelle URL utilise le timecodage Unix pour les dates. Le code VBA mis à jour ressemblerait à ceci:
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 pièce manquante ici est de savoir comment récupérer le champ "Crumb" qui contient des informations sur les cookies du navigateur. N'importe qui a des idées. J'ai trouvé ce message, qui peut aider: https://www.mrexcel.com/forum/Excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html (regardez le dernier message de john_w).