戦略・検証

ボラティリティブレイクアウト戦略とは?仕組みとPython実装の基礎


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

移動平均クロスやグリッドトレードに続いて、ボットの戦略を調べているとよく出てくるのが「ボラティリティブレイクアウト」です。名前から大まかなイメージは掴めても、何を基準に「ブレイクアウト」と判定するのか、仕組みを正確に理解していない人も多いのではないでしょうか。この記事では、ボラティリティブレイクアウト戦略の考え方と、Pythonでのシグナル計算の基礎を一般論として整理します。

ボラティリティブレイクアウト戦略とは何か

ボラティリティブレイクアウトは、値動きが小さく収縮している状態から、急に大きく動き出したタイミングを捉えてエントリーする戦略の総称です。

考え方の背景にあるのは、相場には「値動きが落ち着く時期」と「値動きが大きく拡大する時期」が交互に現れやすいという経験的な観察です。値動きが収縮したあとに価格が一定の範囲を抜けた場合、そこから大きなトレンドに発展する可能性がある、という前提に立っています。移動平均クロス戦略がトレンドの「向き」を見るのに対し、ブレイクアウト系は値動きの「大きさ」の変化を見る点が特徴です。

なお、これは一般的によく語られる経験則であり、将来も同じように機能し続けるという保証はありません。相場予想や「このロジックなら儲かる」という話ではなく、あくまで戦略の型の一つとして捉えてください。

代表的な2つの判定方法

ブレイクアウトの判定方法はいくつかありますが、代表的なものを2つ紹介します。

1. ドンチャンチャネル(直近高値・安値のブレイク)

過去N本の高値・安値を基準線とし、現在の価格がその範囲を抜けたらシグナルとする方法です。考え方自体はシンプルで、実装もしやすいのが特徴です。

2. ATR(Average True Range)を使った判定

ATRは「平均的な値幅」を表す指標で、値動きの大きさ(ボラティリティ)を数値化できます。ATRが一定期間縮小したあとに、価格が「直近の終値 ± ATRの倍数」を超えて動いた場合にシグナルとする方法がよく使われます。ATR自体の算出方法はテクニカル指標をPythonで計算する方法で扱っているロジックと同系統です。

いずれの方法も「基準となる範囲」の計算方法が違うだけで、骨格は共通しています。

Pythonでシグナルを計算する

まずはOHLCVデータを用意します。取得方法はPython+ccxt入門、DataFrameとして扱う際の注意点はpandasでOHLCV処理を参照してください。

import pandas as pd

# df には ['open', 'high', 'low', 'close'] 列を持つOHLCVデータが入っている前提

n = 20  # 直近何本を基準にするか

# 直近N本(当日を除く)の最高値・最安値を基準線にする
df['upper'] = df['high'].rolling(n).max().shift(1)
df['lower'] = df['low'].rolling(n).min().shift(1)

# 終値が基準線を抜けたらシグナル
df['signal'] = 0
df.loc[df['close'] > df['upper'], 'signal'] = 1   # 上方ブレイク → ロング
df.loc[df['close'] < df['lower'], 'signal'] = -1  # 下方ブレイク → ショート

rolling(n).max() に対して shift(1) をかけているのは、当日(当該の足)の高値・安値を基準線の計算に含めないためです。これを忘れると、同じ足の値動きで基準線を計算してシグナルを出すという「ルックアヘッド」が混入し、バックテストの成績が実際よりも良く見えてしまいます。この種のバイアスについてはバックテストの罠でも詳しく取り上げています。

ATR版の基準線を加える

値動きの収縮・拡大をより直接的に反映させたい場合は、ATRを使って基準線の幅を動的に変える方法もあります。

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)
df['breakout_upper'] = df['close'].shift(1) + df['atr'].shift(1) * 1.5
df['breakout_lower'] = df['close'].shift(1) - df['atr'].shift(1) * 1.5

df['signal_atr'] = 0
df.loc[df['close'] > df['breakout_upper'], 'signal_atr'] = 1
df.loc[df['close'] < df['breakout_lower'], 'signal_atr'] = -1

1.5 の倍数部分はパラメータであり、絶対的な正解値は存在しません。ここを過去データに対して何十通りも試して一番成績が良かった値を選ぶと、過剰最適化(カーブフィッティング)に陥りやすい点には注意が必要です。

検証でつまずきやすい点

ボラティリティブレイクアウト戦略には、他の戦略と共通する検証上の注意点がいくつかあります。

  • 「だまし」が多い: 基準線を一瞬だけ抜けてすぐ戻る、いわゆる「フェイクブレイク」が頻発する相場があります。レンジ相場ではエントリーのたびに損切りになりやすい傾向があります
  • 手数料とスリッページの影響: フェイクブレイクで損切りを繰り返すと取引回数が増え、コストの影響が成績を大きく削ります。この点は取引コストが成績を削る計算式で詳しく整理しているので、バックテストに必ず組み込んでください
  • 単一期間での検証に頼らない: ある相場環境ではうまく機能しても、別の環境では全く機能しないことがあります。ウォークフォワード検証のように複数期間に分けて確認する方が実態に近い評価ができます
  • 成績の見方: 勝率だけでなく、ペイオフレシオや最大ドローダウンも含めて評価することが重要です。詳しくは成績指標の読み方を参照してください

ポジションサイズとリスク管理も合わせて設計する

ブレイクアウト戦略はエントリー直後に価格が反転すると損失が発生しやすいため、1トレードあたりのリスクをどう抑えるかの設計も重要です。ポジションサイズの決め方についてはポジションサイズの計算式、資金管理全体の考え方は資金管理・リスク管理で解説しています。無期限先物でレバレッジをかけて運用する場合は、清算(ロスカット)のリスクがさらに増すため無期限先物とは?もあわせて確認しておくとよいでしょう。

まとめ

  • ボラティリティブレイクアウトは、値動きの収縮から拡大への変化を捉えようとする戦略の総称
  • 代表的な判定方法に、直近高値・安値を基準にするドンチャンチャネル型と、ATRを使って基準線の幅を動的に変える方法がある
  • 基準線の計算には shift(1) を使い、当該の足の値動きを含めないようにしてルックアヘッドを避ける
  • フェイクブレイクによる取引回数の増加はコストに直結するため、バックテストに手数料・スリッページを必ず組み込む
  • パラメータ(基準期間やATRの倍数)の過剰調整を避け、複数期間での検証を行う

ボラティリティブレイクアウトも、移動平均クロスやグリッドトレードと同じく「万能な必勝法」ではなく、相場環境によって得意・不得意がある戦略の一つです。仕組みを理解した上で、自分のボットの目的に合うかどうかを検証していく姿勢が大切です。投資判断は自己責任で行ってください。

PR

ブレイクアウト戦略のように値動きの大きさを利用する戦略では、無期限先物でのショートも選択肢になります。MEXCはAPIを使った自動売買にも対応しています。

MEXCの口座を無料で開設する(紹介リンク)