quantstrat 逻辑错误 - 在 TRUE/FALSE 需要的地方缺少值

quantstrat logical error - missing value where TRUE/FALSE needed

我在 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 分钟后,我收到此错误。我猜修复很简单,但我没有看到它。感谢您的帮助!

我在 post 提出我的问题后发现了问题。对于 运行 在 运行ning quantstrat 时遇到此错误的任何其他人,请检查您的数据是否存在 NA。另外确保所有资产都有明确定义的列,这些列与 add.signal.

中引用的列完全匹配

这听起来很明显,但在我的案例中,数据管理是取得结果的最大障碍。我的数据来自各种数据提供者,具有不同的列格式(主要是 csv 文件)。在花了几个小时清理并通过策略将我的数据设置为 运行 之后,它正在运行(到目前为止我正在处理第 7 个小时)。

Quantstrat 可能很难调试,因为一些错误消息不容易解释。请注意,此错误消息告诉您 if 语句中的一个或多个逻辑比较结果为 NA。如果您看到此错误,请检查 NA 的数据,看看这是否可能是问题所在。

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

如果这不是真的,那么你有 NA。您可以使用

删除它们
data_cleaned <- na.omit(data)

但这取决于您的数据格式。

抱歉,如果这是对每个人的补救错误。我只是想 post 详细回答这个错误,因为它似乎对人们来说相当多。如果我昨天看到这样的解释,我会节省几个小时的挫败感!