Quantstrat sigPeak错误:" k必须是非负整数"

时间:2016-05-16 15:06:10

标签: r quantmod quantstrat

我正在尝试使用sigPeak信号,我的代码是:

add.signal(strategy=strat.id, name='sigPeak',
           arguments=list(column='ADX.ADX', direction="peak", data=quote(mktdata)),
           label='ADX.peak')

但是,当我在添加该applySignals(..., applyIndicators(..))之后立即运行Error in FUN(X[[i]], ...) : k must be a non-negative integer 时,我收到错误:

quantmod

我认为这是由于quantstratsigPeak的以下行中的矛盾

Quantstrat,在Lag(ret_sig,-1) 的定义中:

Lag.quantmod.OHLC

Quantmod,在if(k.e<0||k.e!=as.integer(k.e)) stop("k must be a non-negative integer") 的定义中,因为它是在XTS对象上使用的那个:

sigPeak

这是否意味着使用当前版本的quantmod和quantstrat,2016-05-20只是不起作用?

1 个答案:

答案 0 :(得分:2)

我不确定该功能何时处于工作状态。该行于2011年3月在修订版588中添加。在此之前,该功能的状态为:

sigPeak <- function(label,data,column, direction=c("peak","bottom")){
    colNum<-match.names(column,colnames(data))
    direction=direction[1] # only use the first]
    switch(direction,
           "peak"   = { Lag(data[,colNum],2) < Lag(data[,colNum],1) & Lag(data[,colNum],1) > data[,colNum] } ,
           "bottom","valley" = { Lag(data[,colNum],2) > Lag(data[,colNum],1) & Lag(data[,colNum],1) < data[,colNum] }
    )
    colnames(ret_sig)<-paste(label,direction,"sig",sep='.')
    return(ret_sig)
}

您可以看到ret_sig在通过colnames引用之前未创建,因此调用colnames会引发错误。

无论如何,要解决此问题,您只需删除Lag(ret_sig, -1)行即可。该值未分配给任何内容,因此实际上并没有执行任何操作。

issue #41报告并修复。