コンテンツにスキップ

ボリンジャーバンド(Bollinger Bands, BB)

ボリンジャーバンドは、移動平均を中心に価格の相対的な高低とボラティリティの収縮、拡大を同時に捉える指標です。USD/JPY のデイトレで「トレンド継続」「レンジ逆張り」「ブレイク前の圧縮」を分ける補助線として、時間帯、上位足、価格構造と組み合わせて使います。

ローソク足にボリンジャーバンド(20,2)を重ねたイメージ。バンドが収縮するスクイーズから拡大へ移行する局面。

架空データによるイメージ図(実際の相場データではありません)。バンド幅が狭まるスクイーズ(中央付近)と、その後の拡大が確認できる。

定義

ボリンジャーバンドは、ミドルバンドを中心に上下へ標準偏差の倍数を加減したバンドを描きます。

Bollinger (2001) の標準設定は n=20n=20, k=2k=2。ミドルバンドは 20本 SMA、標準偏差は同じ20本の終値から計算する母集団標準偏差(ddof=0)を使います。

Middlet=SMAt(n)=1ni=0n1Pti\text{Middle}_t = \text{SMA}_t(n) = \frac{1}{n}\sum_{i=0}^{n-1} P_{t-i}

σt=1ni=0n1(PtiMiddlet)2\sigma_t = \sqrt{\frac{1}{n}\sum_{i=0}^{n-1}(P_{t-i} - \text{Middle}_t)^2}

Uppert=Middlet+kσt\text{Upper}_t = \text{Middle}_t + k\sigma_t

Lowert=Middletkσt\text{Lower}_t = \text{Middle}_t - k\sigma_t

標準設定では次の形になります。

Uppert=SMA20,t+2σ20,t,Lowert=SMA20,t2σ20,t\text{Upper}_t = \text{SMA}_{20,t} + 2\sigma_{20,t}, \quad \text{Lower}_t = \text{SMA}_{20,t} - 2\sigma_{20,t}

  • ミドルバンド:中期の価格水準。標準は SMA(20)
  • アッパーバンド:相対的に高い価格帯
  • ロワーバンド:相対的に低い価格帯
  • バンド幅:ボラティリティの拡大、収縮を示す

%B

%B は価格が上下バンドのどこに位置するかを 0–1 の尺度で表します。

%Bt=PtLowertUppertLowert\%B_t = \frac{P_t - \text{Lower}_t}{\text{Upper}_t - \text{Lower}_t}

  • %B=1\%B = 1: 終値がアッパーバンド
  • %B=0.5\%B = 0.5: 終値がミドルバンド
  • %B=0\%B = 0: 終値がロワーバンド
  • %B>1\%B > 1: 終値がアッパーバンド外
  • %B<0\%B < 0: 終値がロワーバンド外

%B は逆張りよりも、位置情報の数値化として使います。ダイバージェンス、Wボトム/Mトップ、ブレイク継続の判定に向きます。

Bandwidth

Bandwidth はバンド幅をミドルバンドで正規化した値です。

Bandwidtht=UppertLowertMiddlet\text{Bandwidth}_t = \frac{\text{Upper}_t - \text{Lower}_t}{\text{Middle}_t}

標準設定では UpperLower=4σ\text{Upper} - \text{Lower} = 4\sigma なので、Bandwidth は20本の変動係数の4倍になります。

  • Bandwidth 低下: ボラティリティ収縮
  • Bandwidth 上昇: ボラティリティ拡大
  • 極端な低下: スクイーズ候補
  • 低下後の急上昇: ブレイク初動候補

パラメータ

パラメータ標準意味
nn20SMA と標準偏差の計算期間
kk2標準偏差に掛ける倍率
ミドルSMA標準偏差計算と整合させる
標準偏差母集団標準偏差pandas では ddof=0
価格終値基本は close。高値/安値で計算しない

Bollinger 標準は n=20,k=2n=20, k=2。短くするなら n=10, k=1.9、長くするなら n=50, k=2.1 のように、期間変更に応じて倍率も調整するのが一貫した扱いになります。

USD/JPY の実務では、むやみに最適化せず次を基本にします。

時間足設定主な用途
5分20, 2東京仲値、ロンドン序盤、NY序盤の短期フロー確認
15分20, 2デイトレの主軸。スクイーズとブレイク判定
1時間20, 2当日の方向と押し目/戻り目候補
4時間20, 2スイングのボラティリティ環境確認
日足20, 2月次レベルの相場環境と過熱確認

シグナル

バンドウォーク

