【问题标题】:Error in applying rules: Combined Technical indicator应用规则时出错:综合技术指标
【发布时间】:2018-09-30 04:01:58
【问题描述】:

我尝试在quantstrat 中将几个 EMA 和 RSI 组合在一起。最终,我的目标是生成一些图表和交易策略的表现。不幸的是,我似乎被困在混合指标中并不断收到错误消息(如下所述)。这是代码:

### Add Indicators

nRSI <- 21
buyThresh <- 50
sellThresh <- 50

#Indicator for EMA long medium short

nEMAL<- 80
nEMAM<- 21
nEMAS<- 13
nEMAF<- 5

add.indicator(strategy.st, name="RSI",
              arguments=list(price=quote(Cl(mktdata)), n=nRSI),
              label="rsi")

add.indicator(strategy.st, name="EMA",
              arguments=list(x=quote(Cl(mktdata)), n=nEMAL),
              label="EMAL")

add.indicator(strategy.st, name="EMA",
              arguments=list(x=quote(Cl(mktdata)), n=nEMAM),
              label="EMAM")

add.indicator(strategy.st, name="EMA",
              arguments=list(x=quote(Cl(mktdata)), n=nEMAS),
              label="EMAS")

add.indicator(strategy.st, name="EMA",
              arguments=list(x=quote(Cl(mktdata)), n=nEMAF),
              label="EMAF")

#customsig <- function(data) {
  sig <- data[, "EMA.EMAF"] > data[, "EMA.EMAS"] & data[, "EMA.EMAF"] > data[, "EMA.EMAM"] & data[, "rsi"] >50 & data[, "EMA.EMAM"] > data[, "EMA.EMAL"] & data[, "EMA.EMAS"] > data[, "EMA.EMAL"]  
  colnames(sig) <- "upSig"
  sig
}

#downsig <- function(data) {
  sig <- data[, "EMA.EMAF"] < data[, "EMA.EMAS"] & data[, "EMA.EMAF"] < data[, "EMA.EMAM"] & data[, "rsi"] <50 & data[, "EMA.EMAM"] < data[, "EMA.EMAL"] & data[, "EMA.EMAS"] < data[, "EMA.EMAL"]  
  colnames(sig) <- "downSig"
  sig
}



### Add Signal- Enter

add.signal(strategy.st, name="customsig",
           arguments=list(data = quote(mktdata)),
           label = "entersig")

add.signal(strategy.st, name="downsig",
           arguments=list(data = quote(mktdata)),
           label = "downsig.exitsig")

### Add rule - Enter

add.rule(strategy.st,
         name='ruleSignal',
         arguments = list(sigcol="entersig",
                          sigval=TRUE,
                          orderqty=1000,
                          ordertype='market',
                          orderside='long',
                          threshold=NULL),
         type='enter',
         path.dep=TRUE)


### Add rule- Exit

add.rule(strategy.st,
         name='ruleSignal',
         arguments = list(sigcol="downsig.exitsig",
                          sigval=TRUE,
                          orderqty=1000,
                          ordertype='market',
                          orderside='long',
                          pricemethod='market',
                          replace=FALSE),
         type='exit',
         path.dep=TRUE)

start_t<-Sys.time()
out<-try(applyStrategy(strategy=strategy.st,
                       portfolios=portfolio.st))


updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)

for(symbol in symbols) {
  chart.Posn(
    Portfolio=portfolio.st,
    Symbol=symbol,
    log=TRUE)
}

我得到的错误是

