R中的quantstrat:设置基于日期的退出信号

时间:2012-05-04 01:41:55

标签: r xts quantmod quantitative-finance quantstrat

许多量子计和附带的例子似乎是通过交叉某种技术指标来围绕进入和退出交易。

但是,假设你有一个任意指标,你用它来触发交易,但是你想在第二天的开盘或收盘时解除交易。你最好如何实现这个例子?

我们来看下面的例子:

  • 两种乐器:XYZ和ABC
  • 进入信号:可以是任何东西 - 我们只想在我们的“信号”评估为真时进入交易。对于这个例子,假设任何时候XYZ / ABC的比率在T + 0上从Open到Close的任一方向变化超过1%
  • 退出信号:市场活动,例如开盘或平仓。比方说,在这个例子中,我们希望在第二天的开放时解除我们在上面设定的交易。

例如,使用blotter写这样的东西会相对容易:

假设xts对象名为ratio,其列为:

  1. ABC OHLC,
  2. XYZ OHLC,
  3. ABC / XYZ的比率表示为OHLC
  4. 货币OHLC“CCY”(这是一种交叉货币对)
  5. 我们的指标(OpCl(ABC / XYZ)),
  6. “发出信号?”如果指标> 1,则评估为1 1%,否则为0
  7. “信号dn?”如果指标是<1,则评估为1。 -1%,否则为0
  8. 我们的代码将是:

    for( i in 1:nrow(ratio) ) {
    
      ## Define the dates:
    
      CurrentDate <- index(ratio[i,])
    
      NextDate <- index(ratio[i+1,])
    
      ## Define the prices:
    
      XYZClosePrice <- as.numeric(ratio$XYZ.Close[i,])
      ABCClosePrice <- as.numeric(ratio$ABC.Close[i,])
    
      XYZOpenPrice <- as.numeric(ratio$XYZ.Open[i+1,])
      ABCOpenPrice <- as.numeric(ratio$ABC.Open[i+1,])
    
      CCYClosePrice <- as.numeric(ratio$CCY.Close[i,])
      CCYOpenPrice <- as.numeric(ratio$CCY.Open[i+1,])
    
    
      ## Define the spread:      
    
      SpreadOp <- ABCOpenPrice/XYZOpenPrice
      SpreadCl <- ABCClosePrice/XYZClosePrice
    
      ## Define the hedge ratio (let's say XYZ has a multiplier of 25 and ABC of 50)
    
      HedgeOp <- 25 * ((CCYOpenPrice/50)/SpreadOp)
      HedgeCl <- 25 * ((CCYClosePrice/50)/SpreadCl)
    
      # We want to trade 20 lots of XYZ each time with the corresponding hedge amount of   ABC
      Posn <- round(20 * HedgeCl,0)
    
      ## Add the trading rules (if move > 1% / else move <-1%):     
    
      # >= +1 % move
    
      if(ratio[i,'signal up?']==1){
    
    
        ## enter position on today's close
    
        addTxn(strat.name, Symbol='XYZ', TxnDate=CurrentDate,
               TxnPrice=XYZClosePrice, TxnQty = 20 , TxnFees=0)
        addTxn(strat.name, Symbol='ABC', TxnDate=CurrentDate,
               TxnPrice=ABCClosePrice, TxnQty = - Posn , TxnFees=0)
    
        ## exit position tomorrow's open
    
        addTxn(strat.name, Symbol='XYZ', TxnDate=NextDate,
               TxnPrice=XYZOpenPrice, TxnQty = - 20, TxnFeABC=0)
        addTxn(strat.name, Symbol='ABC', TxnDate=NextDate,
               TxnPrice=ABCOpenPrice, TxnQty = Posn , TxnFeABC=0)}
    
      else {
    
        # <= -1% move
        if(ratio[i,'signal dn?']==1){
    
          ## enter position on today's close
    
          addTxn(strat.name, Symbol='XYZ', TxnDate=CurrentDate,
                 TxnPrice=XYZClosePrice, TxnQty = -20 , TxnFees=0)
          addTxn(strat.name, Symbol='ABC', TxnDate=CurrentDate,
                 TxnPrice=ABCClosePrice, TxnQty =  Posn , TxnFees=0)
    
          # exit position on tomorrow's open
    
          addTxn(strat.name, Symbol='XYZ', TxnDate=NextDate,
                 TxnPrice=XYZOpenPrice, TxnQty =  20, TxnFees=0)
          addTxn(strat.name, Symbol='ABC', TxnDate=NextDate,
                 TxnPrice=ABCOpenPrice, TxnQty =  - Posn , TxnFees=0)}
    
      }
    

    这很好用。

    但是,假设我们想在quantstrat中实现这一点 - 它会变得有点棘手。假设所有投资组合,账户,指标和信号等都设置正确,我会添加这些交易规则进入交易:

    > strat <- add.rule(strat, name='ruleSignal',
    +                   arguments = list(sigcol="Cl.gt.1pct", sigval=TRUE, orderqty=20,
    +                                    ordertype='market', orderside='long', pricemethod='market'),
    +                   type='enter', path.dep=TRUE,symbol='XYZ')
    
    
    > strat <- add.rule(strat, name='ruleSignal',
    +                   arguments = list(sigcol="Cl.lt.1pct", sigval=TRUE, orderqty=Posn,
    +                                    ordertype='market', orderside='short', pricemethod='market'),
    +                   type='enter', path.dep=TRUE,symbol='ABC')
    

    我的问题是: 如何输入接下来的两个ruleSignal,以便在第二天开放时简单地解开它?

    我知道它可能与timestamp中的ruleSignal参数有关,但我无法弄清楚我是如何实现它的。

    这里可能有一个非常简单的解决方案,但我已经陷入了一个试图解决这个问题的循环。

    一如既往,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

quantstrat,如手册中所述,是一个基于信号的框架。它不是专为基于过滤器的交易而设计的。

您可以使用退出规则的延迟参数执行所需操作。将延迟设置为一天,首选参数优先选择不同的价格列。

我不打算为你写,但这足以解决你的问题。