Не удается загрузить данные из 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).
Ответ 6
Попробуйте 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