尝试复制答案时,Quantmod,getSymbols出错

use*_*310 7 r quantmod

我刚下载了包Quantmod,一直在玩getSymbols.我希望能够获得多个股票的数据,就像这个问题:getSymbols并使用lapply,Cl和merge来提取收盘价.

不幸的是,当我试图复制答案时:

tickers <- c("SPY","DIA","IWM","SMH","OIH","XLY",
         "XLP","XLE","XLI","XLB","XLK","XLU")
getSymbols(tickers, from="2001-03-01", to="2011-03-11")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

Error in download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  :
cannot open URL 
'http://chart.yahoo.com/table.csv?s=SPY&a=2&b=01&c=2001&d=2&e=11&f=2011&g=d&q=q&y=0&z=SPY&x=.csv'
In addition: Warning message:
In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,
: cannot open: HTTP status was '0 (null)'
Run Code Online (Sandbox Code Playgroud)

这是我的sessionInfo()

R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] quantmod_0.4-0 TTR_0.22-0     xts_0.9-7      zoo_1.7-10     Defaults_1.1-1

loaded via a namespace (and not attached):
[1] grid_3.0.2      lattice_0.20-23 tools_3.0.2    
Run Code Online (Sandbox Code Playgroud)

jlh*_*ard 4

编辑:回应OP的评论:

因此,至少可以说,提供免费历史数据下载的网站的底线似乎很奇怪。它们不一定适用于所有有效符号,有时它们会无缘无故地变得不可用。ichart.yahoo.com/table.csv24 小时前为我工作,但目前(对我)不起作用。这可能是因为雅虎对我的 IP 实施了 24 小时锁定,如果他们检测到可解释为 DDOS 攻击的活动,他们就会执行此操作。或者可能是因为其他原因......

下面更新后的代码,查询谷歌,确实有效(再次,目前),除了道琼斯指数之外的所有东西。请注意,如果指定交换和符号 ( EXCHANGE:SYMBOL),则会更成功。如果没有交换,我无法下载 SMH。最后,如果您遇到问题,请尝试取消注释 print 语句并将 URL 粘贴到浏览器中,看看会发生什么。

tickers <- c("SPY","DJIA","IWM","NYSEARCA:SMH","OIH","XLY",
             "XLP","XLE","XLI","XLB","XLK","XLU")

g <- function(x,from,to,output="csv") {
  uri      <- "http://www.google.com/finance/historical"
  q.symbol <- paste("q",x,sep="=")
  q.from   <- paste("startdate",from,sep="=")
  q.to     <- paste("enddate",to,sep="=")
  q.output <- paste("output",output,sep="=")
  query    <- paste(q.symbol,q.output,q.from,q.to,sep="&")
  url      <- paste(uri,query,sep="?")
  # print(url)
  try(assign(x,read.csv(url),envir=.GlobalEnv))
}
lapply(tickers,g,from="2001-03-01",to="2011-03-11",output="csv")
Run Code Online (Sandbox Code Playgroud)

你可以从圣路易斯联邦储备银行下载DJI,非常可靠。不幸的是,你得到了所有这些(从 1896 年开始),而且它是一个时间序列。

getSymbols("DJIA",src="FRED")
Run Code Online (Sandbox Code Playgroud)

原始回复:

这对我有用,除了 SMH 和 OIH 之外的所有东西。

tickers <- c("SPY","DJIA","IWM","SMH","OIH","XLY",
                             "XLP","XLE","XLI","XLB","XLK","XLU")

f <- function(x) {
  uri    <- "http://ichart.yahoo.com/table.csv"
  symbol <- paste("s",x,sep="=")
  from   <- "a=2&b=1&c=2001"
  to     <- "d=2&e=11&f=2011"
  period <- "g=d"
  ignore <- "ignore=.csv"
  query  <- paste(symbol,from,to,period,ignore,sep="&")
  url    <- paste(uri,query,sep="?")
  try(assign(x,read.csv(url),envir=.GlobalEnv))
}
lapply(tickers,f)
Run Code Online (Sandbox Code Playgroud)

和 之间的主要区别getSymbols(...)在于,它使用ichart.yahoo.com(如此处记录的,而getSymbols(...)使用chart.yahoo.com. 前者似乎更可靠。根据我的经验,使用getSymbols(...)雅虎是一件非常令人头痛的事情。

如果@user2492310的建议,使用src="google"对你有用,那么显然这就是要走的路。这对我不起作用。

另请注意:SMH 和 OIH 在 2001 年还不存在。其他的都至少可以追溯到 2000 年。因此,如果您提供日期范围,icart.yahoo.com(和 Chart.yahoo.com)可能会抛出错误超出了符号的操作范围。