【Python/Pandas】株価のボリジャーバンドを描く

この記事では、PythonモジュールPandasで、株価の移動平均線とボリジャーバンドを求める方法をソースコード付きで紹介します。

ボリンジャーバンド

ボリンジャーバンドとは、移動平均線の動きの幅の指標です。
株価の動きの多くがボリンジャーバンドの範囲内に収まるといわれています。
ボリジャーバンドは、以下の三種類あります。

種類 説明
移動平均線 ± 1σ この範囲内で動く確率が68.3%
移動平均線 ± 2σ この範囲内で動く確率が95.5%
移動平均線 ± 3σ この範囲内で動く確率が99.7%

※σは標準偏差

Pandasではrolling.stdメソッドで移動平均の標準偏差を計算できます。

書式 df.rolling(window=日数).std()
返り値 移動平均の標準偏差

前記事では、株価データを自動収集して移動平均線を表示するプログラムを作成しました。
【Pandas】株価の移動平均線
今回は、自動で取得した株価の移動平均線とボリジャーバンドをグラフに描いてみました。

ソースコード

サンプルプログラムのソースコードです。

#-*- coding:utf-8 -*-
import pandas as pd
import jsm
import datetime

# 株価のデータ取得(銘柄コード, 開始日, 終了日)
def get_stock(code, start_date, end_date):
    # 期間設定
    year, month, day = start_date.split("-")
    start = datetime.date(int(year), int(month), int(day))
    year, month, day = end_date.split("-") 
    end = datetime.date(int(year), int(month), int(day))

    # 株価データ取得
    q = jsm.Quotes()
    target = q.get_historical_prices(code, jsm.DAILY, start_date = start, end_date = end)

    # 項目ごとにリストに格納して返す
    date = [data.date for data in target]
    open = [data.open for data in target]
    close = [data.close for data in target]
    high = [data.high for data in target]
    low = [data.low for data in target]

    # 日付が古い順に並び替えて返す
    return [date[::-1], open[::-1], close[::-1], high[::-1], low[::-1]]
    
def main():
    # 株価の取得(銘柄コード, 開始日, 終了日)
    code = 7203 # トヨタ自動車の銘柄コード
    data = get_stock(code, '2016-1-1', '2016-12-31')

    # データフレームの作成
    df = pd.DataFrame({'始値':data[1], '終値':data[2], '高値':data[3], '安値':data[4]}, index = data[0])
    
    # 移動平均線の計算
    ma_75d = df['終値'].rolling(window=75).mean()
    std = df['終値'].rolling(window=75).std()
    
    # ボリジャーバンド計算
    #band1_upper = ma_75d + std
    #band1_lower = ma_75d - std
    band2_upper = ma_75d + 2 * std
    band2_lower = ma_75d - 2 * std  
    #band3_upper = ma_75d + 3 * std
    #band3_lower = ma_75d - 3 * std  

    # グラフにプロット
    ax = df['終値'].plot(color="blue", label="Close")
    ma_75d.columns = ["MA 75d"]
    ma_75d.plot(ax=ax, ls="--", color="red", label="MA 75d")
    band2_upper.columns = ["Band2 Upper"]
    band2_upper.plot(ax=ax, ls="--", color="green", label="Band2 Upper")
    band2_lower.columns = ["Band2 Lower"]
    band2_lower.plot(ax=ax, ls="--", color="green", label="Band2 Lower")
    ax.grid()
    ax.legend()

    
if __name__ == "__main__":
    main()

実行結果

サンプルプログラムの実行結果です。

約95.5%の動きが収まるといわれている2次標準偏差(2σ)を75日移動平均線で描きました。
12月中旬の一時期以外は綺麗に収まっているように見えます。
ボリジャーバンドは「順張り」「逆張り」の投資に利用できます。
株価がボリジャーバンドの下限付近にあれば「買い」、上限付近にあれば「売り」のタイミングの指標となります。

関連記事
1 【Python】株価分析・予測
2 【Pandas入門】データ分析のサンプル集
3 Python入門 サンプル集
関連記事