ボリンジャーバンドとドンチャンチャネルの組み合わせ — 統計の帯と高値安値の帯でブレイクを分類する

価格が帯の外へ出た、という同じ見た目の出来事にも、中身の違うものが混ざっています。本記事では、平均からのばらつきで幅を決めるボリンジャーバンドと、過去一定期間の最高値・最安値をそのまま線にするドンチャンチャネルを重ね、価格の伸びを統計的な行き過ぎと構造的な更新の2軸で分類する考え方を整理します。片方の帯だけでは「外に出た」の一言で済んでしまう局面を、2つの真偽値の組み合わせとして4つの状態に分けられるのがこの組み合わせの特徴です。想定読者は、ブレイクアウト型のcBotを自作したい方や、帯のタッチを一律に扱って判定が粗くなっていると感じている方です。扱うのは判定の枠組みであり、特定の設定値や売買方針を推奨するものではありません。

上段に価格とボリンジャーバンド・ドンチャンチャネルを重ねた模式図。左側では価格がボリンジャーバンドの外へ出ているがドンチャンチャネルの上限は更新していない局面、右側では両方の上端を同時に超える局面を対比している

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

ここでは、ボリンジャーバンドを「平均からどれだけ離れたか」を測る物差しとして扱います。

ボリンジャーバンド(Bollinger Bands)は、移動平均を中心線とし、終値の標準偏差(ばらつきの大きさを表す統計量)×倍率を上下に加減して帯を描くインジケーターです。基本的な見方はボリンジャーバンドの基礎で解説しています。

この指標の帯の端は、「直近の値動きのばらつきから見て、平均からどの程度離れたか」という相対的な距離を表します。帯の外へ出た状態は、直近の分布の中では珍しい位置にいるという統計的な情報です。帯幅は値動きに合わせて伸び縮みするため、静かな相場でも荒れた相場でも同じ尺度で行き過ぎを語れる点が持ち味です。

単独使用時の限界は、帯の端が価格の履歴上の節目と無関係に引かれることです。帯の外に出ていても、数本前の高値をまだ超えていないことは珍しくありません。逆に、帯が大きく広がった後では、過去の高値を明確に更新していても帯の内側に収まって見えることがあります。統計的に珍しいことと、相場の構造が書き換わったことは別の出来事であり、ボリンジャーバンドだけではこの2つを区別できません。

ドンチャンチャネルの役割

ドンチャンチャネルは、ボリンジャーバンドとは逆に「過去の事実」だけで帯を描きます。

ドンチャンチャネル(Donchian Channel)は、過去N本の最高値を上限、最安値を下限として結んだチャネルです。詳しい成り立ちはドンチャンチャネルの基礎を参照してください。平均や分散といった計算を挟まないため、線の位置は実際につけた高値・安値そのものです。

上限を超えることは、N本の期間で誰もつけていない価格に到達したことを意味します。これは統計的な推定ではなく、レンジの境界が書き換わったという構造的な事実です。古くからタートル流のブレイクアウト判定に使われてきたのも、この明快さによるものです。

一方で単独使用時の弱点もはっきりしています。上限の更新は、その更新が「どの程度の勢いを伴ったか」を教えてくれません。わずかに一瞬だけ超えた更新も、大きく突き抜けた更新も、同じ「更新」として扱われます。さらに、レンジの上限付近で小刻みに更新と押し戻しを繰り返す局面では、ブレイクアウトとダマシで触れたような見せかけの更新が続きやすくなります。

なぜこの組み合わせか

2つの帯は、どちらも価格の外縁を描いていながら、何を根拠に外縁と呼ぶかが異なります。この違いを判定に使うのが組み合わせの中心です。

ボリンジャーバンドの外に出たかを「統計的な行き過ぎ」、ドンチャンチャネルの上限を超えたかを「構造的な更新」として、それぞれ真偽値で持つと、上方向だけでも次の4状態に分かれます。

状態ボリンジャー外ドンチャン更新読み方の一例
A○○勢いを伴った構造の更新
B○×平均から離れたが節目は未更新
C×○帯が広がった中での静かな更新
D××通常の値動きの範囲内

