スーパートレンドとボリンジャーバンドを組み合わせる考え方 — フリップの質をバンド幅で選別する設計

スーパートレンド(Supertrend)は、ATR(平均真の値幅)をもとに価格の上下へ1本の方向ラインを引き、終値がそのラインを越えたときに方向を切り替える(フリップする)インジケーターです。ボリンジャーバンドは、移動平均を中心に標準偏差(値動きのばらつき)の一定倍で上下のバンドを描き、相場の変動幅が広がっているか縮んでいるかを示します。

この2つを組み合わせると、「方向の切り替わりはスーパートレンドで検出し、その切り替わりが変動幅の拡大を伴っているかをボリンジャーバンドで確かめる」という役割分担が組めます。スーパートレンドの弱点としてよく挙がるのが、レンジ相場でフリップが繰り返される現象です。本記事では、その「フリップの質」をバンド幅という別の物差しで選別する設計を整理します。スーパートレンドをcBotに組み込んだもののレンジで振られやすいと感じている方や、ボラティリティの状態を判定条件に入れたい開発者の方を想定しています。設計の考え方の整理として読んでください。

スーパートレンドのフリップとボリンジャーバンド幅の収縮・拡大の関係を示す模式図

スーパートレンドの役割

まず、方向判定を担うスーパートレンドがどんな情報を返すのかを確認します。

スーパートレンドは、足の中値からATRの一定倍だけ離れた位置にラインを引きます。上方向の局面ではラインが価格の下にあり、切り上がることはあっても切り下がることはありません。終値がラインを下抜けると方向が反転し、価格の上側に下方向のラインが現れます。ATRの考え方はATRとはで解説しています。

単独で使うときの観察軸は、ラインの位置(方向の材料)、フリップ(方向転換の候補)、価格とラインの距離(損切候補までの目安)の3つです。

限界は、フリップそのものに「強さ」の情報がないことです。値幅の小さなもみ合いの中で起きたフリップも、大きく動き出した場面のフリップも、同じ1回のフリップとして扱われます。レンジ相場ではラインが価格のすぐそばに来るため、わずかな上下でフリップが繰り返され、そのたびに逆方向へ振られやすくなります。ATRに連動してラインの距離は変わりますが、「いまの変動幅が過去と比べて大きいのか小さいのか」という相対的な位置づけは、スーパートレンド単体からは読み取れません。

ボリンジャーバンドの役割

次に、フリップを選別する物差しとなるボリンジャーバンドの性格を整理します。

ボリンジャーバンドは、中心線(多くは単純移動平均)と、その上下に標準偏差の一定倍だけ離した2本のバンドで構成されます。基本はボリンジャーバンドとはにまとめています。

本記事の組み合わせで注目するのは、バンドに価格が触れたかどうかではなく、バンド幅(上バンドと下バンドの距離を中心線で割った値)の推移です。バンド幅が過去と比べて狭い状態は「収縮(スクイーズ)」と呼ばれ、値動きが小さくまとまっている段階とみなされます。その後バンド幅が広がり始める「拡大」は、変動幅が増え始めた段階の材料になります。

ただしボリンジャーバンド単独では、拡大がどちらの方向に向かうのかは分かりません。上下どちらにも広がるため、方向の判定は別の道具に預ける必要があります。また、収縮が長く続いたからといって、拡大がいつ始まるかを予測できるわけでもありません。バンド幅は「いまの状態」を示す指標であり、タイミングの予告ではない点に注意が必要です。

なぜこの組み合わせか

2つの指標が欠けている情報をどう補い合うのかを、理屈の面から整理します。

スーパートレンドは「方向の切り替わり」を持っていますが、「その切り替わりがどんな変動環境で起きたか」を持っていません。ボリンジャーバンドのバンド幅は「変動環境の相対的な状態」を持っていますが、「方向」を持っていません。互いの欠けた部分を持ち寄る関係なので、一方の弱点を他方が補完する組み合わせと考えられます。

判定の組み立て例は次のとおりです。

ここでの考え方の核は、フリップを「起きたかどうか」ではなく「どんな状態で起きたか」で分類することです。同じスーパートレンドでも、収縮中のフリップと拡大初動のフリップを別のシグナルとして扱えば、ノイズフィルターとして機能することが期待できます。だましの考え方はブレイクアウトとダマシの基礎も参考にしてください。

一方で限界もあります。バンド幅の条件を厳しくするほどシグナルは減り、方向転換の一部を見送ることになります。また、拡大の初動を待つ分、フリップのみで判定するより参加がさらに遅れる場面もあります。収縮の検出にケルトナーチャネルを使う設計はボリンジャーバンドとケルトナーチャネルの組み合わせで扱っているので、比較材料にしてください。

パラメータをどう考えるか

パラメータには唯一の正解がないため、方向性のみを整理します。

スーパートレンドは、ATR期間と倍率の2つが主なパラメータです。倍率を小さくするとフリップが増え、バンド幅フィルターで弾かれる件数も増えます。倍率を大きくするとフリップ自体が減るため、フィルターの役割は相対的に小さくなります。どちらで「選別」を担うかは設計者の判断になります。

