【Python】TA-Libによるボリンジャーバンドの取得・描画

3月 30, 2021

今回は,テクニカル指標であるボリンジャーバンド(Bollinger Bands)をPythonライブラリTA-Libで計算し,描画する方法を紹介します.

本記事のコードを実行することで,以下のような結果が得られます.

ボリンジャーバンドについての説明は,ボリンジャーバンドとは?テクニカル分析には欠かせない基礎指標ですを参考にしてください.

各ライブラリのインストール

今回使用するライブラリは以下の通りです.

  • datatime
  • Numpy
  • matplotlib
  • pandas-datareader
  • TA-Lib

このうちTA-Lib以外のライブラリ(モジュール)はpipで簡単にインストールできます.pandas-datareaderの使い方についてはpandas datareaderをインストールして株価データを取得する方法【日本株・米国株】をご覧ください.

TA-Libのインストールはひと手間いるので,Windowsをお使いの場合はTA-LibをWindowsにインストールする方法【Python】を,それ以外の環境をお使いの場合は各自お調べください.

TA-Libによるボリンジャーバンドの描画コード

2020/1/1~2021/3/1におけるS&P500のボリンジャーバンドを取得してみたいと思います.

コードと結果は以下の通りです.

import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import talib as ta

start = datetime.date(2020,1,1)
end = datetime.date(2021,3,1)

df = web.DataReader('^GSPC', 'yahoo', start, end) #get data

close = df['Close']

#Bollinger Bands
upper1, middle,lower1 = ta.BBANDS(close, timeperiod=25, nbdevup=1, nbdevdn=1, matype=0)
upper2, middle, lower2 = ta.BBANDS(close, timeperiod=25, nbdevup=2, nbdevdn=2, matype=0)
upper3, middle, lower3 = ta.BBANDS(close, timeperiod=25, nbdevup=3, nbdevdn=3, matype=0)

plt.plot(close,label='price',color='k')
plt.plot(upper1,label='upper1',color='b')
plt.plot(lower1,label='lower1',color='b')
plt.plot(upper2,label='upper2',color='g')
plt.plot(lower2,label='lower2',color='g')
plt.plot(upper3,label='upper3',color='r')
plt.plot(lower3,label='lower3',color='r')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

実行結果

コード解説

株価データ取得

株価は,pandas_datareaderで取得します.もちろんウェブやローカルにあるCSVファイルを読み込んでデータを取得しても構いません.

start = datetime.date(2020,1,1)
end = datetime.date(2021,3,1)

df = web.DataReader('^GSPC', 'yahoo', start, end) #get data

今回は,S&P500の株価データを取得しています.

pandas-datareaderの詳しい使い方についてはpandas datareaderをインストールして株価データを取得する方法【日本株・米国株】をご覧ください.

pandas-datareaderで取得したデータは以下のように,High(高値),Low(低値),Open(始値),Close(終値),Volume(出来高),Adj Close(調整後終値)を持つDataFarameとなっています.

                   High          Low         Open        Close      Volume    Adj Close
Date
2019-12-31  3231.719971  3212.030029  3215.179932  3230.780029  2893810000  3230.780029
2020-01-02  3258.139893  3235.530029  3244.669922  3257.850098  3458250000  3257.850098
2020-01-03  3246.149902  3222.340088  3226.360107  3234.850098  3461290000  3234.850098
2020-01-06  3246.840088  3214.639893  3217.550049  3246.280029  3674070000  3246.280029
2020-01-07  3244.909912  3232.429932  3241.860107  3237.179932  3420380000  3237.179932
...                 ...          ...          ...          ...         ...          ...
2021-02-23  3895.979980  3805.590088  3857.070068  3881.370117  6280650000  3881.370117
2021-02-24  3928.649902  3859.600098  3873.709961  3925.429932  5942350000  3925.429932
2021-02-25  3925.020020  3814.040039  3915.800049  3829.340088  6513060000  3829.340088
2021-02-26  3861.080078  3789.540039  3839.659912  3811.149902  6512950000  3811.149902
2021-03-01  3914.500000  3842.510010  3842.510010  3901.820068  5071540000  3901.820068

ボリンジャーバンドに必要なデータ

pandas-datareaderで取得したデータのうち,ボリンジャーバンドの計算に必要なデータは,終値(Close)だけです.dfの’Close’の列だけをcloseとして取り出します.

close = df['Close']

TA-Libでボリンジャーバンドを計算

TA-Libでは,以下のコードだけでボリンジャーバンドを得ることができます.

#Bollinger Bands
upper1, middle,lower1 = ta.BBANDS(close, timeperiod=25, nbdevup=1, nbdevdn=1, matype=0)
upper2, middle, lower2 = ta.BBANDS(close, timeperiod=25, nbdevup=2, nbdevdn=2, matype=0)
upper3, middle, lower3 = ta.BBANDS(close, timeperiod=25, nbdevup=3, nbdevdn=3, matype=0)

upper1,lower1が±σのボリンジャーバンド,upper2,lower2が±2σのボリンジャーバンド,upper3,lower3が±3σのボリンジャーバンドです.

最後に,これらをグラフにプロットして完了です.ただし,株価(close)も同時にプロットしています.

plt.plot(close,label='price',color='k')
plt.plot(upper1,label='upper1',color='b')
plt.plot(lower1,label='lower1',color='b')
plt.plot(upper2,label='upper2',color='g')
plt.plot(lower2,label='lower2',color='g')
plt.plot(upper3,label='upper3',color='r')
plt.plot(lower3,label='lower3',color='r')
plt.xlabel('date')
plt.ylabel('price')
plt.legend()
plt.show()

コロナショックでも,ボリンジャーバンド内に株価が収まってますね.