Error in applyRules(portfolio = portfolio, symbol = symbol, strategy = strategy,  : mktdata does not contain 'sigcol': entersig

我怎样才能完全应用这些规则?

【问题讨论】:

    标签: r trading quantstrat technical-indicator


    【解决方案1】:

    您没有正确识别信号的列名。看看这个,你会发现你的信号列没有你期望的标签:

    head(mktdata)
        # SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted rsi EMA.EMAL EMA.EMAM EMA.EMAS EMA.EMAF upSig.entersig downSig.downsig.exitsig
        # 2007-01-03   142.25   142.86  140.57    141.37   94807600     112.1708  NA       NA       NA       NA       NA             NA                      NA
        # 2007-01-04   141.23   142.05  140.61    141.67   69620600     112.4089  NA       NA       NA       NA       NA             NA                      NA
        # 2007-01-05   141.33   141.40  140.38    140.54   76645300     111.5123  NA       NA       NA       NA       NA             NA                      NA
        # 2007-01-08   140.82   141.41  140.25    141.19   71655000     112.0280  NA       NA       NA       NA       NA             NA                      NA
        # 2007-01-09   141.31   141.60  140.40    141.07   75680100     111.9328  NA       NA       NA       NA  141.168             NA                      NA
        # 2007-01-10   140.58   141.57  140.30    141.54   72428000     112.3057  NA       NA       NA       NA  141.292             NA                      NA
    

    在进行 3 次更正后,以下代码有效。由于您的示例无法重现,因此我不得不在上面添加一些额外的代码:

    library(quantstrat)
    
    
    ### Add Indicators
    strategy.st <- "test"
    portfolio.st <- "test"
    account.st <- "test"
    rm.strat(strategy.st)
    
    nRSI <- 21
    buyThresh <- 50
    sellThresh <- 50
    
    #Indicator for EMA long medium short
    
    stock.str <- "SPY"
    getSymbols("SPY")
    currency("USD")
    stock(stock.str, "USD")
    
    nEMAL<- 80
    nEMAM<- 21
    nEMAS<- 13
    nEMAF<- 5
    
    initPortf(portfolio.st,symbols=stock.str)
    initAcct(account.st,portfolios=portfolio.st)
    initOrders(portfolio=portfolio.st)
    
    
    strategy(strategy.st, store=TRUE)
    
    add.indicator(strategy.st, name="RSI",
                  arguments=list(price=quote(Cl(mktdata)), n=nRSI),
                  label="rsi")
    
    add.indicator(strategy.st, name="EMA",
                  arguments=list(x=quote(Cl(mktdata)), n=nEMAL),
                  label="EMAL")
    
    add.indicator(strategy.st, name="EMA",
                  arguments=list(x=quote(Cl(mktdata)), n=nEMAM),
                  label="EMAM")
    
    add.indicator(strategy.st, name="EMA",
                  arguments=list(x=quote(Cl(mktdata)), n=nEMAS),
                  label="EMAS")
    
    add.indicator(strategy.st, name="EMA",
                  arguments=list(x=quote(Cl(mktdata)), n=nEMAF),
                  label="EMAF")
    
    customsig <- function(data) {
      sig <- data[, "EMA.EMAF"] > data[, "EMA.EMAS"] & data[, "EMA.EMAF"] > data[, "EMA.EMAM"] & data[, "rsi"] >50 & data[, "EMA.EMAM"] > data[, "EMA.EMAL"] & data[, "EMA.EMAS"] > data[, "EMA.EMAL"]  
      colnames(sig) <- "upSig"
      sig
    }
    
    downsig <- function(data) {
      sig <- data[, "EMA.EMAF"] < data[, "EMA.EMAS"] & data[, "EMA.EMAF"] < data[, "EMA.EMAM"] & data[, "rsi"] <50 & data[, "EMA.EMAM"] < data[, "EMA.EMAL"] & data[, "EMA.EMAS"] < data[, "EMA.EMAL"]  
      colnames(sig) <- "downSig"
      sig
    }
    
    
    
    ### Add Signal- Enter
    
    add.signal(strategy.st, name="customsig",
               arguments=list(data = quote(mktdata)),
               label = "entersig")
    
    add.signal(strategy.st, name="downsig",
               arguments=list(data = quote(mktdata)),
               # CORRECTION:
               label = "exitsig")
    
    ### Add rule - Enter
    
    add.rule(strategy.st,
             name='ruleSignal',
             #CORRECTION:
             arguments = list(sigcol="upSig.entersig",
                              sigval=TRUE,
                              orderqty=1000,
                              ordertype='market',
                              orderside='long',
                              threshold=NULL),
             type='enter',
             path.dep=TRUE)
    
    
    ### Add rule- Exit
    
    add.rule(strategy.st,
             name='ruleSignal',
    
             # CORRECTION:
             arguments = list(sigcol="downSig.exitsig",
                              sigval=TRUE,
                              orderqty=1000,
                              ordertype='market',
                              orderside='long',
                              pricemethod='market',
                              replace=FALSE),
             type='exit',
             path.dep=TRUE)
    
    start_t<-Sys.time()
    out<-try(applyStrategy(strategy=strategy.st,
                           portfolios=portfolio.st))
    
    
    updatePortf(portfolio.st)
    updateAcct(portfolio.st)
    updateEndEq(account.st)
    

    【讨论】:

    • 谢谢。你有没有意识到,运行这个之后,即使累积回报是-1,我最终也能得到1000万的最终净值?你知道为什么会这样吗?
    • 您的问题很笼统,理想情况下您希望将您的问题重现为另一个 SO 问题。此外,您可能需要考虑阅读以下内容:stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多