Ошибка при запуске квантового анализа

Я застрял со следующим анализом:

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

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


person alexyz78    schedule 28.06.2013    source источник
comment
Этот сайт не место для «Найти мои ошибки» — у вас должен быть конкретный вопрос, связанный с программированием.   -  person Señor O    schedule 29.06.2013
comment
@SeñorO ИМО, это типовой вопрос. Он дает краткий, воспроизводимый пример, который выглядит почти так же, как демо, поставляемое с пакетом, но этот код дает ошибку, и непонятно, откуда она взялась, поскольку она встречается где-то в коде quantstrat. SO — это именно то место, куда можно обратиться за помощью в выяснении причины возникновения ошибки.   -  person GSee    schedule 29.06.2013


Ответы (1)


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

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

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

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

person Jan Humme    schedule 29.06.2013
comment
Большое спасибо @Jan Humme, теперь сценарий продолжается до строки 37, где есть charts.PerformanceSummary(). Он показывает: Error in inherits(x, "xts") : argument "R" is missing, with no default. Есть ли способ избавиться от этой последней ошибки? - person alexyz78; 03.07.2013
comment
@ user601423 вы не можете вызывать charts.PerformanceSummary без аргументов. R является обязательным аргументом. См. ?charts.PerformanceSummary - person GSee; 04.07.2013