GitHub で見る

デルタニュートラル・スプレッド Zスコア戦略ダイアグラム

普段は連動して動く2つの銘柄も、ときに乖離することがあり、その開いた差は再び縮まる傾向があります。このダイアグラムは一方の価格をもう一方の価格で割って合成銘柄を作り、その比率が自身の平均からどれだけ離れたかを自身のボラティリティを単位として測り、2つの銘柄を同時に反対方向へ建てます。割安な側を買い、割高な側を売る形です。比率が普段の水準に戻ると、両方のレッグが手仕舞われます。エントリーのたびに、その根拠となった数値を含む一行のテキストが読み上げられるように出力されます。

戦略の概要

  • インデックスのキューブが、1つ目の価格を2つ目の価格で割ることによって、2つの実在する銘柄から1つの合成銘柄を組み立てます。その合成銘柄に対してローソク足のシリーズを購読するため、スプレッドは2つのフィードから手作業で組み立てるのではなく、出来上がったローソク足として届きます。
  • スプレッドのローソク足に対して移動平均と標準偏差が計算され、コンバータがその終値を取り出します。判断に必要な数値はこの3つだけです。スプレッドが今どこにあるか、普段はどこにあるか、どれくらいの幅で振れるか。
  • 1つの数式がそれらをZスコア、すなわち終値と平均の差を標準偏差で割った値に変換し、鏡写しのもう1つの数式が符号を反転した同じ値を作ります。そのため、エントリーのしきい値1つとエグジットのしきい値1つで両方向をまかなえ、2組目の定数は不要です。
  • さらに2つのローソク足シリーズが、実際に売買される2銘柄に対して動きます。そして2つの変数がスプレッドの数値を売買側の銘柄に同期させます。それぞれがスプレッドの出した最新の値を保持し、売買側のローソク足が確定した時点で送り出すため、すべての判断は注文を出す銘柄の時計に従います。
  • 銘柄ごとに1つ、計2つのポジションのキューブが建玉の状態を報告します。それらの値も同じ売買側のバーで同期され、ゼロと比較されます。これによりダイアグラムは単純な4つの答えを得ます。各レッグはノーポジションか、建玉ありか、です。
  • エントリーしきい値との比較が、スプレッドが平均より大きく下にあるか、大きく上にあるかを示し、論理条件がそれと両レッグがノーポジションであることとを組み合わせます。そのときだけ4つのポジションのキューブが同時に発火し、一方の銘柄を買い、もう一方を同じ数量で売ります。
  • エグジットしきい値との2つの比較が論理条件で結ばれ、値が絶対値で小さいこと、つまりスプレッドが平均の近くに戻ったことを示します。各レッグは独自の解放ゲートを持つため、すでにノーポジションのレッグに手仕舞いが求められることはなく、まだ建玉が残るレッグは必ず手仕舞われます。
  • エントリーの瞬間に変数がその原因となったZスコアを取り込み、文字列フォーマッタがそれを一文に書き起こし、通知のキューブがその一文を戦略ログに出力します。チャートパネルには、売買する2銘柄、合成スプレッドのシリーズ、平均、標準偏差、そしてすべての注文と約定が描かれます。

エントリーとエグジットの条件

  • ロングエントリー: 符号を反転したZスコアがエントリーしきい値を上回り、すなわちスプレッドが自身の平均よりその本数分を超える標準偏差だけ下にあり、かつ両レッグがノーポジションの場合。ダイアグラムは売買側の銘柄を買い、ヘッジ側の銘柄を売ります。いずれも成行で、数量はどちらも注文数量です。
  • ショートエントリー: Zスコアがエントリーしきい値を上回り、すなわちスプレッドが自身の平均よりその本数分を超える標準偏差だけ上にあり、かつ両レッグがノーポジションの場合。ダイアグラムは売買側の銘柄を売り、ヘッジ側の銘柄を買います。いずれも成行で、数量はどちらも注文数量です。
  • エグジット: Zスコアの絶対値がエグジットしきい値を下回ったとき、つまりスプレッドが平均を挟む狭い帯の中へ戻ったときに、両レッグが手仕舞われます。2つのクローズ用キューブは自身の売買方向を持たず、ポジションを閉じる設定になっています。それぞれがどちら向きにどれだけ売買するかを自分で判断するため、同じ2つのキューブでロングのスプレッドもショートのスプレッドも解消できます。加えて、売買側のレッグには約定価格を基準としたパーセント指定のストップロスが付きます。このストップが守るのは片方のレッグだけです。ペアで建てたポジションは1つの保護注文では閉じられないため、ヘッジ側のレッグは独自の解放ゲートを保ち、スプレッドが戻ったときに手仕舞われます。

