2013-07-17 5 views
1

Я пытаюсь реплицировать исследование ситуации с запасом из Data Mining с помощью R-книги и пытаюсь поместить часть кода в цикл, чтобы я мог иметь дело с более чем одним запасом , Однако я не могу понять, как заставить функцию defineModel работать внутри цикла. Я хочу рассчитать ряд технических индикаторов для каждого запаса и в конечном итоге использовать случайный лес для выбора наиболее полезных. Ниже приведен пример кода.Использование defineModel из пакета quantmod в цикле

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 
} 

Я понимаю, что если вы обратитесь к запасу его символом, например, «МММ», specifyModel выглядит его в текущем рабочем пространстве. Я хотел бы знать, как сделать это более общим. На минуту я получаю следующее сообщение об ошибке:

no applicable method for 'as.xts' applied to an object of class "character" 

Я пытался идти через документацию для specifyModel, но безрезультатно (это не кажется, наиболее широко используемая функция в мире). Я также попытался использовать get() и as.name(). Я понимаю, что я могу делать что-то совершенно неправильное здесь, поэтому извиняюсь заранее! Любая помощь вообще была бы весьма признательна.

ответ

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([email protected])) 
+0

Спасибо! Кажется, это именно то, что я хотел. Я использовал что-то вроде Cl (get (i)), которое, как я полагаю, путало R каким-то образом. Еще раз спасибо за быстрый ответ. – NoneMoreBlack

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) 
    ... 
    } 

Преимущества этого есть: а) очиститель (нет шансов переопределения что-то в вашей нынешней среде); б) будущие доказательства. В документации говорится, что из quantmod 0.5 поведение по умолчанию getSymbols будет меняться.

Говоря о том, что новым поведением по умолчанию будет возвращение данных, а не запись в среду. Вы можете получить это поведение в настоящее время одним из:

  • Pass окр утратившим
  • Pass auto.assign = FALSE
  • В файле опций указать getSymbols.auto.assign как FALSE
+1

Я думаю, что в 0,5 идея будет заключаться в использовании 'loadSymbols()', если вы хотите хранить данные в среде и 'getSymbols()', если хотите вернуть данные. – GSee

+0

Спасибо за это. Я использовал отдельную среду в своем реальном коде, но пропустил это из моего примера выше для простоты. – NoneMoreBlack

Смежные вопросы