我在将股票定价数据输入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=".")])
}
答案 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))