ボリンジャーバンドをPythonで実装する方法

前回の記事では、yfinancePandasを使って株価データを取得する方法を解説しました。データが揃ったら、次はいよいよ「分析」のフェーズです。

今回は、テクニカル指標の中でも人気の高い「ボリンジャーバンド」をPythonで実装する方法を解説します。

目次

ボリンジャーバンドとは

ボリンジャーバンドは、移動平均線と標準偏差で構成されており、移動平均を表す線とその上下に値動きの幅を示す線を加えた指標で、「価格の大半がこの帯(バンド)の中に収まる」という統計学を応用したテクニカル指標のひとつです。

特徴は、収束と拡散を繰り返していることで、この動きにあわせて「順張り」「逆張り」それぞれの投資に利用することができます。

  • ミドルバンド(中心線): n日移動平均線(一般的に20日)
  • アッパーバンド(上限線): ミドルバンド +(標準偏差 × 係数)
  • ロワーバンド(下限線): ミドルバンド ー(標準偏差 × 係数)

Pythonによる実装コード

Pandasの「rolling()」メソッドを使えば、ボリンジャーバンドの計算ができます。
今回はトヨタ自動車(7203.T)の株価を使用して確認してみます。

# トヨタ自動車の証券コード+「.T」
ticker = "7203.T"

# Tickerオブジェクトを作成
toyota = yf.Ticker(ticker)

# periodを使って過去6ヶ月分のデータを取得
df = toyota.history(period='6mo')

# ▼ ▼ ▼ ボリンジャーバンド ▼ ▼ ▼

# 移動平均(20日)
df["ma"] = df["Close"].rolling(window=20).mean()

# 標準偏差
df["std"] = df["Close"].rolling(window=20).std(ddof=0)

## ボリンジャーバンド
# 2σ
df["upper_2"] = df["ma"] + (df["std"] * 2)
# 1σ
df["upper_1"] = df["ma"] + (df["std"] * 1)
# -1σ
df["lower_1"] = df["ma"] - (df["std"] * 1)
# -2σ
df["lower_2"] = df["ma"] - (df["std"] * 2)

# ▲ ▲ ▲ ボリンジャーバンド ▲ ▲ ▲

# 計算できない行を削除する
df = df.dropna()

# 相対パス「data/result.csv」にcsvファイル出力
df.to_csv(path_or_buf="data/result.csv", index=True, columns=['upper_2','upper_1','lower_1','lower_2'])

実行結果:

Date,upper_2,upper_1,lower_1,lower_2
・・・
2026-04-06 00:00:00+09:00,3453.344881014139,3378.718021561757,3229.4643026569934,3154.837443204611
2026-04-07 00:00:00+09:00,3449.2964711268164,3374.413317350518,3224.64700979792,3149.7638560216215
2026-04-08 00:00:00+09:00,3441.9900874632854,3369.8089658507834,3225.4467226257793,3153.2656010132773

コード解説

次にコードの解説を行います。

① 移動平均線の算出

df["ma"] = df["Close"].rolling(window=20).mean()
  • df[“Close”]: 終値(Close)のデータ列を指定しています。
  • .rolling(window=20): 「20行分(20日分)のデータを一塊として、1行ずつずらしながら処理する」というWindow関数の設定です。
  • .mean(): その20日分の塊の「平均」を出します。これで「20日移動平均」が完成します。

② 標準偏差の算出

df["std"] = df["Close"].rolling(window=20).std(ddof=0)
  • .std(ddof=0): 20日間のデータの「標準偏差」を計算します。
  • ddof=0: 統計学的な指定で「標本標準偏差」を算出するための引数です。TradingViewなどの多くの金融チャートツールと計算ルールを合わせるために、明示的に 0 を指定しています。

③ 上部バンド(+1σ / +2σ)の計算

df["upper_2"] = df["ma"] + (df["std"] * 2)
df["upper_1"] = df["ma"] + (df["std"] * 1)
  • df[“ma”] + : 移動平均線を基準にして、上にどれだけ離れているかを計算します。
  • (df[“std”] * 2): 標準偏差(std)を2倍した値を足します。
  • 1σ(シグマ)の場合は、標準偏差をそのまま足します。

④ 下部バンド(-1σ / -2σ)の計算

df["lower_1"] = df["ma"] - (df["std"] * 1)
df["lower_2"] = df["ma"] - (df["std"] * 2)
  • df[“ma”] – : 今度は移動平均線から値を「引き算」します。

補足

ボリンジャーバンドの計算コードのみを実行すると、最初の19行分は計算に必要なデータが足りないため、結果が NaN(非数)になります。
上のコードでは「df = df.dropna()」を使ってこれらを除去しています。

グラフで可視化

上で取得したボリンジャーバンドをチャートとして表示してみます。

視覚化すると、バンドの動きが直感的に理解できるね。
import matplotlib.pyplot as plt

# ボリンジャーバンド計算を挿入(上で提示したソース)

plt.figure(figsize=(12,6))
plt.plot(df["Close"], label="Close")
plt.plot(df["ma"], label="MA")
plt.plot(df["upper_2"], label="+2σ")
plt.plot(df["upper_1"], label="+1σ")
plt.plot(df["lower_1"], label="-1σ")
plt.plot(df["lower_2"], label="-2σ")

plt.legend()
plt.show()

実行結果:

まとめ

今回は、Pythonを使ってボリンジャーバンドを実装する方法を紹介しました。
rolling()」を使いこなせば、他のテクニカル指標(RSIやMACDなど)の実装もスムーズになります。

【投資に関する免責事項】
本ブログで紹介している株価解析ツールによるスコアリングおよび銘柄分析は、あくまで個人の学習・研究および技術検証を目的としたものであり、特定の銘柄の売買を推奨するものではありません。

ツールの算出結果や掲載情報の正確性については万全を期しておりますが、その内容を保証するものではありません。投資の最終決定は、必ずご自身の判断と責任において行っていただきますようお願いいたします。

万一、本ブログの情報に基づいて被ったいかなる損害についても、当サイトおよび運営者は一切の責任を負いかねますのであらかじめご了承ください。

目次