我有一串代码,我正在尝试获取使用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"
实际矢量的结构是相同的 - 它只是更长的维度。
答案 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)))
}