Не удается загрузить данные из Yahoo Finance, используя Quantmod в R

Я пытаюсь загрузить данные из Yahoo с помощью этого кода:

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

Это работало для меня в прошлом в каждом случае, кроме как сейчас, за 5 дней до моего назначения группы.

Кроме того, я получаю эту ошибку:

 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' 

    История URL csv истории цен изменилась

    Старый 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

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

    Новая версия добавляет поле «крошка», которое, как представляется, отражает информацию о файлах cookie в браузере пользователя. Кажется, они намеренно блокируют автоматическую загрузку истории цен и заставляют запросы предоставлять информацию для проверки куки-файлов в веб-браузере

    Исправление описано в 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") 

    Версия 0.4-9 из quantmod устраняет эту проблему и теперь доступна в CRAN .

    Я всегда задавался вопросом, почему Yahoo была так хороша, что обеспечивала загрузку данных, и насколько я был бы прикручен, если бы они перестали это делать. К счастью, помощь на пути вежливости Джошуа Ульриха.

    Как бы то ни было сейчас, я исправил исправление, которое показывает один подход, чтобы обойти проблему загрузки.

     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 

    Он работает следующим образом:

    • Перейдите на страницу https://finance.yahoo.com/quote/AAPL/history?p=AAPL
    • Щелкните правой кнопкой мыши «загрузить данные» и скопируйте ссылку
    • Скопируйте крошку после «& crumb =» и используйте ее в вызове функции
    • Установите DLdir в каталог загрузки по умолчанию в настройках вашего браузера
    • Установите envir = as.environment ("yourEnvir") - по умолчанию globalenv ()
    • После загрузки файл csv удаляется из каталога загрузки, чтобы избежать беспорядка
    • Обратите внимание: это приведет к тому, что в браузере откроется окно без названия
    • В качестве простого теста: getSymbols.yahoo.fix («AAPL»)
    • -

    Вы также можете использовать getSymbols.yahoo.fix, чтобы получить список данных активов

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

    Кодируется в RStudio на Mac OSX 10.11, используя Safari в качестве браузера по умолчанию. Он также работает с Chrome, но вам нужно использовать крошку для Chrome. Я использую блокировщик файлов cookie, но мне нужно было включить whitelist finance.yahoo.com, чтобы сохранить файл cookie для будущих сеансов браузера.

    getSymbols.yahoo.fix может быть полезным. qauantmod :: getSymbols необходимости, имеет больше встроенного кода для опций и обработки исключений. Я кодирую личную работу, поэтому часто снимаю те части кода, которые мне нужны из функций пакета. Я не тестировал getSymbols.yahoo.fix, потому что, конечно, у меня нет рабочей версии GetSymbol для сравнения. Кроме того, я не мог упустить возможность войти в свой первый ответ stackoverflow.

    Я тоже сталкиваюсь с этой ошибкой. Пользователь на mrexcel fourm (jonathanwang003) объясняет, что новый URL использует Unix Timecoding для дат. Обновленный код VBA будет выглядеть примерно так:

     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 

    Недостатком здесь является извлечение поля «Крошка», которое содержит информацию о файлах cookie из браузера. У кого-нибудь есть идеи. Я нашел этот пост, который может помочь: https://www.mrexcel.com/forum/excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html (посмотрите на последний сообщение от john_w).

    Попробуйте Google. CSV немного отличается (не имеет скорректированной цены, а дата имеет другой формат).

    http://www.google.com/finance/historical?q=NASDAQ:ADBE&startdate=Jan+01%2C+2009&enddate=Aug+2%2C+2012&output=csv

    http://www.google.com/finance/historical?q=BVMF:PETR4&startdate=Jan+01%2C+2009&enddate=Aug+2%2C+2012&output=csv

    Давайте будем гением компьютера.