2

quantstrat で戦略を適用すると、次のエラーが発生します。

if (length(j) == 0 || (length(j) == 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 分後にこのエラーが発生します。修正は簡単だと思いますが、表示されていません。ご協力いただきありがとうございます!

4

1 に答える 1

4

質問を投稿した後、問題を理解しました。quantstrat の実行中にこのエラーが発生した場合は、データの NA を確認してください。さらに、すべてのアセットに、 で参照されている列と正確に一致する明示的に定義された列があることを確認してくださいadd.signal

当たり前のように聞こえるかもしれませんが、私の場合、データ管理が結果を得る上での最大の障害でした。私のデータは、さまざまな列形式 (主に csv ファイル) のさまざまなデータ プロバイダーから取得されました。戦略を実行するためにデータのクリーニングとセットアップに数時間を費やした後、機能しています (これまでの処理時間は 7 時間です)。

Quantstrat は、一部のエラー メッセージが解釈しにくいため、デバッグが難しい場合があります。このエラー メッセージは、ifステートメント内の 1 つ以上の論理比較の結果がであることを示していることに注意してくださいNA。このエラーが表示された場合は、データをチェックしてNA、これが問題であるかどうかを確認してください。

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

これが当てはまらない場合は、NA があります。でそれらを削除できます

data_cleaned <- na.omit(data)

ただし、データ形式によって異なります。

これが誰にとっても修正エラーである場合は申し訳ありません。このエラーに対する詳細な回答を投稿したかっただけです。これは、人々にとってかなりの量になるようです。もし昨日このような説明を見ていたら、何時間もフラストレーションを感じずにいられただろうに!

于 2015-07-19T16:38:16.747 に答える