ボリンジャーバンドは、期間20・標準偏差2倍の設定が広く知られています。この組み合わせでは、バンドの期間に加えて「バンド幅を何本分の履歴と比べるか」という比較期間が重要です。比較期間が短いと直近の状態に敏感になり、長いと大きな相場環境の中での位置づけになります。収縮・拡大のしきい値も、固定値ではなく、過去のバンド幅の中での順位(パーセンタイル)で決める方法が、銘柄間の差を吸収しやすいと考えられます。

時間足については、短期足ではフリップとバンド幅の変化がともに頻繁になり、長期足では判定の機会が減ります。どの設定でも、自分の運用銘柄と時間足でバックテストを行い、フィルターで弾かれたフリップと採用したフリップのその後の値動きを比較してから採用する手順は省かないことが重要です。

cBot化する際の考慮点

ここからは、cTraderのcBotに組み込む際の設計上のポイントを整理します。

確定足で判定する: スーパートレンドのフリップとバンド幅は、どちらも未確定足では値が揺れます。判定はOnBarで行い、確定済みの1本前(Last(1))を使う設計が安定します。

フリップの検出: cTraderの組み込みIndicators.Supertrend(periods, multiplier)はUpTrendとDownTrendの2系列を返し、該当しない側はNaNになります。1本前と2本前で有効な側が入れ替わったかどうかでフリップを検出します。起動直後は両方NaNの区間があるため、その間は判定しない分岐を入れます。

バンド幅の正規化: Indicators.BollingerBands(source, periods, stdDev, maType)のTop・Bottom・Mainからバンド幅を計算し、比較期間の中で何番目の位置にあるかを求めます。比較期間分の履歴が揃うまでは判定しない設計にしておきます。

状態の保持: 「収縮していた」と「拡大に転じた」は別の足で起きるため、直近の一定本数内に収縮状態があったかを記録しておく必要があります。収縮からの経過本数を持ち、一定本数を過ぎたら無効化する、という状態遷移で管理します。

ポジション管理との連携: 保有中はスーパートレンドのラインをトレーリングストップの候補として使えます。考え方はトレーリングストップとはを参照してください。

// 例: フリップ検出とバンド幅の位置づけ
var st = Indicators.Supertrend(10, 3.0);
var bb = Indicators.BollingerBands(Bars.ClosePrices, 20, 2.0, MovingAverageType.Simple);

bool upNow  = !double.IsNaN(st.UpTrend.Last(1));
bool upPrev = !double.IsNaN(st.UpTrend.Last(2));
bool dnPrev = !double.IsNaN(st.DownTrend.Last(2));
bool flipToUp = upNow && !upPrev && dnPrev;          // 下→上のフリップ

double Width(int i) => (bb.Top.Last(i) - bb.Bottom.Last(i)) / bb.Main.Last(i);
int lookback = 120, rank = 0;
for (int i = 2; i <= lookback + 1; i++)
    if (Width(i) < Width(1)) rank++;
double widthPct = (double)rank / lookback;            // 0に近いほど収縮
// flipToUp・widthPct・収縮からの経過本数を合わせて判断材料とする

計算負荷の面では、比較期間のループを毎足回しても通常は問題になりにくい規模ですが、複数銘柄を同時に監視する場合はバンド幅の履歴を配列で保持し、1本ずつ更新する形にすると無駄が減ります。

実装の流れ

全体の処理を、入力から出力までの流れで整理します。

  1. 入力: 対象銘柄と時間足の確定足をOnBarで受け取る
  2. 計算: スーパートレンドの方向とライン値、ボリンジャーバンドの3本、バンド幅とその順位を取得する
  3. 状態更新: バンド幅が収縮域にあれば収縮フラグと経過本数を更新し、一定本数を過ぎたら無効化する
  4. 判定: フリップの発生、収縮からの拡大転換、中心線との方向整合の3条件を照合する
  5. 出力: 採用候補の場合は、スーパートレンドのラインを損切候補としてロットを逆算し、発注またはログ出力へ渡す。見送ったフリップも理由付きでログに残す

見送ったフリップをログに残すのは、フィルターの妥当性をあとから検証するためです。弾いたフリップのその後を見ないと、フィルターが機能しているのか、単に機会を減らしているだけなのかを区別できません。

スーパートレンドとボリンジャーバンド幅によるフリップ選別の実装フロー

どう活用するか

最後に、立場別の使い方をまとめます。

自作派の方は、本記事の「方向転換の検出・変動環境の分類・リスク設定」の三層を設計書として、Claude Code を使ったcBot開発の下敷きにしてみてください。バンド幅の順位計算と収縮フラグの状態遷移は、足ごとの値をログに出して確かめながら進めるのがおすすめです。委託派の方は、ai-programming.xyzへの相談時に「スーパートレンドのフリップを、ボリンジャーバンド幅の収縮→拡大で選別したい」と伝えていただくと、要件のすり合わせが進めやすくなります。教育派の方は、スクールでの状態管理とパーセンタイル計算の練習題材として活用できます。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。