【问题标题】:Using specifyModel from quantmod package within a loop在循环中使用 quantmod 包中的指定模型
【发布时间】:2013-07-16 04:20:58
【问题描述】:

我正在尝试复制 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()。我意识到我在这里可能做错了什么,所以提前道歉!任何帮助都将不胜感激。

【问题讨论】:

    标签: r quantmod


    【解决方案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))
    

    【讨论】:

    • 谢谢!这似乎正是我想要的。我正在使用类似 Cl(get(i)) 的东西,我认为它以某种方式混淆了 R。再次感谢您的快速响应。
    【解决方案2】:

    作为影子答案的替代/补充,您可以指定自己的环境来存储结果:

    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

    【讨论】:

    • 我认为在 0.5 中,如果要将数据存储在环境中,则使用 loadSymbols(),如果要返回数据,则使用 getSymbols()
    • 谢谢。我一直在我的真实代码中使用一个单独的环境,但为了简单起见,我在上面的示例中省略了这个。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多