株価の大きな変動が起こる前、チャート上では「スクイズ」と呼ばれる独特なサインが現れます。これはボリンジャーバンドの幅が極端に狭まる現象で、次に価格が上下どちらかに大きく放たれるエネルギーが溜まっている状態を指します。
このスクイズをPythonで検知できるようになれば、何百という銘柄の中から「今にも動き出しそうな株」を自動で探し出せます。この記事では、ライブラリの準備から具体的な判定ロジック、チャートへの可視化まで、実際に手を動かしながら完成させる手順を分かりやすく解説します。
ボリンジャーバンドのスクイズを検知するメリット
ボリンジャーバンドのスクイズを自作プログラムで検知することには、目視での分析にはない圧倒的な優位性があります。
この章では、なぜスクイズに注目すべきなのか、そしてプログラム化することで投資判断がどう変わるのかを整理します。まずはメリットを把握して、ツールの完成イメージを膨らませましょう。
ボラティリティの低下を数値で客観的に捉える
多くの投資家はチャートを見て「最近動きが小さいな」と感覚で判断しますが、その基準は人によってバラバラです。Pythonを使えば、ボラティリティ(価格の変動率)を数値として算出し、統計的に「今は異常に静かである」ことを客観的に証明できます。
例えば、今のバンド幅が過去100日間の平均と比べて何パーセントの位置にいるのかを計算させます。これにより、感情に左右されることなく、フラットな視点で相場の落ち着きを判断できるようになるのです。
もちろん、数値が低いからといって必ずしもチャンスとは限りません。しかし、感覚による「なんとなく」の判断を排除できることは、システムトレードにおいて大きな一歩となります。
相場のパワーが溜まった「爆発前夜」を特定する
スクイズは、いわば「嵐の前の静けさ」です。買い手と売り手の力が均衡し、エネルギーが限界まで圧縮されている状態を指します。この後に起こる「エクスパンション(バンドの拡大)」こそが、大きな利益を狙えるトレンドの発生ポイントです。
スクイズの期間が長ければ長いほど、その後の反動も大きくなる傾向があります。Pythonでスクイズの継続日数をカウントさせれば、より爆発力の高い銘柄に絞り込むことも可能です。
「いつ動くかわからない」と待ち続けるストレスから解放され、期待値の高い局面だけを効率よく狙い撃ちできるようになります。
大量の銘柄からスクイズ中の株を瞬時に探し出す
人力で数千銘柄のチャートを毎日チェックするのは不可能に近い作業です。しかし、プログラムなら、東証全銘柄の中からスクイズ状態にあるものだけを数分で見つけ出すことができます。
仕事で忙しい会社員の方でも、朝の数分間プログラムを走らせるだけで、その日の監視銘柄リストを自動で作成できます。
以下の表に、手動分析とPythonによる自動検知の違いをまとめました。
| 比較項目 | 手動(目視)分析 | Pythonによる自動検知 |
| 分析スピード | 1銘柄につき数十秒〜数分 | 全銘柄でも数分程度 |
| 客観性 | 主観が入りやすい | 数値に基づき常に一定 |
| 見落とし | 疲れや集中力で発生する | 設定した条件なら100%抽出 |
| カスタマイズ | 毎回同じ基準を保つのが困難 | 過去n日間の最小値など自由 |
自分だけのスクリーニング条件を一度決めてしまえば、あとはAIが文句も言わずに働いてくれるようになります。
開発環境を整えてライブラリを準備する
Pythonで株価分析を始めるために、まずは必要な道具を揃えましょう。パソコンへのインストールが不安な方は、ブラウザ上で動作するGoogle Colabを使うのが最も簡単です。
ここでは、今回のスクイズ検知に欠かせない3つの主要ライブラリについて解説します。それぞれ役割が異なるため、全体の流れの中での立ち位置を確認しておいてください。
データを取得するためにyfinanceを導入する
株価分析の第一歩は、正確なデータを手に入れることです。yfinanceは、Yahoo! Financeから世界中の株価データを無料で取得できる非常に便利なライブラリです。
日本株だけでなく、米国株やFX、仮想通貨のデータも同じ命令で取得できるため、一度使い方を覚えれば分析の幅がぐっと広がります。
複雑な契約やAPIキーの発行も必要なく、コード一行で過去数年分のデータをダウンロードできるのが最大の強みです。まずはこのライブラリを使って、自分の気になる銘柄のデータにアクセスすることから始めましょう。
数値計算とデータ加工を担うpandas
取得した生のデータは、そのままでは分析に使えません。そこで登場するのが、データ分析の王道ライブラリであるpandasです。
pandasを使えば、Excelのように表形式でデータを扱い、移動平均線や標準偏差を瞬時に計算できます。
今回のスクイズ判定でも、日付ごとの株価を整理し、バンド幅の推移を管理するためにフル活用します。プログラミングにおいてデータの掃除や加工は時間の8割を占めると言われますが、pandasはその作業を強力にサポートしてくれます。
チャートを表示して確認するためのmatplotlib
計算結果が数値だけでは、本当にスクイズが起きているのかイメージが湧きにくいものです。そこで、matplotlibを使って結果をグラフとして描き出します。
計算されたボリンジャーバンドと実際の株価を重ねて表示することで、自分の書いたコードが正しく動いているかを視覚的にチェックできます。
派手な見た目ではありませんが、エンジニアやデータサイエンティストの間で最も信頼されているグラフ描画ツールです。基本を押さえておけば、自分専用の高機能なテクニカルチャートを自作できるようになります。
株価データを取得してボリンジャーバンドを計算する
道具が揃ったら、いよいよ実際に株価を動かしてみましょう。まずは東京証券取引所に上場している銘柄のデータを取得し、ボリンジャーバンドの数値を算出します。
この工程がすべての土台となります。計算式そのものはライブラリが処理してくれますが、どのような手順で数字が作られていくのか、その流れを意識しながら進めてください。
yfinanceで東京証券取引所の株価を読み込む
日本株を取得する際は、銘柄コードの末尾に「.T」を付けるのがルールです。例えばトヨタ自動車なら「7203.T」と記述します。
以下のコードを実行して、過去の株価データを変数に格納しましょう。
import yfinance as yf
import pandas as pd
# 銘柄と期間を指定してデータをダウンロード
df = yf.download("7203.T", start="2023-01-01")
print(df.head())
データが正常に表示されれば準備完了です。ここで取得したデータには、始値、高値、安値、終値、出来高が含まれています。
移動平均線と標準偏差を算出するコードを書く
ボリンジャーバンドの基本は「20日移動平均線」と、その上下に描かれる「標準偏差(σ:シグマ)」です。一般的には2σの範囲に株価が収まる確率が約95.4%と言われています。
pandasの関数を使えば、窓枠をずらしながら計算する「ローリング計算」が簡単に行えます。
# 20日移動平均線を計算
df['sma'] = df['Close'].rolling(window=20).mean()
# 標準偏差(20日)を計算
df['std'] = df['Close'].rolling(window=20).std()
# 上下バンドを算出
df['upper'] = df['sma'] + (df['std'] * 2)
df['lower'] = df['sma'] - (df['std'] * 2)
これで、各日付の移動平均線と上下のラインが算出されました。ボリンジャーバンドはこの「価格のばらつき」を可視化したものだと考えると理解しやすくなります。
上下バンドの差から「バンド幅」を導き出す
スクイズを判定するための最も重要な指標が「バンド幅(Band Width)」です。これは、上のラインから下のラインを引いた単純な幅の広さを指します。
ただし、株価の絶対額によって幅の広さは変わってしまうため、移動平均線で割って「比率」として計算するのが一般的です。
# バンド幅の計算((上物 - 下物) / 中央)
df['bandwidth'] = (df['upper'] - df['lower']) / df['sma']
この数値が小さければ小さいほど、ボラティリティが低く、スクイズが起きていることを意味します。この「bandwidth」という列の値こそが、今回の自動検知の主役となります。
Pythonでスクイズ状態を自動判定するロジック
数値が算出できても、どの程度低ければ「スクイズ」と呼べるのかを決めなければなりません。単に「0.05以下」などの固定値にすると、銘柄ごとの特性(値動きの激しさの違い)に対応できなくなります。
そこで、その銘柄自身の過去と比較して「今は過去稀に見る静かさである」ことを判定するロジックを組み込みましょう。
過去n期間のバンド幅の最小値を基準にする
おすすめの判定基準は、過去100日間や120日間といった一定期間の中で、今のバンド幅が最小値に近いかどうかを見ることです。
これにより、その銘柄にとっての「平常時」と「異常な静寂」を相対的に区別できるようになります。
# 過去100日間の最小バンド幅を求める
df['min_bandwidth'] = df['bandwidth'].rolling(window=100).min()
この最小値と同じ、あるいはわずかに上回る程度の状態をスクイズと定義することで、銘柄ごとの「絞り込みの癖」を自動で吸収した、精度の高い検知が可能になります。
スクイズ発生時にフラグを立てる条件分岐
最小値を計算したら、今の値と照らし合わせます。「今のバンド幅が過去100日の最小値から10%以内にある」といった条件で、スクイズフラグを立ててみましょう。
条件に合致した日を「1」、そうでない日を「0」とすることで、後から分析がしやすくなります。
# スクイズ判定のフラグを立てる(最小値の1.1倍以下ならスクイズ)
df['is_squeeze'] = df['bandwidth'] <= (df['min_bandwidth'] * 1.1)
確かに、1.1倍という数字は調整の余地があります。しかし、まずはこのように明確な境界線を引くことで、プログラムは迷いなく銘柄を仕分けられるようになります。
特定の閾値を下回ったタイミングを特定する
フラグを立てるだけでなく、「今日まさにスクイズが始まったのか」を知りたい場合もあります。これは、前日のフラグが「0」で、今日のフラグが「1」になった瞬間を探せば分かります。
このような「変化の瞬間」を捉えることで、監視リストへの追加タイミングを逃さず把握できます。
以下の表に、スクイズ判定でよく使われる手法を整理しました。
| 判定手法 | 内容 | メリット |
| 過去最小値比較 | 過去n日間の最低値と比較 | 銘柄ごとの個性に合わせられる |
| パーセンタイル | 下位n%の順位にいるか | 統計的に低い状態を捉えやすい |
| 固定閾値 | 0.03以下など固定値 | 実装が簡単で計算負荷が低い |
初心者のうちは、最も直感的な「過去最小値比較」から始めるのが、ダマシを減らすための賢い選択です。
グラフを描画してスクイズの発生箇所を可視化する
プログラムが「ここはスクイズだ」と判定した場所が、人間の感覚と合っているかを確認しましょう。
分析結果をグラフ化することで、判定ロジックのミスや改善点が見えてきます。チャート上に視覚的な目印を付けて、一目でチャンスがわかるように仕上げます。
価格チャートの下にバンド幅の推移を表示する
株価チャートと同じ時間軸で、その下に「バンド幅」の推移を表示するサブチャートを作成します。
こうすることで、株価が大きく動いたときにバンド幅がどう変化し、その後どう収束していくのかという流れが手に取るようにわかります。
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
# 上段:株価とボリンジャーバンド
ax1.plot(df['Close'], label='Price')
ax1.plot(df['upper'], label='Upper', alpha=0.3)
ax1.plot(df['lower'], label='Lower', alpha=0.3)
# 下段:バンド幅
ax2.plot(df['bandwidth'], label='BandWidth', color='orange')
この上下二段の構成は、プロのトレーダーもよく使うスタイルです。数値の変化をダイレクトに視認できるため、ロジックの妥当性をチェックするのに最適です。
スクイズ発生地点にマークを付ける方法
次に、スクイズフラグが立っている箇所にだけ、チャート上に特別な印を付けます。例えば、背景色を変えたり、下部にドットを表示させたりする手法があります。
これにより、チャートをパラパラと切り替えるだけで、どの時期にエネルギーが溜まっていたのかが即座に判別できます。
「ここがスクイズだったんだな」と視覚的に納得できれば、自分の作ったプログラムへの信頼感も増していきます。同時に、スクイズの後に本当にブレイクアウトが起きているかどうかの答え合わせも捗ります。
バンドの収束と価格の動きを重ねて確認する
最終的には、メインの株価チャート上に「収束しているゾーン」を強調表示させるのがゴールです。
バンドの上下がググッと狭まり、まるでパイプの中を通っているような形になっている場所を探してください。
- スクイズ中はロウソク足が小さく並ぶ
- 上下のバンドが水平、または内側を向いている
- 移動平均線が横ばいになっている
これらの特徴と、プログラムが算出した「スクイズフラグ」が重なっていれば、検知ロジックは成功です。自分だけの「勝てる形」をグラフ上で繰り返し確認しましょう。
スクイズ検知後にブレイクアウトを狙うコツ
スクイズを検知できるようになったら、次は「どうやって利益に変えるか」という戦略の話です。
スクイズは爆発の予兆ですが、そのまま価格が動かずにダラダラと横ばいが続くこともあります。チャンスを確実にモノにするための、実践的な考え方を学びましょう。
バンドの上下どちらに放たれたかを確認する
スクイズは「どちらかに動く」ことは教えてくれますが、「どちらに動くか」は教えてくれません。そのため、スクイズを確認した後は、価格がバンドを突き抜ける瞬間(ブレイクアウト)を待つ必要があります。
一般的には、終値が上のバンド(Upper Band)を抜ければ買い、下のバンド(Lower Band)を抜ければ売りのサインとされます。
スクイズによって極限まで幅が狭まっているため、わずかな値動きでもバンドを突き抜けやすくなっています。この「初動」を捉えることこそが、ボリンジャーバンドを使ったトレードの醍醐味です。
出来高の増加を併用して信頼度を高める
スクイズからのブレイクアウトが本物かどうかを見極める強力な武器が「出来高」です。価格がバンドを抜ける際、出来高が急増していれば、それは多くの投資家がその動きに参加している証拠です。
逆に、出来高が伴わない小規模な抜けは「ダマシ」に終わることが少なくありません。
- スクイズが発生し、嵐の前の静けさが続く
- 価格がバンドを上抜けし、同時に出来高が前日より大きく増える
- 本格的な上昇トレンドの開始と判断してエントリーする
このように、複数の条件を組み合わせることで、精度の高いトレードが可能になります。Pythonを使えば、この出来高の条件も簡単にプログラムに組み込めます。
長期間のスクイズほど大きなトレンドになりやすい理由
相場の世界には「保ち合いが長いほど、放たれた時のエネルギーは大きい」という格言があります。スクイズが数週間、数ヶ月と続いている銘柄は、市場から忘れ去られ、売りも買いも枯れ果てている状態です。
そのような銘柄に何らかのニュースが飛び込むと、一気に注目が集まり、止まらない大相場へと発展することがあります。
Pythonで「過去10日間ずっとスクイズ状態が続いている銘柄」という条件で検索をかければ、こうした大化け候補を効率よく発掘できます。短期的な小さな動きに惑わされず、どっしりと構えた大相場を狙うための、強力なフィルターとして活用してください。
自作プログラムを運用する際の注意点
どれほど優れた検知ツールであっても、盲信は禁物です。株価の世界には計算式だけでは説明できない例外が常に存在します。
自作ツールを日々の投資に活かしていくために、最低限知っておくべきリスクと対策を整理しました。これらを知っておくことで、予期せぬ損失から自分の資産を守ることができます。
経済指標の発表などによる一時的な収束に注意する
決算発表や重要な経済指標(雇用統計など)の直前には、市場全体が様子見ムードになり、一時的にスクイズ状態になることがよくあります。
これは相場のエネルギーが蓄積されているというよりは、単に「みんなが怖くて動けないだけ」の状態です。
このような時に無理にエントリーすると、指標発表後の上下に激しく振れる動き(往復ビンタ)に巻き込まれるリスクが高まります。カレンダーを確認し、大きなイベントの前にはスクイズ検知の結果を慎重に扱う、あるいは見送るという判断も必要です。
過去のデータに合わせすぎる「過学習」を防ぐ
プログラムを作っていると、つい「過去のこの銘柄ではこの設定が完璧だったから、次もこれで行こう」と考えがちです。しかし、過去の特定の期間に設定を合わせすぎると、未来の相場では全く通用しなくなることがあります。これを「過学習(オーバーフィッティング)」と呼びます。
特定の銘柄だけでなく、複数の銘柄や異なる期間でテストを行い、ある程度ゆとりのある設定にしておくのが長く使い続けるコツです。
「100点満点の検知」を目指すのではなく、「70点でいいから、どんな時でも大外ししない」という姿勢が、最終的な運用成績の安定に繋がります。
スクリーニング結果を最終的に目視でチェックする
Pythonが出してくれるのは、あくまで「条件に合致したデータのリスト」です。最後は自分の目で実際のチャートを確認し、違和感がないかをチェックする工程を必ず挟んでください。
例えば、TOB(公開買付け)によって株価が固定されている場合なども、データ上は極度のスクイズとして検知されてしまいます。
- ニュースで変な動きをしていないか
- 板の状況は極端に薄くないか
- 業績に致命的な問題はないか
これらを人間の目で最終確認することで、機械にはわからない「怪しい銘柄」を排除できます。AIと人間の得意分野を組み合わせることこそが、最強のスクリーニング手法なのです。
まとめ:自作プログラムを運用する際の注意点
この記事では、Pythonを使ってボリンジャーバンドのスクイズを自動検知する具体的な方法を解説してきました。スクイズという「嵐の前の静けさ」を数値で捉えることは、投資のチャンスを掴むための非常に強力な手段になります。
最後に、今回学んだ重要なステップを振り返りましょう。
- 数値化: バンド幅を計算し、感覚ではなく客観的なデータで収束を捉える
- 自動化: yfinanceとpandasを活用して、大量の銘柄から瞬時にチャンスを探す
- 視覚化: グラフを描画して、計算結果と実際のチャートの動きを照らし合わせる
- 戦略: スクイズ後のブレイクアウトと出来高を確認し、エントリー精度を高める
自作のツールは、使い続けるうちに「もっとこうしたい」という改善点が見つかるはずです。その試行錯誤こそが、あなただけの独自の投資手法を作り上げていくプロセスそのものです。
まずは身近な銘柄を一つ選んで、コードを動かすところから始めてみてください。データが語る相場の静寂を、自分の手でキャッチできる楽しさを実感できるはずです。

