2015-07-19 4 views
2

Я получаю эту ошибку при применении стратегии в quantstrat:quantstrat логическая ошибка - отсутствует значение, где TRUE/FALSE требуется

Ошибка в случае (длина (к) == 0 || (длина (к) == 1 & & J == 0)) {: пропущенное значение где TRUE/FALSE необходимо

Мой код выглядит следующим образом:

.blotter <- new.env() 
.strategy <- new.env() 
Sys.setenv(TZ="UTC") 
STRATEGY<-'PFReplicate' 

try(rm.strat(STRATEGY)) 

n<-130 

#SMA signals and rules 
LONG.ENTRY.SIGNAL.SMA<-"CLOSE_GT_SMA_SIG_LONG" 
LONG.EXIT.SIGNAL.SMA<-"CLOSE_LT_SMA_SIG_LONG" 
SHORT.ENTRY.SIGNAL.SMA<-"CLOSE_LT_SMA_SIG_SHORT" 
SHORT.EXIT.SIGNAL.SMA<-"CLOSE_GT_SMA_SIG_SHORT" 
LONG.ENTRY.RULE.SMA<-'L_ENTRY_SMA_RULE' 
LONG.EXIT.RULE.SMA<-'L_EXIT_SMA_RULE' 
SHORT.ENTRY.RULE.SMA<-'S_ENTRY_SMA_RULE' 
SHORT.EXIT.RULE.SMA<-'S_EXIT_SMA_RULE' 


LONG.ORDERSET.NAME<-'CLOSELONGSMA' 
SHORT.ORDERSET.NAME<-'CLOSESHORTSMA' 

strategy(STRATEGY,store=TRUE) 


Set up SMA indicator 
add.indicator(strategy = STRATEGY,name='SMA', 
       arguments=list(x=quote(mktdata),n), 
       label='SMA') 

#Set up signals 
#SMA signals 
add.signal(strategy = STRATEGY,name="sigCrossover", 
      arguments=list(columns=c('Close','SMA'), 
          relationship="gt"), 
      label=LONG.ENTRY.SIGNAL.SMA) 
add.signal(strategy = STRATEGY,name="sigCrossover", 
      arguments=list(columns=c('Close','SMA'), 
          relationship="lt"), 
      label=LONG.EXIT.SIGNAL.SMA) 
add.signal(strategy = STRATEGY,name="sigCrossover", 
      arguments=list(columns=c('Close','SMA'), 
          relationship="lt"), 
      label=SHORT.ENTRY.SIGNAL.SMA) 
add.signal(strategy = STRATEGY,name="sigCrossover", 
      arguments=list(columns=c('Close','SMA'), 
          relationship="gt"), 
      label=SHORT.EXIT.SIGNAL.SMA) 


#Add our SMA rules (enabled) 
add.rule(strategy = STRATEGY,name="ruleSignal", 
     arguments=list(sigcol=LONG.ENTRY.SIGNAL.SMA,sigval=TRUE, 
         orderqty=100,ordertype="market", 
         TxnFees=0,orderside="long", 
         orderset=LONG.ORDERSET.NAME), 
     type="enter",label=LONG.ENTRY.RULE.SMA) 

add.rule(strategy = STRATEGY,name="ruleSignal", 
     arguments=list(sigcol=LONG.EXIT.SIGNAL.SMA,sigval=TRUE, 
         orderqty='all',ordertype="market", 
         TxnFees=0,orderside="long", 
         orderset=LONG.ORDERSET.NAME), 
     type="exit",label=LONG.EXIT.RULE.SMA) 

add.rule(strategy = STRATEGY,name="ruleSignal", 
     arguments=list(sigcol=SHORT.ENTRY.SIGNAL.SMA,sigval=TRUE, 
         orderqty=100,ordertype="market", 
         TxnFees=0,orderside="short", 
         orderset=SHORT.ORDERSET.NAME), 
     type="enter",label=SHORT.ENTRY.RULE.SMA) 

add.rule(strategy = STRATEGY,name="ruleSignal", 
     arguments=list(sigcol=SHORT.EXIT.SIGNAL.SMA,sigval=TRUE, 
         orderqty='all',ordertype="market", 
         TxnFees=0,orderside="short", 
         orderset=SHORT.ORDERSET.NAME), 
     type="exit",label=SHORT.EXIT.RULE.SMA) 



symbol <- mar.rep 
port <- 'mar.rep' 

currency("USD") 
stock(primary_id = symbol,currency = "USD",multiplier = 1) 
Sys.setenv(TZ="UTC") 

initDate <- '1971-01-05' 
startDate <- '1972-01-06' 
endDate<- '2010-12-31' 
initEq <- 1e6 



initPortf(name = port,symbols = symbol,initDate=initDate) 
initAcct(name = port,portfolios = port,initDate=initDate,initEq=initEq) 
initOrders(portfolio = port,initDate=initDate) 
applyStrategy(strategy =STRATEGY,portfolios = port,debug = TRUE) 

Я пытался сохранить код простым, чтобы избежать немой ошибки, но я все еще получаю это. Функция applyStrategy запускает и перечисляет тысячи транзакций, и через 30 минут я получаю эту ошибку. Я предполагаю, что исправление прост, но я этого не вижу. Спасибо за вашу помощь!

+0

Ваш код не запускается, потому что 'symbol' не определен. Даже если бы это было так, немного попросить людей запустить что-то, что занимает 30 минут. –

ответ

4

Я выяснил проблему после размещения моего вопроса. Для всех, кто сталкивается с этой ошибкой при запуске Quantstrat, проверьте свои данные для NA. Кроме того, убедитесь, что все активы имеют явно определенные столбцы, которые точно соответствуют столбцам, указанным в add.signal.

Это может показаться очевидным, но управление данными было самым большим препятствием для получения результатов в моем случае. Мои данные поступали от разных поставщиков данных с различными форматами столбцов (в основном, csv-файлы). Проведя несколько часов очистки и настройки моих данных для выполнения стратегии, она работает (я нахожусь в 7 часов до обработки).

Кванстрат может быть трудно отлаживать, поскольку некоторые сообщения об ошибках нелегко интерпретировать. Обратите внимание, что это сообщение об ошибке сообщает вам, что одно или несколько логических сравнений в операторе if приводят к NA. Если вы видите эту ошибку, проверьте свои данные на NA, чтобы узнать, может ли это быть проблемой.

nrow(na.omit(data)) == nrow(data) 

Если это неверно, у вас есть НС. Вы можете удалить их с помощью

data_cleaned <- na.omit(data) 

, но это будет зависеть от вашего формата данных.

Извините, если это исправление ошибки для всех. Я просто хотел опубликовать подробный ответ на эту ошибку, поскольку, похоже, для людей это приносит немалую сумму. Если бы вчера я видел такое объяснение, я бы сэкономил несколько часов разочарования!

+0

Я рад, что вы отследили его, и спасибо за то, что вернулись и отправили ответ на свой вопрос! –