Quantstrat sigPeak error: "k must be a non-negative integer"

Quantstrat sigPeak error: "k must be a non-negative integer"

我正在尝试使用 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

我认为这是由于 codicum 中的矛盾 quantmodquantstrat:

Quantstrat,在sigPeak的定义中:

Lag(ret_sig,-1)

Quantmod,在 Lag.quantmod.OHLC 的定义中,因为这是在 XTS 对象上使用的那个:

if(k.e<0||k.e!=as.integer(k.e)) stop("k must be a non-negative integer")

这是否意味着对于当前版本的 quantmod 和 quantstrat,sigPeak 根本不起作用?

我不确定该功能何时处于工作状态。该行是在 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 中报告并修复。