【发布时间】: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替换为cbind:do.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) - 也许我误读了有关结构的内容?