非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】mplfinanceでボリンジャーバンドを描画してみた

   

Pythonの金融データ可視化ライブラリであるmplfinanceを使ってチャート上にボリンジャーバンドを描画する方法を解説します。ボリンジャーバンドは移動平均線と価格の変動幅を同時に確認できる便利な指標です。移動平均や標準偏差の計算からボリンジャーバンドデータを作成しローソク足チャート上に描画する方法を紹介します。

import pandas as pd
import mplfinance as mpf

# CSVファイルを読み込み、データフレームを作成
df = pd.read_csv('USDJPYDaily.csv')
# 日付をdatetime型に変換して、日時情報として認識させる
df['Date'] = pd.to_datetime(df['Date'])

# 日付をインデックスに設定(mplfinanceはインデックスが日時である必要がある)
df.set_index(keys='Date', inplace=True)
# データを日付順に並び替え(古いデータから新しいデータの順)
df.sort_values(by='Date', ascending=True, inplace=True)

# ボリンジャーバンドの計算
window = 20  # 移動平均線の期間(ここでは20日を設定)
# 移動平均線を計算して新しい列'SMA'に追加
df['SMA'] = df['Close'].rolling(window=window).mean()
# 標準偏差を計算して新しい列'StdDev'に追加
df['StdDev'] = df['Close'].rolling(window=window).std()
# ボリンジャーバンドの上部バンドを計算して新しい列'Upper'に追加
df['Upper'] = df['SMA'] + (2 * df['StdDev'])
# ボリンジャーバンドの下部バンドを計算して新しい列'Lower'に追加
df['Lower'] = df['SMA'] - (2 * df['StdDev'])

# ボリンジャーバンド計算時に発生するNaN行を削除
df = df.dropna()

# データ内容を確認(デバッグ用)
print(df)

# プロットするデータ数(最新のデータから100日分をプロット)
PLOT_DATA_COUNT = 100

# 最新100日分のデータを切り出し
last_100_df = df.tail(PLOT_DATA_COUNT)
# ボリンジャーバンドをプロットのオプションとして作成
add_plots = [
    mpf.make_addplot(last_100_df['Upper'], color='red', linestyle='dotted'),  # 上部バンド
    mpf.make_addplot(last_100_df['Lower'], color='red', linestyle='dotted'),  # 下部バンド
    mpf.make_addplot(last_100_df['SMA'], color='red', linestyle='dotted')  # 移動平均
]

# チャートのデザインを設定
my_style = mpf.make_mpf_style(
    base_mpf_style='yahoo',  # 'yahoo'スタイルをベースに設定
    marketcolors=mpf.make_marketcolors(
        up='red', down='darkblue', edge='inherit', wick='black', volume='inherit'  # ローソク足の色など
    ),
    facecolor='white',  # チャート背景色を白に設定
    gridcolor='lightgray',  # グリッド線の色
    gridstyle='--'  # グリッド線のスタイル(破線)
)

# ローソク足チャートを描画
mpf.plot(
    df.tail(PLOT_DATA_COUNT),  # 最新100日分のデータ
    type='candle',  # ローソク足チャート
    style=my_style,  # チャートスタイル
    addplot=add_plots,  # ボリンジャーバンドを追加プロット
    figratio=(10, 5)  # チャートのアスペクト比
)
 

 

 

実行結果がこちら。

 

 

スポンサーリンク

 - Python