Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的quantstrat:设置基于日期的退出信号_R_Xts_Quantmod_Quantitative Finance_Quantstrat - Fatal编程技术网

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

R中的quantstrat:设置基于日期的退出信号,r,xts,quantmod,quantitative-finance,quantstrat,R,Xts,Quantmod,Quantitative Finance,Quantstrat,quantstrat及其附带的许多例子似乎都是围绕着进入和退出交易,通过跨越某种技术指标 然而,假设你有一个任意的指标,你用它来触发交易的进入,但是你只想在第二天的开盘或收盘时平仓交易。您如何最好地实现这个示例 让我们以下面的例子为例: 两种仪器:XYZ和ABC 进入信号:可以是任何东西-我们只想在“信号”评估为真时进入交易。对于本例,假设在T+0时,XYZ/ABC的比率在任一方向从打开到关闭的变化超过1% 退出信号:市场事件,如开盘或收盘。比方说,在这个例子中,我们希望在第二天的开盘交易中平

quantstrat及其附带的许多例子似乎都是围绕着进入和退出交易,通过跨越某种技术指标

然而,假设你有一个任意的指标,你用它来触发交易的进入,但是你只想在第二天的开盘或收盘时平仓交易。您如何最好地实现这个示例

让我们以下面的例子为例:

  • 两种仪器:XYZ和ABC
  • 进入信号:可以是任何东西-我们只想在“信号”评估为真时进入交易。对于本例,假设在T+0时,XYZ/ABC的比率在任一方向从打开到关闭的变化超过1%
  • 退出信号:市场事件,如开盘或收盘。比方说,在这个例子中,我们希望在第二天的开盘交易中平仓我们在上面设定的交易
例如,使用
blotter
编写类似的内容相对容易:

假设名为
ratio
的xts对象具有以下列:

  • ABC OHLC
  • XYZ OHLC
  • 以OHLC表示的ABC/XYZ比率
  • 货币OHLC“CCY”(这是一对跨货币)
  • 我们的指标(OpCl(ABC/XYZ))
  • “向上发送信号?”如果指示器大于1%,该值将计算为1%,否则为0
  • “信号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)}
    
      }
    
    我的问题是:如何输入接下来的两个
    ruleSignal
    ,以便在第二天的开放日轻松解开这对

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

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


    一如既往,非常感谢您的帮助。

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

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


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

    注意-我还试图开发一个基于
    sigcomparation
    的解决方案来评估日期比较(即如果今天的日期是昨天的日期加上一个工作日,并且存在现有头寸,则退出交易)"虽然这里也有健康的R-forge财务人员,但你可能会更幸运。谢谢,Brian。感谢你的提示。我认为将信号与过滤器相结合的能力是一个伟大的发展方向。我希望能够做出贡献。你们有机会将R-forge的开发转移到像github这样的地方吗?@n.e.w:这是一个很高的固定成本,所以机会很小。@JoshuaUlrich的成本是美元还是仅仅是改变代码库/调整工作流程等的时间和麻烦?@JoshuaUlrich是可以理解的。感谢你们所有人对所制作的各种软件包所做的出色工作。一流的东西。@Brian G.Peterson,不幸的是我发现了这一点s的解决方案通常不起作用。举一个简单的例子,假设我们有每日数据。我们在第1天输入一个头寸,然后在第3天使用
    delay=2
    退出。quantstrat随后将添加这两个交易。但现在假设在第2天触发一个新的条目。然后,当quantstrat调用
    addTxn
    时,它将给出错误:
    交易必须按顺序添加。
    那么有没有其他方法来制定基于日期的退出规则?
    > 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')