[Pythonによる株式分析]週足・月足の表示とボリンジャーバンドで値動きの範囲を把握する
Table of Contents
概要
前回の記事では移動平均線とゴールデンクロス・デッドクロスの検出方法について解説しました。今回は、より長期的なトレンドを把握するための週足・月足データの取得方法と、株価の値動きの範囲を統計的に把握するボリンジャーバンドについて解説します。
モチベーション
株式投資において、日足だけでなく週足や月足で長期的なトレンドを確認することは重要です。短期的な値動きに惑わされず、より大きな視点で銘柄の動向を捉えることができます。また、ボリンジャーバンドは移動平均線と標準偏差を組み合わせた指標で、価格の変動範囲を統計的に把握できます。価格がバンドの上限や下限に近づいた時に売買の判断材料として活用できます。
前回同様、PythonのモダンなライブラリであるPolars、Plotly、marimo、kand、yfinance-plを使って分析を進めていきます。
使用するライブラリ
ライブラリは以下の通りです。
| ライブラリ | 関連ライブラリ | 説明 |
|---|---|---|
| polars | pandas | データフレームを高速に扱えるライブラリ |
| plotly | matplotlib | 可視化ライブラリでユーザーがインタラクティブにグラフを操作できる |
| marimo | jupyter | py形式で動くノートブックでインタラクティブにコードを動かすことができる |
| kand | ta-lib-python | Rust製のテクニカル分析の計算ライブラリで、PYO3やWasmを通じてPythonやWebでも活用できる |
| yfinance-pl | yfinance | yfinance-rsをラップして作ったPython向けのライブラリでPolarsでYahoo Financeの情報を扱える |
ノートとコード
marimoのノートのHTML版はこちらにあります。GitHub上のPython形式のコードにもリンクします。
解説
週足・月足データの取得
yfinance-plでは、history()メソッドのintervalパラメータを指定することで、日足以外のデータも取得できます。日足は1d、週足は1wk、月足は1moを指定します。
import yfinance_pl as yf
ticker = yf.Ticker("8381.T")
# 日足データの取得(デフォルト)
hist_daily = ticker.history(period="1y", interval="1d")
# 週足データの取得
hist_weekly = ticker.history(period="2y", interval="1wk")
# 月足データの取得
hist_monthly = ticker.history(period="5y", interval="1mo")週足や月足のデータを使うことで、短期的なノイズを排除し、より長期的なトレンドを把握することができます。例えば、週足で移動平均線を見ることで、数ヶ月から半年程度のトレンドを把握できます。
ボリンジャーバンドの計算
ボリンジャーバンドは、移動平均線を中心線として、その上下に標準偏差を用いたバンドを表示する指標です。一般的には±2σ(標準偏差の2倍)を使用します。統計的には、価格の約95%がこのバンド内に収まると期待されます。
kandライブラリを使うと、ボリンジャーバンドを簡単に計算できます。
import kand as ka
import polars as pl
import yfinance_pl as yf
ticker = yf.Ticker("8381.T")
hist = ticker.history(period="1y")
# 終値データをNumPy配列に変換
close = hist["close.amount"].to_numpy().astype("float64")
# ボリンジャーバンドの計算(期間20、標準偏差2)
bbands_result = ka.bbands(close, period=20, std_dev=2.0)
# 結果をDataFrameに追加
hist_with_bbands = hist.with_columns(
bb_upper=pl.Series(bbands_result.upper), # 上限バンド(+2σ)
bb_middle=pl.Series(bbands_result.middle), # 中心線(移動平均線)
bb_lower=pl.Series(bbands_result.lower), # 下限バンド(-2σ)
)bbands()関数はperiod(移動平均の期間)とstd_dev(標準偏差の倍率)を指定します。一般的には期間20日、標準偏差2倍が使われますが、銘柄や時間軸に応じて調整できます。
ボリンジャーバンドの見方
ボリンジャーバンドは以下のような見方ができます。
1. バンドの幅(ボラティリティ)
バンドの幅は価格の変動性(ボラティリティ)を示します。
- バンド幅が広い:価格変動が大きい状態。トレンドが強い、または不安定な相場
- バンド幅が狭い:価格変動が小さい状態(スクイーズ)。この後、大きな値動きが発生する可能性が高い
2. バンドウォーク
価格がバンドの上限または下限に沿って動く現象を「バンドウォーク」と呼びます。
- 上限に沿って動く:強い上昇トレンド
- 下限に沿って動く:強い下降トレンド
3. バンドからの乖離
- 上限バンドを超える:買われ過ぎの可能性。反転の兆候に注意
- 下限バンドを下回る:売られ過ぎの可能性。反発の兆候に注意
ただし、強いトレンドではバンドを超えた状態が続くこともあるため、他の指標と組み合わせて判断することが重要です。
チャートの可視化
Plotlyを使ってローソク足とボリンジャーバンドを同時に表示できます。
import plotly.graph_objects as go
# データの準備
df_plot = hist_with_bbands.with_columns(
[
pl.col("open.amount").cast(pl.Float64),
pl.col("high.amount").cast(pl.Float64),
pl.col("low.amount").cast(pl.Float64),
pl.col("close.amount").cast(pl.Float64),
]
)
dates = df_plot["date"].to_list()
# チャートデータの作成
fig = go.Figure()
# ローソク足
fig.add_trace(go.Candlestick(
x=dates,
open=df_plot["open.amount"],
high=df_plot["high.amount"],
low=df_plot["low.amount"],
close=df_plot["close.amount"],
increasing_line_color="red",
decreasing_line_color="green",
name="株価",
))
# ボリンジャーバンド上限
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_upper"],
mode="lines",
name="BB上限(+2σ)",
line=dict(color="rgba(250, 128, 114, 0.5)", width=1),
))
# ボリンジャーバンド中心線
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_middle"],
mode="lines",
name="BB中心線(SMA20)",
line=dict(color="blue", width=1.5),
))
# ボリンジャーバンド下限
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_lower"],
mode="lines",
name="BB下限(-2σ)",
line=dict(color="rgba(250, 128, 114, 0.5)", width=1),
fill="tonexty", # 中心線との間を塗りつぶし
fillcolor="rgba(250, 128, 114, 0.1)",
))
fig.update_layout(
title="株価とボリンジャーバンド",
xaxis_title="日付",
yaxis_title="価格",
xaxis_rangeslider_visible=False,
)
fig.show()このコードでは、ローソク足とボリンジャーバンドの3本のライン(上限、中心、下限)を表示しています。fill="tonexty"を使うことで、中心線から下限までの領域を薄く塗りつぶし、バンドの範囲を視覚的に分かりやすくしています。
まとめ
今回は週足・月足データの取得方法と、ボリンジャーバンドによる価格変動範囲の把握方法を解説しました。週足・月足を使うことで長期的なトレンドを確認でき、ボリンジャーバンドを使うことで価格の統計的な変動範囲を把握できます。バンドウォークなどの概念もあり強いトレンドを掴める指標でわかりやすいのでぜひ参考にしてください。
![[Pythonによる株式分析]モダンなライブラリで移動平均線とゴールデンクロスを検出する](https://b.rmc-8.com/img/2025/11/30/714c58d2877178d9a3c63b901fd8b89f.jpg)
![[Pythonによる株式分析]Polarsで一目均衡表の計算をし表示する](https://b.rmc-8.com/img/2025/12/02/00541cf97f979f588ad2cad0ac6d6d7f.png)




コメントを読み込み中...