パラメーター

パラメーター 既定値 説明
Index Expression BTCUSDT@BNBFT/TONUSDT@BNBFT 合成銘柄を組み立てる式です。売買側の銘柄の価格を、ヘッジ側の銘柄の価格で割ります。両方の銘柄が接続されたデータ内に存在している必要があり、どちらも実際に売買されます。
Spread Candles 00:05:00 スプレッドのシリーズを作るローソク足の長さであり、したがって平均と標準偏差を測るバーの長さでもあります。
Traded Leg Candles 00:05:00 売買側のレッグを追うローソク足の長さです。これがダイアグラム全体を動かす時計になるため、スプレッドのシリーズと同じ値にしてください。そうしないと、同期された数値が、それを読むバーよりも古いものになります。
Hedge Leg Candles 00:05:00 ヘッジ側のレッグを追うローソク足の長さです。このシリーズは、ヘッジ側の銘柄の価格が実行に届き、チャートに表示されるために存在します。他の2つと同じ値にしてください。
Average Length 20 Zスコアの基準となる移動平均に含まれる、スプレッドのローソク足の本数です。
Deviation Length 20 Zスコアを割る標準偏差に含まれる、スプレッドのローソク足の本数です。速い水準と遅い幅を意図的に組み合わせたい場合を除き、平均の長さと同じにしてください。
Entry Z-Score 1.5 ペアを建てるまでに、スプレッドが平均から何標準偏差だけ離れている必要があるかです。大きくするほどエントリーは稀になり、その分だけ乖離が大きいところで建てることになります。
Exit Z-Score 0.5 両レッグを手仕舞うまでに、スプレッドが平均へどこまで戻る必要があるかです。絶対値で指定し両側をカバーするため、同じ数値でロングのスプレッドもショートのスプレッドも閉じられます。
Order Volume 1 各レッグの数量で、単位はロットです。両レッグとも同じ数量で発注されます。
Stop Loss, % 1.5 売買側のレッグのストップロスで、約定した価格に対するパーセントで指定します。守るのは片方のレッグだけで、ヘッジ側のレッグには独自のストップはありません。

ダイアグラムの詳細

  • 合成銘柄は差ではなく比率です。価格水準が大きく異なる2銘柄の差は水準の大きい方に支配されてしまい、Zスコアは2銘柄の関係ではなく、その1銘柄そのものを測ることになります。
  • 2つのシリーズは同じ瞬間に確定しません。合成銘柄は2つのフィードから組み立てられるため、そのローソク足は通常の銘柄より少し遅れて確定します。売買側のローソク足で数値を同期させることで、ダイアグラム全体が1つの時計で動きます。代わりに両方のシリーズを同時に送り出すと、すべての注文が早い方の時刻を持つことになり、現在時刻より前の時刻を持つ注文は拒否されます。
  • 定数は売買側のローソク足によって発火します。比較は評価のたびに両方の入力値が改めて届く必要があるため、再送されない定数は、それが供給する条件を黙って止めてしまいます。
  • Zスコアを作る割り算には非常に小さい正の数の下限が設けられており、価格がまったく動かない区間でも、標準偏差ゼロによる除算で実行が止まることはありません。
  • 各レッグは自分専用のポジションのキューブで監視され、別々にゲートされます。そのため、ストップで売買側のレッグが先に外れても、ヘッジ側のレッグは自分の条件で手仕舞われ、次のエントリーまで建玉が残り続けることはありません。

使い方

.json ファイルを Designer に読み込み、バックテスターで過去データを使って実行し、実運用の前にパラメーターやブロック自体を自分の銘柄に合わせて調整してください。