我试图通过for循环创建一系列空的xts对象,但是我失败了。
我创建了一个名为SYMBOL_vector的字符向量,其中包含我想要创建的空XTS对象的名称。我还使用getSymbols下载了一些股票市场数据,包括符号SPY的数据。因此,存在名为SPY的XTS对象。
我的循环代码是:
for (i in 1 : length(SYMBOL_vector)) {
SYMBOL_vector[i] <- as.xts(order.by = index(SPY))
}
当我运行代码时,收到以下错误:
xts中的错误(x = NULL,order.by = x,...): 形式参数“order.by”由多个实际参数匹配
如果对反馈很重要,一旦创建了空的xts对象,我将编写另一个for循环来填充每个返回数据。
我并不反对对循环采取完全不同的方法......这个似乎很快捷。在此先感谢您的帮助!
答案 0 :(得分:3)
如果你只使用xts
代替as.xts
,你的代码应该有用,但是,它并不是真正的“R路”(或“quantmod方式”)来解决这个问题。
考虑一下:
library(quantmod)
s <- c("SPY", "DIA", "QQQ")
e <- new.env() # an empty environment to hold yahoo price data
getSymbols(s, env=e)
L <- eapply(e, dailyReturn) # a list of returns
L$SPY
您可以在此停止,但如果需要,可以将列表转换为环境。
ret <- as.environment(L) # an environment with xts objects of daily returns
ls(ret)
get("DIA", pos=ret)
或者,如果您真的想要,可以附加ret
环境(不推荐)
attach(ret) # not recommended
head(QQQ)
# daily.returns
#2007-01-03 -0.0050621261
#2007-01-04 0.0189639223
#2007-01-05 -0.0047662279
#2007-01-08 0.0006841505
#2007-01-09 0.0050136737
#2007-01-10 0.0117913832
答案 1 :(得分:0)
@PHXtrader你要做的是用xts对象替换字符向量中的元素,这不是你想做的事情,也没有意义。要为名称分配值,您必须使用'assign'功能(?assign 来获取更多信息)。您的代码中的另一个错误是您使用'as.xts'而不是'xts'。看看这个玩具示例:
tickers <- c("AMZN","AAPL") # this is a character object
getSymbols("SPY",from="2013-09-01") # this is a xts object
for (i in 1:length(tickers)) {
assign(tickers[i],xts(order.by = index(SPY)))
}
结果是2个xts对象,名为AMZN,AAPL为零 - 。
>str(AAPL)
An 'xts' object of zero-width
> AAPL
Data:
numeric(0)
Index:
Date[1:9], format: "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06" "2013-09-09" ...
我认为通过使用列表(或有时创建新环境)来实现您想要做的更好更安全的方法。如上所述创建对象往往会导致很难找到和调试的错误,这些类型的构造会导致意外覆盖变量和许多其他潜在错误。以下示例避免循环并在列表中创建空对象:
tickers <- c("AMZN","AAPL")
mylist <- rep(as.list(xts(order.by = index(SPY))),2) # creates 2 empty xts-objects in list
names(mylist) <- tickers
> str(mylist)
List of 2
$ AMZN:An 'xts' object of zero-width
$ AAPL:An 'xts' object of zero-width