Quantmod,getSymbols,在 R 中提取收盘价

Quantmod, getSymbols, Extracting Close Price in R

我有一串代码,我正在尝试获取使用 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 时(我有各种排列 - none 它们是正确的)我收到一个错误,告诉我它们在 xts 对象中没有包含 "close" - 事实并非如此。对于每个 xts 元素(在本例中标识为 "IBM" 和 "GM"),都有一个名为 "XXX.close" 的列(例如,IBM.Close、GM.Close)。我不知道为什么我无法获得正确的语法或让 Cl 看到关闭的列。

感谢任何帮助。

谢谢。

**** Edit/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"

实际向量的结构相同 - 只是更长,维度更多。

尝试以下操作:

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

您知道非常有用的 quantmod 插件 "qmao" 吗?它提供了一个函数 "PF" (用于 price frame ),如果我正确理解你的问题,它就可以满足你的需求。 (还有一个函数 "RF" 与 returns 而不是价格相同) 示例:

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