状態Aは、2つの異なる根拠が同じ方向を指している局面で、ブレイクの判定材料として最も情報量が多い状態と考えられます。状態Bは、急な動きで平均から離れたものの過去の高値には届いていない局面で、節目の手前で失速するケースを含みます。状態Cは、すでにボラティリティが高い状態で高値を更新しているため、統計的には目立たない更新です。

設計上の利点は、片方の帯だけを使う場合に生じる誤分類を、もう片方が補正できる点にあります。ドンチャンチャネルの更新だけを条件にすると状態AとCを区別できず、ボリンジャーバンドの外側だけを条件にすると状態AとBを区別できません。一般論として、統計的な距離と履歴上の節目が互いの盲点を補完する関係にあると考えられます。

ただし、どの状態をどう扱うかは別問題です。状態Aが常に有利という保証はなく、状態Bを逆張りの材料に、状態Cを順張りの材料にする考え方も成立し得ます。この組み合わせが提供するのはあくまで分類の軸であり、分類ごとの扱いはバックテストで確かめるべき仮説として持っておくのが妥当です。ダマシ回避の二重確認で扱った「主判定と補助判定を分ける」発想とも相性のよい構造です。

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

調整対象は、ボリンジャーバンドの期間と倍率、ドンチャンチャネルの期間の3つです。

出発点としては、ボリンジャーバンドを期間20・倍率2.0、ドンチャンチャネルを期間20とする組み合わせが比較しやすい起点です。ただしこれは正解ではありません。短期向けには期間を詰め、長期向けには広げるといった方向性に留め、狙う時間足で4状態それぞれの出現頻度と、その後の値動きの分布をバックテストで確かめてから採用する流れが前提になります。

cBot化する際の考慮点

実装で最も注意が必要なのは、ドンチャンチャネルの参照位置です。

// OnBar内: 確定足(Last(1))を、1本前までのドンチャン上限(Last(2))と比較する
var bb = Indicators.BollingerBands(Bars.ClosePrices, bbPeriod, bbDeviations, MovingAverageType.Simple);
var dc = Indicators.DonchianChannel(dcPeriod);

double close = Bars.ClosePrices.Last(1);
bool beyondBand  = close > bb.Top.Last(1);   // 統計的な行き過ぎ
bool newStructure = close > dc.Top.Last(2);  // 構造的な更新(自己参照を避ける)

// 2つの真偽値から4状態を決める
string state = beyondBand && newStructure ? "A"
             : beyondBand                 ? "B"
             : newStructure               ? "C"
             :                              "D";

インジケーターの生成はOnStartで1回だけ行い、OnBarでは値の参照に留めると計算負荷を抑えられます。

実装の流れ

処理は「帯の取得 → 2軸の判定 → 状態分類 → 状態別の扱い → 記録」という一方向の流れに整理できます。

  1. 帯の取得: 確定足でボリンジャーバンドの上下端と、1本前までのドンチャンチャネルの上下限を取得する
  2. 2軸の判定: 統計的な行き過ぎと構造的な更新を、それぞれ真偽値で求める
  3. 状態分類: 2つの真偽値からA〜Dのいずれかを決める
  4. 状態別の扱い: 状態ごとに候補・様子見・見送りのどれに回すかを、設定で切り替えられる形にしておく
  5. 記録: 判定時の帯の値、分類結果、その後の値動きをログに残す

帯の取得から2軸の判定・状態分類・状態別の扱いを経て記録に至る戦略フロー図。状態ごとに候補・様子見・見送りへ振り分け、すべての分類をログに残す構成を示している

状態別の扱いを設定値として外に出しておくと、分類ロジックには手を触れずに「状態Bだけ見送る」「状態Cも候補に含める」といった比較ができます。分類ごとの記録が溜まれば、どの状態をどう扱うかを感覚ではなく集計で判断できるようになります。

どう活用するか

「根拠の異なる2つの外縁を重ね、真偽値の組み合わせで状態を分ける」という骨格は、この2指標に限らず応用できます。ご自身で開発される場合は、本記事の4状態の表と自己参照を避ける比較位置を、Claude Codeへ渡す仕様メモの出発点として使ってみてください。実装そのものを依頼したい場合は、ai-programming.xyzで要件のご相談を受け付けています。状態管理や検証ログの設計を基礎から順に学びたい場合は、スクールで段階的に扱っています。

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