2015-12-09 57 views
0

我有一串行情,我試圖獲取使用Quantmod的數據。我的列表很長,並且有一些不好的提示,所以我使用了納入try函數。Quantmod,getSymbols,提取關閉價格R

我在使用Quantmod的Cl函數時遇到了問題。至於我可以告訴它應該工作 - 但我相信我的語法有一個小問題。

代碼:

tickers = c("IBM","GM") #This is an example for purpose here 
stock_data <- lapply(tickers, function(tickers), try(getsymbols(tickers, 
    auto.assign=FALSE))) 
close_prices <- do.call(merge,Cl(stock_data)) 

stock_data回來,通過與每個元素作爲一個日期值的行和列的一系列股票相關的數據(開,關,股票代碼確定XTS對象的列表等)。

close_prices應該只是所有代號的收盤價欄(即IBM收盤價欄,GM收盤價欄等)的清單或數據框。

當我應用do.call(我有各種排列 - 他們都不正確)我得到一個錯誤,告訴我他們是沒有列值xts對象中包含「關閉」 - 只是isn'案件。對於每個xts元素(在這種情況下標識爲「IBM」和「GM」),存在名爲「XXX.close」的列(例如,IBM.Close,GM.Close)。我不知道爲什麼我無法獲得正確的語法,或者讓Cl看到關閉的列。

任何幫助表示讚賞。

謝謝。

****編輯/ UPDATE ***

我對樣本向量列表stock_data具有以下結構:

str(stock_data) 
List of 2 
$ :An ‘xts’ object on 2015-01-05/2015-12-07 containing: 
    Data: num [1:234, 1:6] 161 160 157 156 158 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:6] "IBM.Open" "IBM.High" "IBM.Low" "IBM.Close" ... 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 2 
    ..$ src : chr "yahoo" 
    ..$ updated: POSIXct[1:1], format: "2015-12-09 16:21:31" 
$ :An ‘xts’ object on 2015-01-05/2015-12-07 containing: 
    Data: num [1:234, 1:6] 35 34.4 35.2 36.1 36.2 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:6] "GM.Open" "GM.High" "GM.Low" "GM.Close" ... 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 2 
    ..$ src : chr "yahoo" 
    ..$ updated: POSIXct[1:1], format: "2015-12-09 16:21:31" 

結構是實際矢量是相同的 - 它只是更長的尺寸。

+0

什麼關於'do.call(merge,lapply(stock_data,Cl))'?請注意,你可以用'cbind'替換'merge':'do.call(cbind,lapply(stock_data,Cl))' – agstudy

+0

@agstudy:在我的示例列表中工作,但是當我通過它運行我的大列表失敗時。我得到錯誤:'FUN(X [[i]],...)中的錯誤:下標越界:沒有包含「Close」的列名稱 - 但是當我在我的全局環境中查看絕對顯示IBM.Close等等。我不知道爲什麼它會適用於小列表而不是大列表 - 除非它在壞的股票上失敗時發生某些事情。 – Windstorm1981

+0

錯誤很明顯,你的一個xts沒有關閉。檢查哪一個,你可以做'sapply(stock_data,function(x)sum('Close'%in names(x)))' – agstudy

回答

1

嘗試以下操作:

library(plyr) 
    library(quantmod) 
    stocks <- c("IBM","GM") 
    data.env <- new.env() 

    ### here we use l_ply so that we don't double save the data 
    ### getSymbols() does this already so we just want to be memory efficient 
    ### go through every stock and try to use getSymbols() 
    l_ply(stocks, function(sym) try(getSymbols(sym,env=data.env),silent=T)) 

    ### now we only want the stocks that got stored from getSymbols() 
    ### basically we drop all "bad" tickers 
    stocks <- stocks[stocks %in% ls(data.env)] 

    ### now we just loop through and merge our good stocks 
    ### if you prefer to use an lapply version here, that is also fine 
    ### since now we are just collecting all the good stock xts() objects 
    data <- xts() 
    for(i in seq_along(stocks)) { 
    symbol <- stocks[i] 
    data <- merge(data, Ad(get(symbol,envir=data.env))) 
    } 
+0

- 感謝。我正在仔細審查它,這需要一些時間。我們需要經過這樣的工作才能處理一件簡單的事情,那就是一種瘋狂的行爲。你能否詳細解釋代碼?我對plyr並不熟悉,但做了一些研究,還有一些我無法完全弄清楚的東西(例如,l_ply根據文檔保存任何內容,但保留通過get.ymbols收集的數據保存在data.env等內容。 )。謝謝。 – Windstorm1981

+0

@ Windstorm1981我希望我的編輯已經幫助 –

+0

是的,他們非常幫助。謝謝。最後一行只有一個簡單的問題。爲什麼語法包含get函數? Quantmod Ad不應該照顧得到嗎?謝謝。 – Windstorm1981

2

你知道難以置信的有用quantmod的附加 「qmao」?它使功能「PF」(價格框架)可用,如果我正確理解您的問題,它正是您正在尋找的東西。 (還有一個功能「RF」,它做同樣與回報,而不是價格) 例如:

library(quantmod) 
library(qmao) 

tickers = c('AMZN','AAPL','MSFT') 
getSymbols(tickers,from='2005-01-01') 
prices <- PF(tickers, silent=TRUE) # by default adj. closing prices are used, but you can select any column. open, high ... 

> head(prices) 
      AMZN  AAPL  MSFT 
2005-01-03 44.52 4.209303 21.03721 
2005-01-04 42.14 4.252533 21.11588 
2005-01-05 41.77 4.289778 21.06868 
2005-01-06 41.05 4.293103 21.04508 
2005-01-07 42.32 4.605692 20.98214 
2005-01-10 41.84 4.586404 21.08441 

欲瞭解更多信息檢查:?PF或makePriceFrame(PF是makePriceFrame的別名)

+0

我不知道。我會看看。謝謝! – Windstorm1981

+0

我找到並安裝了R Forge的附件,但無法在線或使用R Studio找到有關功能的任何文檔。你能指導我一些嗎?謝謝。 – Windstorm1981

+0

如果軟件包安裝正確,輸入'?PF'或'?makePriceFrame'應顯示此功能的在線幫助。 – hvollmeier