我正在尝试使用R book从Data Mining复制股票预测案例研究,并且我试图将一些代码放在一个循环中,这样我就可以处理多个股票。但是,我无法弄清楚如何让defineModel函数在循环中工作。我想为每个库存计算一些技术指标,并最终使用随机森林来选择最有用的库存。下面是一些示例代码。
library(quantmod)
# The list of stocks I want to investigate
stock.symbols = c("MMM", "IBM")
# Download daily stock prices to global environment
getSymbols(stock.symbols, src = "yahoo", quotes = c("Open", "High", "Low", "Close", "Volume", "Adjusted"), from = "2011-01-01", to = "2012-01-01")
# "Custom" indicator functions
myAroon = function(x) aroon(Cl(x))[,1]
myADX = function(x) ADX(HLC=x)[,4]
# Try to create quantmod model for each stock
for(i in stock.symbols)
{
my.model = specifyModel(Cl(MMM) ~ myAroon(MMM) + myADX(MMM)) # this line works - looks up MMM in global environment
# my.model = specifyModel(Cl(i) ~ myAroon(i) + myADX(i)) # I would like something like this
}
据我所知,如果您通过符号引用股票,例如“MMM”,则指定模型会在当前工作区中查找它。我想知道如何使这更通用。在那一刻我收到以下错误:
no applicable method for 'as.xts' applied to an object of class "character"
我已经尝试过浏览defineModel的文档,但无济于事(它似乎不是世界上使用最广泛的函数)。我也尝试过使用get()和as.name()。我意识到我可能在这里做了一些完全错误的事情,所以请提前道歉!任何帮助都将非常感激。
答案 0 :(得分:1)
使用get
对我有用。
my.model <- list()
for(i in stock.symbols)
{
stock <- get(i)
my.model = c(my.model, specifyModel(Cl(stock) ~ myAroon(stock) + myADX(stock)) )
}
lapply(my.model, function(x) head(x@model.data))
答案 1 :(得分:0)
作为影子答案的替代/补充,您可以指定自己的环境来存储结果:
data.env <- new.env()
getSymbols(stock.symbols, env=data.env, src = "yahoo",
quotes = c("Open", "High", "Low", "Close", "Volume", "Adjusted"),
from = "2011-01-01", to = "2012-01-01")
for(i in stock.symbols){
stock <- get(i,env=data.env)
...
}
这样做的好处是:a)更清洁(没有机会覆盖当前环境中的某些东西); b)面向未来。文档说明,从quantmod 0.5开始,getSymbols的默认行为将发生变化。
说到这一点,新的默认行为将是返回数据,而不是将其写入环境。您现在可以通过以下方式之一获得该行为:
getSymbols.auto.assign
指定为FALSE