2013-06-28 5 views
1

я застрял с последующим анализом:Ошибка при выполнении анализа quantstrat

library(quantstrat) 

stock_size = 200 
tickers = c("XOM", "MCD") 
init.date = as.Date("2008-01-01") 

usd = "USD" 
currency(usd) 
for(ticker in tickers){ 
    stock(ticker, currency=usd, multiplier = 1) 
} 

options("getSymbols.warning4.0"=FALSE) 
getSymbols(tickers,from=init.date,to.assign=TRUE) 

suppressWarnings(rm(strat, port, acct, ords)) 

port.name <- "MyPort" 
port <- initPortf(port.name,tickers,initDate=init.date) 
acct.name <- "MyAcct" 
acct <- initAcct(acct.name,portfolios=port.name, initDate=init.date, initEq=35000) 
ords <- initOrders(portfolio=port.name,initDate=init.date) 

strat.name <- "MyStrat" 
strat<- strategy(strat.name) 
strat<- add.indicator(strategy = strat, name = "SMA", arguments = list(x=quote(Ad(mktdata)), n=20),label= "ma20") 
strat<- add.indicator(strategy = strat, name = "SMA", arguments = list(x=quote(Ad(mktdata)), n=50),label= "ma50") 

strat<- add.signal(strat, name="sigCrossover", arguments = list(columns=c("ma20","ma50"), relationship="gte"), label="ma20.gt.ma50") 
strat<- add.signal(strat, name="sigCrossover", arguments = list(column=c("ma20","ma50"), relationship="lt"), label="ma20.lt.ma50") 

strat<- add.rule(strategy = strat,name='ruleSignal', arguments = list(sigcol="ma20.gt.ma50", sigval=TRUE, orderqty=stock_size, ordertype='market', orderside='long', pricemethod='market'), type='enter', path.dep=TRUE) 
strat<- add.rule(strategy = strat,name='ruleSignal', arguments = list(sigcol="ma20.lt.ma50", sigval=TRUE, orderqty='all', 
ordertype='market', orderside='long', pricemethod='market'), type='exit', path.dep=TRUE) 

out<-try(applyStrategy(strategy=strat, portfolios=port.name)) 
charts.PerformanceSummary() 

, потому что я получил эту пару ошибок:

Error in `colnames<-`(`*tmp*`, value = c("XOM.Adjusted.SMA.50", "XOM.Adjusted.SMA.20.ma20.SMA.50" : 
    length of 'dimnames' [2] not equal to array extent 
Error in inherits(x, "xts") : argument "R" is missing, with no default 

Может кто-нибудь помочь мне найти то, что случилось?

+0

Этот сайт не место для поиска «Найти мои ошибки» - вам нужно задать конкретный вопрос, связанный с программированием. –

+6

@ SeñorO IMO, это модельный вопрос. Он дает краткий, воспроизводимый пример, который выглядит почти идентично демо, который поставляется вместе с пакетом, но этот код дает ошибку, и это не очевидно, откуда оно происходит, поскольку оно происходит где-то в коде квант-кода. SO - это именно то место, где можно обратиться за помощью к выяснению причины возникновения ошибки. – GSee

ответ

5

В текущей версии TTR имена столбцов, возвращаемых индикаторами MA, имеют префикс имени столбца ввода. Например. SMA (MCD.Adjusted, n = 20) возвращает колонку с именем MCD.Adjusted.SMA.20.

Ad() будет возвращать все имена столбцов, соответствующие строке Скорректированный.

К тому времени ваш второй SMA-индикатор получает называется, Ad() будет соответствовать 2 имен столбцов (оригинал MCD.Adjusted столбцов плюс столбцов вывода для первого индикатора MCD.Adjusted.SMA.20). Это приводит к ошибке измерения, поскольку в текущей реализации SMA() может обрабатывать только один входной столбец в то время.

Решение должно передать только первое совпадение, используя quote (Ad (mktdata) [, 1]) в списке аргументов.

+0

Спасибо большое @Jan Humme, теперь скрипт продолжается до строки 37, где есть «charts.PerformanceSummary()». Он показывает: «Ошибка в наследовании (x,« xts »): отсутствует аргумент« R », без значения по умолчанию». Есть ли способ избавиться от этой последней ошибки? – alexyz78

+0

@ user601423 вы не можете вызвать 'charts.PerformanceSummary' без аргументов. «R» - необходимый аргумент. См. '? Charts.PerformanceSummary' – GSee