1

我正在尝试复制 Data Mining with R 书中的股票预测案例研究,并尝试将一些代码放在一个循环中,以便我可以处理不止一只股票。但是,我无法弄清楚如何让指定模型函数在循环中工作。我想为每只股票计算一些技术指标,并最终使用随机森林来选择最有用的。下面是一些示例代码。

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" 

我曾尝试浏览指定模型的文档,但无济于事(它似乎不是世界上使用最广泛的函数)。我也尝试过使用 get() 和 as.name()。我意识到我在这里可能做错了什么,所以提前道歉!任何帮助都将不胜感激。

4

2 回答 2

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))
于 2013-07-17T15:02:53.447 回答
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.assignFALSE
于 2013-07-18T00:17:22.470 回答