【问题标题】:Quantmod, getSymbols, Extracting Close Price in RQuantmod,getSymbols,在 R 中提取收盘价
【发布时间】:2015-12-09 20:06:31
【问题描述】:

我有一串代码,我正在尝试获取使用 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"

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

【问题讨论】:

  • do.call(merge,lapply(stock_data,Cl)) 怎么样?请注意,您可以将merge 替换为cbinddo.call(cbind,lapply(stock_data,Cl))
  • @agstudy :这适用于我的示例列表,但是当我运行我的大列表时它失败了。我收到错误:'FUN 中的错误(X[[i]],...):下标越界:没有包含“关闭”的列名' - 但是当我查看我的全局环境时,绝对显示 IBM.Close等等。我不知道为什么它适用于一个小列表而不是一个大列表 - 除非它在错误的股票代码上失败时发生了什么事。
  • 错误很明显,您的 xts 之一没有关闭。要检查哪一个,你可以做sapply(stock_data,function(x) sum('Close' %in% names(x)))
  • @agstudy - 我运行了你的代码,结果全为 0。这表明如果我理解正确的话,它在任何列中都没有看到。在上面的两个元素示例代码向量上运行我的代码后,我也运行了它,并且也归零。我将在上面的问题中编辑并输入我的 str(stock_data) - 也许我误读了有关结构的内容?

标签: r quantmod


【解决方案1】:

您知道非常有用的 quantmod 插件“qmao”吗?它提供了一个功能“PF”(用于 price frame ),如果我正确理解您的问题,它可以完全满足您的需求。 (还有一个函数“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 的别名)

【讨论】:

  • 我不知道。我会看看。谢谢!
  • 我从 R Forge 找到并安装了插件,但无法在线或使用 R Studio 找到有关这些功能的任何文档。你能指导我一些吗?谢谢。
  • 如果软件包安装正确输入?PF?makePriceFrame会显示该功能的在线帮助。
【解决方案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)))
  }

【讨论】:

  • -谢谢。我正在详细介绍它,这需要一些时间。我们需要通过这样的工作来处理像坏股票这样简单的事情,这有点疯狂。你能详细解释一下代码吗?我对 plyr 不是很熟悉,但是看了一些,有些事情我无法完全弄清楚(例如,l_ply 没有根据文档保存任何内容,但很明显它保存了通过 data.env 中的 getSymbols 收集的数据等。 )。谢谢。
  • 是的,他们帮助很大。谢谢。最后一行只有一个简单的问题。为什么语法包含 get 函数? Quantmod 广告不应该照顾得到吗?谢谢。
  • @Windstorm1981 您需要检索 xts() 对象。 get() 检索带有符号的股票的 xts 对象。然后 Ad() 将拉动调整后的收盘价。如果它实现了你的目标,你介意接受这是正确的答案吗
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2021-10-04
  • 2011-07-31
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多