r - R 中的 Quantstrat : Setting a date based exit signal

标签 r xts quantmod quantitative-finance quantstrat

大部分 Quantstrat 和随附的示例似乎都是通过穿越某种技术指标来进入和退出交易。

但是,假设您有一个任意指标,用于触发交易入场,但您希望在第二天开盘或收盘时平仓交易。您将如何最好地实现这个示例?

让我们看下面的例子:

  • 两种工具:XYZ 和 ABC
  • 进场信号:可以是任何东西 - 我们只想在我们的“信号”评估为真时进场交易。对于此示例,假设任何时候 XYZ/ABC 比率在 T+0 上从开盘到收盘的任一方向变化超过 1%
  • 退出信号:市场事件,例如开盘或收盘。假设,在本例中,我们希望在第二天开盘时平仓上面设置的交易。

例如,使用 blotter 编写这样的内容相对容易:

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

  1. ABC OHLC,
  2. XYZ OHLC,
  3. 以 OHLC 表示的 ABC/XYZ 比率
  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)}

  }

这工作得很好。

但是假设我们想在 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 以便在第二天开盘时轻松平仓?

我知道它可能与 ruleSignal 中的 timestamp 参数有关,但我不知道如何实现它。

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

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

最佳答案

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

您可以通过使用退出规则的延迟参数来执行您想要的操作。将延迟设置为一天,并将 prefer 参数设置为首选不同的价格列。

我不会为您编写它,但这足以解决您的问题。

关于r - R 中的 Quantstrat : Setting a date based exit signal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10441614/

相关文章:

r - 使用构面将表添加到 ggplot

r - 使用 rfsrc 预测多变量模型

使用 R 中的 tbl_regression 函数在一列中具有 95%CI 的回归系数?

r - 累积回溯滚动连接

r - 绘制 [xts] 时忽略 cex.main

r - 每个公司每个月的最后观察 (R)

r - 使用 Quantstrat 优化信号参数会导致错误 : attempt to select less than one element

r - 将 POSIXct 对象强制转换为 Date 对象

r - 从数据集中删除特定行

r - 每月返回和不等月长度