在循环中使用quantmod包中的specifyModel

时间:2013-07-17 14:37:57

标签: r quantmod

我正在尝试使用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()。我意识到我可能在这里做了一些完全错误的事情,所以请提前道歉!任何帮助都将非常感激。

2 个答案:

答案 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的默认行为将发生变化。

说到这一点,新的默认行为将是返回数据,而不是将其写入环境。您现在可以通过以下方式之一获得该行为:

  • 将env传递为NULL
  • 传递auto.assign = FALSE
  • 在您的选项文件中,将getSymbols.auto.assign指定为FALSE