戦略・検証

グリッドボットのレンジ設定はどう決める?ATRから考える3つの視点


※本記事にはアフィリエイト広告(プロモーション)が含まれています。

グリッドトレードを始めようとすると、必ず最初にぶつかるのが「レンジ(上限価格・下限価格)をどこに設定すればいいのか」という問題です。狭すぎればすぐにレンジを抜けてしまい、広すぎれば資金効率が悪くなる——このトレードオフに、唯一の正解はありません。この記事では、レンジ設定を考えるための一般的な視点をいくつか整理します。グリッドトレード自体の仕組みや実運用の感触についてはグリッドトレードは本当に稼げる?で詳しく扱っているので、未読の方はあわせてどうぞ。

レンジ設定が難しい理由

グリッドボットは、設定した上限と下限の間を一定間隔で区切り、価格がその間で上下する限り、下落で買い・上昇で売りを機械的に繰り返して利益を積み上げる仕組みです。つまりレンジの内側で価格が動いている間しか、本来の収益ロジックが機能しません。

  • レンジが狭い場合: グリッドの間隔を細かくできるため取引回数が増えやすい反面、相場が少し大きく動いただけでレンジの外に出てしまい、機能停止(または片側に資産が偏った状態)になりやすくなります
  • レンジが広い場合: レンジ外に出にくくなる一方、同じ資金でも1グリッドあたりの値幅が広くなるため、取引回数が減り、資金効率(同じ資金でどれだけ利益機会を拾えるか)が下がります

この「狭いほど効率的だが脆い、広いほど丈夫だが非効率」というトレードオフをどこで折り合わせるかが、レンジ設計の核心です。

視点1: 過去のボラティリティから値幅を見積もる

もっとも基本的な考え方は、対象銘柄が過去どの程度の値幅で動いてきたかを基準にレンジを決める方法です。ここでよく使われるのがATR(Average True Range)で、一定期間の平均的な値動きの大きさを数値化できます。ATRの計算ロジック自体はテクニカル指標をPythonで計算する方法でも扱っているので参照してください。

import pandas as pd

def calc_atr(df: pd.DataFrame, period: int = 14) -> pd.Series:
    high_low = df['high'] - df['low']
    high_close = (df['high'] - df['close'].shift(1)).abs()
    low_close = (df['low'] - df['close'].shift(1)).abs()
    true_range = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)
    return true_range.rolling(period).mean()

df['atr'] = calc_atr(df)

# 直近の終値を中心に、ATRの倍数でレンジの上限・下限を仮決めする
latest_close = df['close'].iloc[-1]
latest_atr = df['atr'].iloc[-1]

atr_multiplier = 10  # 何倍のATR幅をレンジに取るかはパラメータ
range_upper = latest_close + latest_atr * atr_multiplier
range_lower = latest_close - latest_atr * atr_multiplier

atr_multiplier の値に絶対的な正解はなく、広めに取るほどレンジ逸脱のリスクは下がりますが、資金効率は落ちます。一般的には、対象期間を変えて何パターンか試算し、グリッド本数・1グリッドあたりの値幅・想定取引回数がどう変化するかを比較しながら決めるアプローチがよく語られます。

視点2: 直近N期間の高値・安値レンジを使う

ATRのような「平均的な値幅」ではなく、直近の実際の高値・安値をそのままレンジの目安にする方法もあります。

lookback = 90  # 直近90本(日足なら約3ヶ月)を参照

range_upper = df['high'].rolling(lookback).max().iloc[-1]
range_lower = df['low'].rolling(lookback).min().iloc[-1]

この方法は直感的で分かりやすい反面、参照期間の取り方次第で結果が大きく変わるという弱点があります。例えば過去に急騰・急落が1回だけ起きていた場合、その極端な値がそのままレンジの端に採用され、実際にはめったに到達しない広すぎるレンジになることがあります。極端な値の影響を抑えたい場合は、最大値・最小値ではなく、パーセンタイル(例えば上位・下位5%点)を基準にする方法も考えられます。

視点3: レンジ外に抜けた後の運用設計もセットで考える

どれだけ丁寧にレンジを設計しても、相場が過去の値動きのレンジを超えて動く可能性は常にあります。レンジ設定の議論は、「レンジ内でどう効率化するか」だけでなく「レンジ外に抜けたらどうするか」とセットで考える必要があります。

  • レンジを抜けた時点でボットを停止し、通知を飛ばして人の判断を挟む
  • レンジを抜けた時点で新しいレンジを再計算し、グリッドを再構築する
  • 上下どちらか片側にポジションが偏った状態(例えば下限で全額BTCを買い切った状態)を許容するか、損切りラインを別途設けるか

いずれの設計を選ぶにせよ、「レンジ外に抜けた」という状態をボット自身が検知できる作りにしておくことが前提になります。ボットの異常検知や通知の仕組みについてはボットの日次監視ルーティン、停止判断の基準については自動売買ボットを止めるべきタイミングで整理しているので、グリッドボットを運用する場合はあわせて設計しておくことをおすすめします。

過剰最適化に注意する

「過去データに対して一番成績が良かったレンジ幅」を探しにいくと、簡単に過剰最適化(カーブフィッティング)に陥ります。レンジ幅やグリッド本数のようなパラメータは特に、過去の特定期間にだけ都合よくフィットしやすい性質があります。この点はカーブフィッティングの兆候で詳しく扱っているので、パラメータを決める前に一度目を通しておくとよいでしょう。複数の期間に分けて検証するウォークフォワード検証の考え方も、レンジ設定の妥当性を確認する上で参考になります。

また、グリッドは取引回数が多くなりやすい戦略のため、手数料の影響も無視できません。レンジを狭くして取引回数を増やす設計を検討する際は、取引コストが成績に与える影響も合わせて試算しておくと、見かけ上の収益性に惑わされずに済みます。

まとめ

  • グリッドボットのレンジ設定は「狭いほど効率的だが脆く、広いほど丈夫だが非効率」というトレードオフが核心
  • ATRを使って過去の平均的な値幅からレンジを見積もる方法、直近の高値・安値をそのまま使う方法など、いくつかの一般的なアプローチがある
  • レンジ外に抜けた場合にボットをどう振る舞わせるか(停止・再構築・損切り)も、レンジ設計とセットで決めておく必要がある
  • パラメータの過剰最適化を避けるため、複数期間での検証と手数料影響の試算を忘れない

レンジ設定に唯一絶対の正解はなく、対象銘柄・時間軸・自分がどの程度の逸脱リスクを許容できるかによって妥当な設定は変わります。仕組みを理解した上で、自分のボットの目的に合わせて検証を重ねていく姿勢が大切です。投資判断は自己責任で行ってください。