クオントストラットとそれに付随する例の多くは、ある種のテクニカル指標をクロスすることによって取引を開始および終了することを中心に設定されているようです。
しかし、トレードへのエントリをトリガーするために使用している任意のインジケーターがあり、翌日のオープンまたはクローズでトレードを巻き戻したいとしましょう。この例をどのように実装するのが最適ですか?
次の例を見てみましょう。
- 2 つの計測器: XYZ と ABC
- エントリーシグナル: 何でもかまいません - 「シグナル」が true と評価されたときにいつでもトレードを開始したいだけです。この例では、XYZ/ABC の比率が T+0 で始値から終値へのいずれかの方向に 1% 以上変化するとします。
- 終了シグナル: 始値または終値などの市場イベント。この例では、上で設定した取引を翌日の始値で巻き戻したいとしましょう。
たとえば、次のようなものを使用して書くのblotter
は比較的簡単です。
ratio
次の列で呼び出された xts オブジェクトを想定します。
- ABC OHLC、
- XYZOHLC、
- 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)}
}
これはうまくいきます。
しかし、これを実装したいとしましょう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
それをどのように実装するかわかりません。
ここには非常に簡単な解決策があるかもしれませんが、私はこれを解決しようとしてループに陥ってしまいました。
いつものように、どんな助けでも大歓迎です。