Quantmod,getSymbols,R中提取收盘价

时间:2015-12-09 20:06:32

标签: r quantmod

我有一串代码,我正在尝试获取使用Quantmod的数据。我的列表很长,有一些不好的代码,所以我使用了try函数。

我在使用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对象中没有包含“close”的列值 - 这不是案子。对于每个xts元素(在这种情况下标识为“IBM”和“GM”),存在名为“XXX.close”的列(例如,IBM.Close,GM.Close)。我不知道为什么我无法正确获取语法或者让Cl看到关闭的列。

任何帮助表示感谢。

谢谢。

****编辑/更新***

我的样本向量列表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"

实际矢量的结构是相同的 - 它只是更长的维度。

2 个答案:

答案 0 :(得分:3)

你是否意识到令人难以置信的有用的量子加载&#34; qmao&#34; ?它使功能&#34; PF&#34; (价格框架)可用,如果我正确理解您的问题,它正是您正在寻找的。 (还有一个功能&#34; RF&#34;它与返回而不是价格相同) 例如:

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的别名)

答案 1 :(得分:2)

尝试以下方法:

  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)))
  }