getSymbols没有按预期返回数据

时间:2014-03-03 01:26:45

标签: r quantmod

我在将股票定价数据输入R时遇到了一些麻烦。我有一个超过4k符号的列表,有些不再有效/有效。我在列表中使用了与get.hist.quote的lapply,但是一些不好的代码在它的轨道上停止了太多,因为它是一个实用的方法。在这篇文章之后:l_ply: how to pass the list's name attribute into the function?并尝试使用接受的答案是我能找到的看似最好的方法,但它无效。 l_ply不会将任何符号加载到我的工作区中。我收到这些警告:

Warning messages:
1: In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  :
  downloaded length 90279 != reported length 200
2: In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  :
  downloaded length 87827 != reported length 200
3: In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  :
  downloaded length 89737 != reported length 200

上面引用的帖子中我试图使用的代码如下。有没有解决这个问题?我正在看到有关类似情况的其他帖子,但是这样的修复对我来说不起作用。如果其他人有一个很好的方式来获取许多代码的每日数据,我会对所有建议持开放态度。提前谢谢。

library(quantmod)
library(plyr)
symbols <- c("MSFT","C","MMM")

#1
l_ply(symbols, function(sym) try(getSymbols(sym))) 
symbols <- symbols[symbols %in% ls()]

#2
sym.list <- llply(symbols, get) 

#3
data <- xts()
for(i in seq_along(symbols)) {
  symbol <- symbols[i]
  data <- merge(data, get(symbol)[,paste(symbol, "Close", sep=".")])
}

1 个答案:

答案 0 :(得分:3)

问题是默认情况下getSymbols会在parent.frame()中分配数据。当您从某个功能致电getSymbols()时,parent.frame()不再是您习惯的.GlobalEnv。因此,快速修复当前可能是替换

l_ply(symbols, function(sym) try(getSymbols(sym)))

l_ply(symbols, function(sym) try(getSymbols(sym, env=globalenv())))

请注意,在使用get的下一步中,您可能会遇到麻烦。您可能还应该指定您想要get数据的环境,以便在将其放入函数时也可以使用它。即sym.list <- llply(symbols, get, pos=globalenv())


这是使用quantmod

获取和合并数据的更常见的习惯用法
library(quantmod)
s <- c("MSFT","C","MMM")
e <- new.env() #environment in which to store data
getSymbols(s, src="yahoo", env=e)
do.call(merge, eapply(e, Cl)[s])

或者,像OP一样使用try

L <- lapply(symbols, function(sym) try(getSymbols(sym, auto.assign=FALSE)))
do.call(merge, lapply(L, Cl))