无法使用DS中的Quantmod从Yahoo Finance下载数据

时间:2017-05-17 04:48:19

标签: r yahoo quantmod yahoo-finance r-package

我正在尝试使用以下代码从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'

6 个答案:

答案 0 :(得分:11)

价格历史记录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

新版本附加了一个“crumb”字段,该字段似乎反映了用户浏览器中的cookie信息。似乎他们故意阻止价格历史的自动下载并强制查询提供信息以在网络浏览器中验证cookie

答案 1 :(得分:9)

此修复程序详见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")

答案 2 :(得分:3)

quantmod的0.4-9版解决了这个问题,现在可以在CRAN上找到。

答案 3 :(得分:2)

我一直想知道为什么雅虎提供数据下载这么好,以及如果他们停止这样做我会变得多么糟糕。幸运的是,约书亚乌尔里希提供了帮助。

现在可能是多余的,我编写了一个修复程序,它显示了一种解决下载问题的方法。

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
  • 右键点击“下载数据”并复制链接
  • 在“&amp; crumb =”之后复制碎屑并在函数调用
  • 中使用它
  • 将DLdir设置为浏览器中的默认下载目录 偏好
  • 设置envir = as.environment(“yourEnvir”) - 默认为globalenv()
  • 下载后,csv文件将从您的下载中删除 目录,以避免混乱
  • 请注意,这会在浏览器中打开“无标题”窗口
  • 作为一个简单的测试:getSymbols.yahoo.fix(“AAPL”)
  •   -

您也可以使用laSly的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)}

使用Safari作为我的默认浏览器,在Mac OSX 10.11上的RStudio中编码。它似乎也适用于Chrome,但您需要使用Chrome crumb for Chrome。我使用cookie阻止程序,但必须将finance.yahoo.com列入白名单以保留未来浏览器会话的cookie。

getSymbols.yahoo.fix可能很有用。 qauantmod :: getSymbols的必要性,内置更多代码用于选项和异常处理。我正在为个人工作编码,所以我经常从包函数中提取我需要的那些代码片段。我没有对getSymbols.yahoo.fix进行基准测试,因为当然,我没有GetSymbol的工作版本进行比较。此外,我无法放弃进入我的第一个stackoverflow答案的机会。

答案 4 :(得分:1)

我也遇到了这个错误。 mrexcel fourm上的用户(jonathanwang003)解释说,新URL使用Unix时间码进行日期。更新后的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

这里缺少的部分是如何检索&#34; Crumb&#34;包含来自浏览器的cookie信息的字段。有人有主意吗。我找到了这篇文章,这可能会有所帮助:https://www.mrexcel.com/forum/excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html(请看john_w的最后一篇文章)。

答案 5 :(得分:-1)