価格がアッパーバンド沿いに上昇し続ける、またはロワーバンド沿いに下落し続ける状態。強いトレンドの典型です。

  • 上昇バンドウォーク: 終値がミドルより上、%B が 0.8–1.2 付近で推移
  • 下落バンドウォーク: 終値がミドルより下、%B が −0.2–0.2 付近で推移
  • バンドタッチを逆張りすると踏まれやすい
  • ミドルバンド割れ、または %B の失速で勢い低下を確認する

バンドウォークでは「アッパータッチ=売り」ではありません。上昇トレンドではアッパータッチは継続シグナルとして扱います。

スクイーズ

Bandwidth が低位まで縮小し、価格変動が圧縮された状態。次の拡大局面を待つセットアップです。

判定例:

  • Bandwidth が過去120本の下位 10–20% にある
  • 上下バンドが平行に狭まる
  • ミドルバンドの傾きが小さい
  • 直近高値/安値のレンジが狭い

エントリーは「スクイーズしたから買う/売る」ではありません。レンジ上限、下限の終値ブレイク、%B の 1 超え/0 割れ、他指標の確認を待ちます。

%B

%B は価格の位置を数値化し、裁量判断を減らすための補助指標として使います。

  • %B>1\%B > 1: アッパーバンド外。上方向のブレイクまたは過熱
  • %B<0\%B < 0: ロワーバンド外。下方向のブレイクまたは過熱
  • %B\%B が 0.5 を維持: ミドルより上で推移。買い優勢
  • %B\%B が 0.5 を回復できない: ミドルより下で推移。売り優勢
  • 価格が高値更新しても %B が低下: 上昇の勢い低下
  • 価格が安値更新しても %B が上昇: 下落の勢い低下

%B は単独で売買しないこと。価格構造、ミドルバンドの傾き、時間帯の流動性と合わせます。

W ボトム / M トップ

ボリンジャーバンドは価格パターンの認識にも使います。

W ボトム

  1. 1回目の安値がロワーバンド付近または外側で形成される
  2. 反発後、2回目の安値が1回目と同水準またはやや下で形成される
  3. 2回目の安値では %B が1回目より高い
  4. ネックラインを終値で上抜ける

2回目の安値で %B が切り上がるなら、下方向の勢いが弱まっています。ネックライン上抜けで買いシナリオが成立します。

M トップ

  1. 1回目の高値がアッパーバンド付近または外側で形成される
  2. 反落後、2回目の高値が1回目と同水準またはやや上で形成される
  3. 2回目の高値では %B が1回目より低い
  4. ネックラインを終値で下抜ける

2回目の高値で %B が切り下がるなら、上方向の勢いが弱まっています。ネックライン下抜けで売りシナリオが成立します。

ミドルバンド反発

ミドルバンドはトレンド中の押し目、戻り目候補になります。

  • 上昇中: ミドルバンドまで押して反発すれば買い継続
  • 下落中: ミドルバンドまで戻して反落すれば売り継続
  • ミドルが横ばいなら、反発よりレンジ内回帰を優先する
  • ミドルを明確に終値で割る/上抜けると、トレンド継続の前提が弱くなる

USD/JPY での使いどころ

USD/JPY は時間帯ごとに参加者と値動きの性格が変わります。ボリンジャーバンドは時間帯を分けて使います。

東京仲値(JST 09:55)

東京仲値前後は実需フローで一方向に伸びたあと、仲値通過後に反転しやすい時間帯です。

  • 09:30–09:55 にアッパーバンドへ張り付く上昇は、仲値需要による短期バンドウォークとして扱う
  • 09:55 通過後に %B が 1 未満へ戻り、5分足ミドルを割るなら利確、反転を警戒する
  • ロワーバンド側も同じ。仲値後に %B が 0 を回復し、ミドルを上抜けるなら下げ止まりを確認する
  • 仲値前の ±2σ タッチだけで逆張りしない。時間帯フローが優先される

ロンドンオープン(JST 16:00)

ロンドン勢の参加で東京時間のレンジが破られやすく、スクイーズ後の拡大を狙う時間帯です。

  • 14:00–16:00 に Bandwidth が低下し、東京レンジが狭いならスクイーズ候補
  • 16:00 前後にレンジ上限を終値で上抜け、%B > 1 なら上方向のブレイク候補
  • 16:00 前後にレンジ下限を終値で下抜け、%B < 0 なら下方向のブレイク候補
  • ブレイク後にミドルバンドまで戻して反発すれば、押し目/戻り目として扱う
  • 初動の逆張りは避ける。ロンドン序盤はバンドウォークへ移行しやすい

