2015-07-19 76 views
2

在quantstrat施加策略時我正在此錯誤:quantstrat邏輯錯誤丟失值,其中TRUE/FALSE需要

錯誤如果(長度(J)== 0 ||(長度(J)== 1 & &Ĵ== 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

您的代碼不會運行,因爲符號未定義。即使這樣做,要求人們運行需要30分鐘的東西也是有點多。 –

回答

4

發佈我的問題後,我想出了問題。對於運行quantstrat時運行此錯誤的其他人,請檢查您的數據是否爲NAs。另外請確保所有資產都有明確定義的列,這些列與add.signal中引用的列完全匹配。

這聽起來很明顯,但數據管理是在我的情況下獲得結果的最大障礙。我的數據來自各種數據提供者,具有不同的列格式(主要是csv文件)。花了幾個小時清理並設置我的數據以貫穿整個策略之後,它正在工作(我在7小時的時間內處理)。

Quantstrat可能很難調試,因爲一些錯誤消息不容易解釋。請注意,此錯誤消息告訴您if語句中的一個或多個邏輯比較結果爲NA。如果您看到此錯誤,請檢查您的數據是否爲NA以查看是否可能是問題所在。

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

如果這不是真的,你有NAs。您可以刪除它們與

data_cleaned <- na.omit(data) 

但它將取決於您的數據格式。

對不起,如果這是每個人的補救錯誤。我只是想爲這個錯誤發佈一個詳細的答案,因爲它似乎對人們來說是相當可觀的。如果我昨天看到這樣的解釋,我會挽救幾個小時的挫折感!

+0

我很高興你追蹤到它,並感謝您回覆併發布自己問題的答案! –