2014-03-03 95 views
2

我在將股票定價數據導入到R時遇到了一些問題。我有超過4k個符號的列表,有些不再有效/有效。我在列表中使用了一個名爲get.hist.quote的lapply,但是一些糟糕的收單機構太多地阻止了它,因爲它不是一個實用的方法。以下這篇文章:l_ply: how to pass the list's name attribute into the function?並試圖使用接受的答案是我能找到的看似最好的方法,但它不起作用。 l_ply不會將任何符號加載到我的工作區中。我得到這些警告:getSymbols沒有按預期返回數據

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

那些更常見的成語是警告,而不是錯誤。但是,你說「不按預期返回數據」。什麼是預期的,它與你得到的有什麼不同? – GSee

+0

措辭不佳;是的,警告。我期待在工作空間中使用數據的符號;但是,我沒有。 – StatsViaCsh

+1

哦,我明白了。如果你使用'getSymbols(sym,env = globalenv())'它會做你所期望的。我將添加一個更常見的成語 – GSee

回答

3

的問題是,默認情況下getSymbols分配在parent.frame()數據。當您從功能呼叫getSymbols()時,parent.frame()不再是您習慣的.GlobalEnv。所以,快速解決您的電流可能會與

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

請注意,您可以在您使用get下一步碰到麻煩更換

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

。您應該也可以指定您想要的數據來自哪個環境,以便在將其放入函數中時也可以工作。即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]) 

或者,使用try像OP

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

非常感謝!我很感激。 – StatsViaCsh