web-dev-qa-db-fra.com

Impossible de télécharger des données depuis Yahoo Finance à l'aide de Quantmod dans R

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'
14
Daniel

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

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

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

11
solrak18

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")
9
Michael Cohen

La version 0.4-9 de quantmod corrige ce problème et est désormais disponible sur CRAN .

3
Robert

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:

  • Accédez à https://finance.yahoo.com/quote/AAPL/history?p=AAPL
  • Faites un clic droit sur "télécharger les données" et copiez le lien
  • Copiez la miette après "& crumb =" et utilisez-la dans l'appel de fonction
  • Réglez DLdir sur le répertoire de téléchargement par défaut dans les préférences de votre navigateur
  • Définissez envir = as.environment ("yourEnvir") - par défaut, globalenv ()
  • Après le téléchargement, le fichier csv est supprimé de votre répertoire de téléchargement pour éviter l'encombrement
  • Notez que cela laissera une fenêtre "sans titre" ouverte dans le navigateur
  • Comme test simple: getSymbols.yahoo.fix ("AAPL")
  • -

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.

2
flemingcra

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).

1
TheHeurist