Pythonでボリンジャーバンドを計算・表示する方法【pandas・matplotlib】

Uncategorized

※本記事には広告・アフィリエイトリンクが含まれます。収益はサイト運営・検証費用に充てています。

結論から言うと:

  • ボリンジャーバンドは移動平均±標準偏差×σで計算される指標で、pandasの rolling().mean()とrolling().std()で簡単に実装できる仕組みです
  • バンド幅(Upper-Lower)でボラティリティの大小を定量的に把握できる
  • RSIやMACDと組み合わせることで、売買シグナルの精度が上がる

ボリンジャーバンドとは(計算式)

ボリンジャーバンドは、移動平均線(MA)を中心に上下に標準偏差(σ)の倍数分の幅を持つバンドを描く指標です。一般的な設定は20日移動平均・2σです。

  • 中央線(MA20):過去20日間の終値の平均
  • 上限線(Upper):MA20 + 標準偏差 × 2
  • 下限線(Lower):MA20 − 標準偏差 × 2

統計的に価格の約95%がUpperとLowerの間に収まる仕組みです。

計算コード(20日・2σ)

import yfinance as yf
import pandas as pd

# データ取得(トヨタ・過去1年)
df = yf.download("7203.T", period="1y")
close = df['Close']

# ボリンジャーバンド計算
window = 20
df['MA20'] = close.rolling(window=window).mean()
df['STD20'] = close.rolling(window=window).std()
df['Upper'] = df['MA20'] + (df['STD20'] * 2)
df['Lower'] = df['MA20'] - (df['STD20'] * 2)

print(df[['Close', 'MA20', 'Upper', 'Lower']].tail(5))

チャートに重ねて表示

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(14, 6))
ax.plot(df.index, df['Close'], label='終値', color='black', linewidth=1)
ax.plot(df.index, df['MA20'], label='MA20', color='blue', linewidth=1.5)
ax.plot(df.index, df['Upper'], label='Upper(+2σ)', color='red', linestyle='--')
ax.plot(df.index, df['Lower'], label='Lower(-2σ)', color='green', linestyle='--')

# バンドを塗りつぶす
ax.fill_between(df.index, df['Upper'], df['Lower'], alpha=0.1, color='blue')

ax.set_title('ボリンジャーバンド(20日・2σ)')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('bollinger.png')
print('保存: bollinger.png')

バンド幅でボラティリティ確認

バンド幅(BandWidth)はUpperとLowerの差をMA20で割った値で、ボラティリティの大小を数値化できます。

df['BandWidth'] = (df['Upper'] - df['Lower']) / df['MA20']
print(df['BandWidth'].describe())

BandWidthが小さい(バンドが収縮している)時期は、その後に大きな値動きが発生しやすい傾向がある仕組みです。

MACD・RSIとの組み合わせ

ボリンジャーバンドだけでは偽シグナルが多いため、MACD(トレンド系)やRSI(オシレーター系)と組み合わせるのが実践的です。たとえば「価格がLowerを下回り、かつRSIが30以下」という条件を組み合わせると、売られ過ぎの精度が向上する仕組みです。

筆者の検証メモ

yfinance 0.2.x以降、download()の戻り値がMultiIndexになる場合がある。その際はdf.columns = df.columns.get_level_values(0)でフラット化してから計算すると動作が安定した。rolling(20).std()はデフォルトでddof=1(標本標準偏差)を使う仕組みのため、母標準偏差を使いたい場合はddof=0を指定する。

データ取得比較記事はこちら


【投資免責事項】本記事で紹介するコードおよび分析結果は情報提供を目的としたものであり、特定の銘柄への投資を推奨するものではありません。投資判断はご自身の責任で行ってください。

タイトルとURLをコピーしました