8

クオントストラットとそれに付随する例の多くは、ある種のテクニカル指標をクロスすることによって取引を開始および終了することを中心に設定されているようです。

しかし、トレードへのエントリをトリガーするために使用している任意のインジケーターがあり、翌日のオープンまたはクローズでトレードを巻き戻したいとしましょう。この例をどのように実装するのが最適ですか?

次の例を見てみましょう。

  • 2 つの計測器: XYZ と ABC
  • エントリーシグナル: 何でもかまいません - 「シグナル」が true と評価されたときにいつでもトレードを開始したいだけです。この例では、XYZ/ABC の比率が T+0 で始値から終値へのいずれかの方向に 1% 以上変化するとします。
  • 終了シグナル: 始値または終値などの市場イベント。この例では、上で設定した取引を翌日の始値で巻き戻したいとしましょう。

たとえば、次のようなものを使用して書くのblotterは比較的簡単です。

ratio次の列で呼び出された xts オブジェクトを想定します。

  1. ABC OHLC、
  2. XYZOHLC、
  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')

私の質問は、次の 2 を入力して、翌日のオープン時に単純にペアを巻き戻すにはどうすればよいですか?ruleSignal

おそらくtimestamp引数と関係があることはわかっていますが、ruleSignalそれをどのように実装するかわかりません。

ここには非常に簡単な解決策があるかもしれませんが、私はこれを解決しようとしてループに陥ってしまいました。

いつものように、どんな助けでも大歓迎です。

4

1 に答える 1

6

マニュアルに記載されているように、quantstrat はシグナルベースのフレームワークです。実際にはフィルターベースの取引 用に設計されていません。

exit ルールにdelay引数を使用することで、必要なことを行うことができます。遅延を 1 日に設定し、prefer引数を別の価格列を優先するように設定します。

あなたのために書くつもりはありませんが、あなたの問題を解決するのに十分な情報です。

于 2012-05-04T13:15:00.870 に答える