【问题标题】:quantstrat in R: Setting a date based exit signalR中的quantstrat:设置基于日期的退出信号
【发布时间】:2012-05-13 13:43:59
【问题描述】:

许多 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?”如果指标

我们的代码将是:

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 参数有关,但我不知道如何实现它。

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

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

【问题讨论】:

  • 注意 - 我也在尝试使用基于 sigComparison 的解决方案来评估日期比较(即,如果今天的日期是昨天的日期加上一个工作日并且存在现有头寸,则退出交易”
  • 您可能会在quant.stackexchange.com 获得更好的运气,尽管这里的财务人员也有健康的 R 意外事件。

标签: r xts quantmod quantitative-finance quantstrat


【解决方案1】:

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

你可以通过在退出规则中使用 delay 参数来做你想做的事。将延迟设置为一天,prefer 参数选择不同的价格列。

我不会为你写它,但这些信息足以解决你的问题。

【讨论】:

  • 谢谢,布赖恩。欣赏提示。我认为将信号与滤波器结合起来的能力是一个很好的开发方向。希望能够做出贡献。你们有没有机会将开发从 r-forge 转移到 github 之类的地方?
  • @n.e.w:这是一个很高的固定成本,所以机会很小。
  • @JoshuaUlrich 是在美元成本方面,还是仅仅是转移代码库/调整工作流程等的时间和麻烦?
  • @JoshuaUlrich 可以理解。感谢你们所有人为您制作的各种软件包所做的出色工作。一流的东西。
  • @Brian G. Peterson,不幸的是我发现这个解决方案通常不起作用。举一个简单的例子,假设我们有每日数据。我们在第 1 天入仓,然后在第 3 天使用delay = 2 退出。然后,quantstrat 将添加这两项交易。但是现在假设在第 2 天触发了一个新条目。那么当 quantstrat 调用 addTxn 时,它会给出错误:Transactions must be added in order. 那么还有另一种方法来制定基于日期的退出规则吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多