ロング・ショート適応型動的グリッド戦略
概要
これはPine Scriptで記述された、ロング・ショート適応型ダイナミックグリッド取引戦略です。本戦略の核となる考え方は、直近の価格の高値と安値、または単純移動平均線に基づいてグリッドの上下限を自動計算し、その範囲を均等に複数のグリッドラインに分割することです。価格がいずれかのグリッドラインにタッチすると、その位置でロングポジションを建てるか、決済します。この方法により、レンジ相場で継続的にポジションを建てたり決済したりして、スプレッド収益を得ることができます。また、グリッドの境界を動的に調整することで、さまざまな市場トレンドにも適応できます。
戦略の原理
-
グリッドの上下限を計算します。ユーザーの選択に応じて、上下限は直近N本のローソク足の最高値と最安値に基づき、拡大または縮小のパーセンテージを設定できます。また、直近N本のローソク足の終値の単純移動平均線に基づき、上下乖離率を設定することもできます。
-
グリッドラインの配列を生成します。設定したグリッドライン数に従って、グリッド範囲を均等に分割し、対応する価格のグリッドライン配列を生成します。
-
エントリー/追加ポジション。下から上に向かってグリッドラインを走査し、現在の終値がグリッドラインの価格より低く、かつそのグリッドラインにまだポジションがない場合、その位置でロング注文を出します。これにより、価格がより高いグリッドラインに達すると継続的にポジションが追加されます。
-
エグジット/ポジション削減。上から下に向かってグリッドラインを走査し、現在の終値がグリッドラインの価格より高く、かつ一つ下のグリッドラインにポジションがある場合、その下のグリッドラインのロングポジションを決済します。これにより、価格が下落すると継続的にポジションが減らされます。
-
動的調整。動的グリッド機能を選択した場合、毎足のローソク足でグリッドの上下限とグリッドライン配列が再計算され、グリッドが相場の変化に応じて常に自己適応できるようになります。
優位性の分析
-
適応性が高い。グリッド取引戦略はレンジ相場とトレンド相場の両方に適応できます。レンジ相場ではグリッド戦略は継続的にポジションを建てたり決済したりしてスプレッドを稼ぎます。トレンド相場ではグリッドが価格の動きに追随するため、ある程度のポジションを維持し、トレンド収益を得ることができます。
-
リスクが管理可能。1回のポジション建てのサイズは設定したグリッド数によって決まるため、1回あたりのリスクエクスポージャーは小さく、管理可能です。また、価格が上方のグリッドラインに達すると利益確定の決済が行われるため、潜在的な損失もある程度ヘッジされます。
-
自動化の度合いが高い。本戦略は基本的に全自動で稼働でき、人手による介入が不要で、長期的に安定したリターンを求める投資家に適しています。
-
パラメータが柔軟。ユーザーは市場の特性に応じて、グリッドラインの数、動的グリッドパラメータなどを柔軟に設定し、戦略のパフォーマンスを最適化できます。
リスク分析
-
ブラックスワンリスク。極端な相場暴落が発生し、価格が最下位のグリッドラインを飛び越えて直接下回った場合、本戦略はフルポジションとなり大きなドローダウンに直面します。このリスクを軽減するために、損失がしきい値に達した場合に全ポジションを決済するストップロス条件を設定できます。
-
グリッドパラメータの設定ミス。グリッド密度が大きすぎると、1回のエントリー・エグジットごとのスプレッドが非常に小さくなり、手数料が収益の大部分を損なう可能性があります。グリッド幅が大きすぎると、一度のポジション建ての割合が高くなり、リスクエクスポージャーが大きくなります。対象資産の特性を慎重に評価し、適切なグリッドパラメータを選択する必要があります。
-
ベーシスリスク。本戦略は現在価格に基づいてエントリー・エグジット条件を設定していますが、先物などの市場で契約価格と原資産価格の乖離が大きい場合、実際のエントリー・エグジット価格が想定から大きくずれる可能性があります。
最適化の方向性
-
トレンドフィルターの追加。グリッド戦略は一方向のトレンド相場ではパフォーマンスが悪いため、トレンド指標をフィルターとして追加できます。例えば、ADXが一定のしきい値を下回っている場合のみグリッドを有効にし、トレンドが明確な場合はグリッドをオフにして一方向のポジションのみを保有します。
-
シグナルの最適化。グリッドに他のシグナルを重ねることができます。例えば、グリッド+移動平均線は、基本的にグリッドがエントリー・エグジットを決定しますが、価格がある移動平均線をクロスしたときのみポジションを建てるようにします。これにより、頻繁なエントリー・エグジットに伴うコストを削減できます。
-
ポジション管理。現在の戦略では各グリッドのポジションサイズは固定です。価格が市場平均価格から遠い場合には各グリッドのポジションサイズを適度に小さくし、市場平均価格に近い場合にはポジションサイズを大きくすることで、資金効率を向上させることができます。
-
適応型グリッド密度。価格のボラティリティに応じてグリッド密度を動的に調整します。ボラティリティが高い場合にはグリッド数を増やし、低い場合にはグリッド数を減らすことができます。これによりグリッド幅を最適化し、資金利用率を高めることができます。
まとめ
本戦略は適応型ダイナミックグリッドにより、レンジ相場で頻繁にエントリー・エグジットを繰り返してスプレッド収益を稼ぐと同時に、トレンド相場では一定のエクスポージャーを維持してトレンド収益を得ることができ、適応性の高い中長期の定量戦略です。グリッドのトリガーロジックとポジション管理を適切に設定することで、安定したリターンを得ることができます。ただし、極端な相場や価格ギャップのリスクに注意が必要であり、適切なストップロス条件を設定してリスクをコントロールする必要があります。また、パラメータ設定やリスク管理にはさらに最適化の余地があり、トレンドフィルター、シグナルの重ね合わせ、ポジション管理、適応型グリッド密度などの手段を導入することで、戦略の安定性と収益性を高めることができます。以上を総合すると、本戦略はグリッドの基本ロジックに動的適応メカニズムを加えたものであり、中長期の定量投資家に新たな考え方と参考を提供することができます。
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jcloyd
//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool) // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"]) // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1) // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float) // for manual grid bounds only. The upperbound price of your grid
i_lowerBound = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float) // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty = input(group="Grid Lines", title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer) // how many grid lines are in your grid- 1

