我一直想知道为什么雅虎会提供数据下载功能,如果他们停止这样做,我将会有多大的困难。幸运的是,Joshua Ulrich提供了帮助。
尽管现在可能已经没有意义,但我编写了一个修复程序,展示了解决下载问题的一种方法。
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/") {
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 = "")
utils::browseURL("https://www.google.com")
utils::browseURL(yahooURL)
Sys.sleep(time = 0.5)
yahooCSV <- paste(DLdir, symbol, ".csv", sep = "")
yahooDF <- utils::read.csv(yahooCSV, header = TRUE)
file.remove(yahooCSV)
yahooDF$Date <- as.Date(yahooDF$Date)
yahoo.xts <- xts(yahooDF[,-1],order.by=yahooDF$Date)
assign(symbol, yahoo.xts, envir = as.environment(envir))
print(symbol)
}
它的工作方式如下:
- 访问https://finance.yahoo.com/quote/AAPL/history?p=AAPL
- 右键单击“下载数据”并复制链接
- 复制“&crumb=”后面的碎片,并在函数调用中使用它
- 将DLdir设置为浏览器首选项中的默认下载目录
- 将envir = as.environment("yourEnvir")设置为默认值globalenv()
- 下载后,CSV文件将从您的下载目录中删除,以避免混乱
- 请注意,这将在浏览器中留下一个未命名的窗口
- 作为简单的测试:getSymbols.yahoo.fix("AAPL")
-
您还可以使用getSymbols.yahoo.fix和lapply一起使用,以获取资产数据列表
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)}
该代码是在Mac OSX 10.11上使用Safari作为默认浏览器的RStudio中编写的。它似乎也可以与Chrome一起使用,但您需要使用Chrome的cookie crumb。我使用了一个cookie阻止器,但必须将finance.yahoo.com列入白名单,以保留cookie供将来的浏览器会话使用。
getSymbols.yahoo.fix可能非常有用。quantmod::getSymbols出于必要性,具有更多内置的选项和异常处理代码。我编写个人工作的代码,因此我经常从软件包函数中提取我需要的那些代码片段。我还没有对getSymbols.yahoo.fix进行基准测试,因为我当然没有GetSymbol的工作版本可供比较。此外,我不能放过进入我的第一个stackoverflow答案的机会。