グリッド取引ボット 正直な評価
グリッド取引ボットは固定レンジ内で下落時に買い、上昇時に売ります。仕組みが利益を生む市場形状と、損失を招く形状を解説します。
グリッド取引ボットは、固定価格間隔で注文のラダー(梯子)を配置します。現在価格より下の各段に買い注文、上の各段に売り注文を置きます。市場が一段下がるたびにボットは買い、一段戻るたびに安く買った分を売ります。この仕組みは値動きの振動を収穫し、市場がラダーから一方向に離れて進み続けると、未決済ポジションが蓄積されます。
このページでは、その仕組みを分解し、結果を左右する2つの市場形状を測定します。以下の各パネルは、実際の米国株価に対する保存済みクエリであり、日付を固定して再現可能な数値にしています。
グリッド取引ボットの仕組み
グリッドを定義する設定は3つです。レンジの上限と下限、その内部のライン数、各ラインの注文サイズです。ライン間の間隔は、最初の2つから決まります。
実際の気配値ではなく、わかりやすさのために選んだ概数を使った計算例を示します。ある株式が100ドル近辺で取引されており、運用者が95ドルから105ドルまでのグリッドを、1ドル間隔の11本のライン、各ライン100株で設定したとします。価格が99ドルに下がり、待機中の買い注文が約定します。価格が100ドルに戻り、対応する売り注文が約定し、このペアはクローズして総額100ドルの利益となります。両方の注文は再セットされます。その1時間の間に、会社の状況は何も変わっていません。ポジションが隣接する2つの段の間で往復しただけです。
公開されているオープンソースプロジェクトには、2つのバリエーションがあります。算術グリッドは、ラインを固定金額で等間隔に配置します。幾何グリッドは、固定パーセンテージで等間隔に配置し、広いレンジにわたって往復あたりの利益率を一定に保ちます。また、ドキュメントでは、フラットな状態からスタートして双方向に機能するニュートラルグリッドと、最初から在庫を保有して値上がり時に売るロンググリッドを区別しています。
ペイオフの形状は、一文で簡潔に述べられます。完了した往復取引の利益は、グリッドの1ステップ分からコストを引いた額が上限です。価格がレンジを外れたときに蓄積される未決済ポジションには、対応する上限はありません。
グリッドに必要な市場形状
グリッドは、方向ではなく移動距離によって報酬を得ます。2つの銘柄は、大きく異なる距離を移動した後、同じ価格で期間を終えることがあります。毎日の値動きの絶対値を合計すると、移動した総距離になります。正味の値動きをその距離で割ると、効率比が得られます。これは、経路がどれだけ方向性を持っていたかを示す標準的な指標です。低い比率は、迷走した経路を示します。高い比率は、一直線の行進を示します。
各数値の背後にある正確なSQL
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY','KO','PG','JNJ','VZ','MO','XOM','JPM','WMT','NVDA','TSLA','NFLX')
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, dt
),
steps AS (
SELECT ticker, dt, c,
c / lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt) - 1 AS ret
FROM daily
)
SELECT ticker,
round(sum(abs(ret)) * 100, 0) AS travel_pct,
round(abs(argMax(c, dt) / argMin(c, dt) - 1) * 100, 1) AS net_move_pct,
round(100 * abs(argMax(c, dt) / argMin(c, dt) - 1) / sum(abs(ret)), 1) AS efficiency_pct
FROM steps
WHERE ret > -0.5 AND ret < 0.5
GROUP BY ticker
ORDER BY efficiency_pct最初と最後の行を一緒に読んでください。PG は、累積日次変動の 527% をカバーし、スタート地点から 0.9% の位置で終了しました。効率は 0.2% です。SPY は、14.3% で反対側の端に位置し、415% の移動を 59.2% の正味変動に変えました。最初の経路に置かれたグリッドラダーは、何度も自分の段に遭遇します。同じラダーを2番目の経路に置くと、取り残されます。
「穏やか」と「レンジ相場」は、関連しているが異なる性質です。株式は、非常に小さな日次変動で上昇トレンドに乗ることがあり、それでもグリッドは置き去りにされます。これは、低ボラティリティ・アノマリーの文献で研究されている銘柄が、自動的にグリッドの材料にならない理由の一つです。
往復取引の回数を数える
効率は一つのレンズです。グリッドの収入は、より具体的なものに依存します。それは、価格が実際に特定の水準を何度再訪するかです。各暦年の最初の終値に固定し、その固定点の反対側でセッションが終了した回数を数えると、単一のグリッドラインが捉えたであろうクロス回数が得られます。ここでは、コカ・コーラ(KO)を対象とします。これは、グリッドのドキュメントでよく取り上げられる、大型で流動性の高い消費者向け銘柄です。
各数値の背後にある正確なSQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2019-01-01') AND toDate('2025-12-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY dt
),
anchored AS (
SELECT toYear(dt) AS year, dt, c,
first_value(c) OVER (PARTITION BY toYear(dt) ORDER BY dt) AS anchor
FROM daily
),
sided AS (
SELECT year, dt, c, anchor,
if(c >= anchor, 1, 0) AS side,
row_number() OVER (PARTITION BY year ORDER BY dt) AS rn,
lagInFrame(if(c >= anchor, 1, 0)) OVER (PARTITION BY year ORDER BY dt) AS prev_side
FROM anchored
)
SELECT year,
countIf(rn > 1 AND side != prev_side) AS crossing_count,
count() AS sessions,
round((argMax(c, dt) / any(anchor) - 1) * 100, 1) AS net_change_pct
FROM sided
GROUP BY year
ORDER BY year2019 年、終値は自己の年初来高値を 8 回、252 セッションにわたってクロスし、その水準から 17.9% の位置で年を終えました。2025 年、その回数は 6 回で、250 セッション、正味変動は 13% でした。一つのライン、一つの銘柄で、グリッドの原材料は年によって数倍も変動し、来年の回数を事前に知る方法はありません。
この変動性が、静かな問題です。グリッドの宣伝されるリターンは、通常、完了した往復取引あたりで見積もられます。そして、往復取引の回数は、設定ではなく市場によって決まります。
グリッドが破綻する時
失敗のモードには、特定の形状があります。グリッドをあるレンジに固定し、市場がそこから離れるままにします。以下では、天井と床は、2024年の最初の20セッションの最高終値と最低終値であり、その後30ヶ月間フラットに維持され、S&P 500トラッカーの月次終値がそれらに対してプロットされています。
各数値の背後にある正確なSQL
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2024-01-02') AND toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY dt
),
opening_20 AS (
SELECT c FROM daily ORDER BY dt LIMIT 20
),
band AS (
SELECT min(c) AS grid_low, max(c) AS grid_high FROM opening_20
),
monthly AS (
SELECT toStartOfMonth(dt) AS month_start, argMax(c, dt) AS close_px
FROM daily
GROUP BY month_start
)
SELECT formatDateTime(monthly.month_start, '%Y-%m') AS month,
round(monthly.close_px, 2) AS spy_close,
round(band.grid_high, 2) AS grid_top,
round(band.grid_low, 2) AS grid_bottom
FROM monthly, band
ORDER BY monthly.month_startバンドは $467.27 から $491.26 までです。この系列の最初の月は $482.92 で終了し、バンド内でした。30 ヶ月の最後の月は $746.32 で終了し、天井をはるかに上回り、チャートはラインがバンドを離れて二度と戻ってこないことを示しています。
その経路に沿ってラダーが何をするかを追ってみましょう。レンジ内を上昇する間、ボットは在庫を段ごとに売却し、毎回1ステップの利益を確保します。天井より上では、現金を保有して見守ります。それ以降の上昇はすべて、運用者がもはや参加しない利益であり、これは軽度の失敗です。
深刻なバージョンは、その鏡像です。価格が床を下回ると、ボットは下落の過程で全ての段で買い付けているため、現在の市場価格を上回る平均コストでラダー全体の在庫を保有することになり、さらに一段下がるごとに含み損が拡大します。かつては安定した小さな成功取引を生み出していたレンジが、一つの集中ポジションに変わります。グリッドのマーケティングでは、これをボットが「スタック」したと表現します。証券会社の明細書上では、組み込みの出口がないオープンなドローダウンです。
コストは取引回数に比例する
グリッドは多くの小さな取引を完了し、それぞれが往復取引の全コストを支払います。すなわち、スプレッド、および該当する場合は手数料や取引所手数料です。ビッド・アスク・スプレッドは、明細書に項目として表示されることがないため、グリッドの計算から最も頻繁に除外される部分です。
簡単な計算例を示します。100ドルの株式でスプレッドが1セントの場合、両側でスプレッドを通過する往復取引は、約2セント、つまり想定元本の0.02%を放棄します。1ドルのグリッドステップに対して、これは1回の取引あたりの総利益の約2%です。スプレッドが5セントに広がると、これは流動性の低い銘柄では日常的な数字ですが、同じ取引は総利益1ドルに対して10セント、つまり10%を放棄します。より多くの振動を捉えるためにグリッドを10セントステップに狭めると、1回の取引あたりの総利益は10セントに減少し、コストは変わらないため、5セントのスプレッドが取引全体を消費することになります。
この関係は、有用なグリッド間隔に下限を設定します。ステップは往復取引コストに対して十分に大きくなければならず、グリッドが狭ければ狭いほど、その収入の多くは運用者ではなく取引所のものとなります。
バックテストがグリッドボットを過大評価する理由
グリッド戦略は、異常に魅力的なバックテストを生み出します。これには主に4つの構造的な理由があります。
- 後知恵によるレンジ選択。 データを見た後に選択された境界は、そのデータを含むことになります。レンジ相場だった期間に適合されたグリッドは、その期間に高いヒット率を示します。
- 未クローズのラダー。 選択した終了日で停止するテストは、多くの場合、実現した往復取引をカウントする一方で、残った在庫を甘く評価します。正直な会計処理では、最終日の未決済ポジションを時価評価し、その損失を結果に含めます。
- 約定の仮定。 シミュレーションでは、待機中の注文は価格が触れた時点で約定します。実際のキューは、タッチしただけでは常に約定するとは限らず、約定しなかった取引は、速い市場では不釣り合いに利益が出る取引であることが多いです。
- パラメータの密度。 境界、ライン数、間隔、注文サイズは、一つの価格系列に対する4つのダイヤルであり、これはほとんどの過去の期間に適合させるのに十分です。
上記のクロス回数は、これら4つすべてに対するカウンターウェイトです。これらは、設定を一切伴わずに価格履歴のみから得られ、パラメータの選択では制御できない方法で年ごとに変動します。グリッドの主張を評価する誰もが、それに対して一つの質問をすることができます。これはいくつの完了した往復取引に依存しており、その回数はどこから来たのか?シミュレーターでの練習期間を、最後にオープンラダーを時価評価して終えることは、実現した取引のチャートよりも正直にその質問に答えます。
FAQ
グリッド取引ボットは実際に利益を上げますか?
グリッドは、完了した往復取引ごとに上限のある利益を得て、価格がレンジを外れた場合には上限のない未決済ポジションを抱えます。実現した取引が、任意の期間にわたって未決済ポジションを上回るかどうかは、市場がそのレンジ内でどれだけ振動したかに依存し、それはソフトウェアではなく市場の性質です。
どのような市場環境がグリッドボットに適していますか?
この仕組みは、同じ水準を繰り返し再訪する価格、すなわち正味の変動に対して移動した総距離が大きい価格向けに作られています。上記の12銘柄のパネルでは、効率比は迷走する端で 0.2% から方向性のある端で 14.3% まであり、ラダー機構は最初の端でのみ自身の段に遭遇します。
価格がグリッドレンジをブレイクアウトしたらどうなりますか?
レンジの上では、ボットは在庫を売り切って現金を保有し、市場はそれなしで続行します。レンジの下では、ボットは下落の過程で買ったすべての段を、現在の価格を上回る平均コストで保有し、さらに下落するごとにその含み損は拡大します。
グリッド取引はドルコスト平均法とどう違いますか?
どちらも価格が下がるとより多く買いますが、類似点はそこまでです。ドルコスト平均法は、出口ルールや上限なしに、固定スケジュールで固定金額を追加します。グリッドは、事前に選択されたレンジ内の価格トリガーで売買し、価格がそのレンジを離れるとその行動は完全に変わります。
グリッドの間隔を狭めると収入は増えますか?
間隔を狭めると、往復取引の回数が増え、それぞれの総利益は減りますが、往復取引のコストは同じままです。スプレッドによって設定された点を超えると、追加された取引は合計に加算するのではなく、むしろ減算します。
上記のすべての数値は、実際の株価に対する保存済みのバージョン管理されたクエリからのものです。任意のパネルの下にあるSQLを開いて確認するか、Strasmoreターミナルで独自の銘柄リストに対して移動量と正味変動を測定してください。