NYオープン(JST 22:30)

NYオープンは米金利、株式市場、指標発表の影響を受けやすく、ボラティリティ拡大とヘッドフェイクを警戒します。

  • 22:30 前にスクイーズしている場合、上下どちらかのバンド外終値で初動を確認する
  • 指標直後の1本だけで判断しない。次の足で %B が維持されるかを見る
  • バンド外へ飛び出したあと即座にバンド内へ戻るならヘッドフェイクを警戒する
  • 1時間足のミドル方向と 5分/15分のブレイク方向が一致する場合だけ優先度を上げる
  • NY序盤の強いバンドウォークは、ミドル割れまで逆張りしない

落とし穴

  • 「±2σ タッチ=逆張り」の誤解:バンドタッチはシグナルではない。強いトレンドではタッチ後もバンドウォークが続く
  • ddof の取り違え:pandas の rolling().std() は標準で ddof=1。Bollinger 標準に合わせるなら ddof=0 を明示する
  • SMA を EMA に置換する:ミドルだけ EMA にすると、標準偏差計算との整合が崩れる。EMA 版を使うなら標準偏差側も一貫して設計する
  • 短周期化しすぎるn=5n=10 は反応が速いがノイズが急増する。USD/JPY の短期足ではスプレッド、約定、指標ノイズの影響が大きい
  • 倍率だけを最適化するk=1.7k=2.3 などをバックテストに合わせると過剰最適化になりやすい。まず 20, 2 を基準にする
  • スクイーズの方向を決め打ちする:Bandwidth 低下はエネルギー蓄積であり、方向は示さない。価格の終値ブレイクを待つ
  • バンド外終値を常に過熱とみなす:バンド外終値は初期の継続シグナルになり得る。特にロンドン、NY序盤では逆張りが危険
  • 時間足を混在させる:1時間足のバンドを5分足データで再計算すると別物になる。上位足は上位足データで固定して参照する
  • 正規分布を前提にしすぎる:FX 価格は正規分布ではない。±2σ 内に必ず 95% 収まるという前提で損切りを置かない
  • 時間帯を無視する:東京仲値、ロンドンオープン、NYオープンでは同じバンドタッチでも意味が変わる。時間帯の流動性を条件に入れる

Python 実装スケッチ

import pandas as pd
def bollinger_bands(
close: pd.Series,
n: int = 20,
k: float = 2.0,
) -> pd.DataFrame:
middle = close.rolling(window=n, min_periods=n).mean()
sigma = close.rolling(window=n, min_periods=n).std(ddof=0)
upper = middle + k * sigma
lower = middle - k * sigma
bandwidth = (upper - lower) / middle
percent_b = (close - lower) / (upper - lower)
return pd.DataFrame(
{
"close": close,
"bb_middle": middle,
"bb_upper": upper,
"bb_lower": lower,
"bb_percent_b": percent_b,
"bb_bandwidth": bandwidth,
}
)

min_periods=n を指定して、計算期間を満たさない先頭区間では NaN を返します。std(ddof=0) を明示して、Bollinger 標準の母集団標準偏差に合わせます。

スクイーズ判定例:

def add_bollinger_signals(
df: pd.DataFrame,
n: int = 20,
k: float = 2.0,
squeeze_lookback: int = 120,
squeeze_quantile: float = 0.2,
) -> pd.DataFrame:
out = df.copy()
bb = bollinger_bands(out["close"], n=n, k=k)
out = out.join(bb.drop(columns=["close"]))
threshold = out["bb_bandwidth"].rolling(
window=squeeze_lookback,
min_periods=squeeze_lookback,
).quantile(squeeze_quantile)
out["bb_squeeze"] = out["bb_bandwidth"] <= threshold
out["bb_breakout_up"] = (out["close"] > out["bb_upper"]) & (out["bb_percent_b"] > 1)
out["bb_breakout_down"] = (out["close"] < out["bb_lower"]) & (out["bb_percent_b"] < 0)
return out

スクイーズは「低 Bandwidth」を示すだけで、方向は示しません。売買判定では直近レンジの終値ブレイク、上位足方向、東京仲値、ロンドンオープン、NYオープンの時間帯条件を加えます。

参考

  • John Bollinger, Bollinger on Bollinger Bands, McGraw-Hill, 2001
  • John Bollinger 公式サイト — “Bollinger Bands / Rules”
  • pandas documentation — Rolling.std, Series.rolling