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

n.e*_*e.w 8 r quantitative-finance xts quantmod quantstrat

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

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

我们来看下面的例子:

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

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

假设ratio用列调用xts对象:

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

我们的代码将是:

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)}

  }
Run Code Online (Sandbox Code Playgroud)

这很好用.

但是,让我们说我们想要实现这一点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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Bri*_*son 6

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

您可以使用延迟参数对退出规则执行所需操作.将延迟设置为一天,将prefer参数设置为不同的价格列.

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