Не удается загрузить данные из 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'

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

Я всегда задавался вопросом, почему 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 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.

Ответ 5

Я тоже сталкиваюсь с этой ошибкой. Пользователь на 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).