【Python】TA-Libでテクニカル指標計算 Part 2. ボリンジャーバンドの描画


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

・[【Python】TA-Libでテクニカル指標計算 Part 1. RSIの描画](https://qiita.com/Fujinoinvestor/items/852a19fd1a787b31371f)
・[【Python】TA-Libでテクニカル指標計算 Part 2. ボリンジャーバンドの描画](https://qiita.com/Fujinoinvestor/items/7eb56f8de0e90b3406e9)
・[【Python】TA-Libでテクニカル指標計算 Part 3. SMA（単純移動平均線）の描画]
(https://qiita.com/Fujinoinvestor/items/49dc284279c7e9217c30)
・[【Python】TA-Libでテクニカル指標計算 Part 4. MACDの描画](https://qiita.com/Fujinoinvestor/items/9314c404f591f8df53d4)


#TA-Libのインストール

以前の記事

https://qiita.com/Fujinoinvestor/items/405c292cb262d8ca27bf

をご覧ください．

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

##各ライブラリインポート
```python
import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import talib as ta
```

##株価データ取得
今回は，2020/1/1~2021/3/1におけるS&P500のボリンジャーバンドを取得してみたいと思います．

株価は，pandas_datareaderで取得します．もちろんウェブやローカルにあるCSVファイルを読み込むなどでも構いません．

```python
start = datetime.date(2020,1,1)
end = datetime.date(2021,3,1)
df = web.DataReader('^GSPC', 'yahoo', start, end) #get data
```

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として取り出します（他のカラムでも計算自体はできます）．

```python
close = df['Close']
```

##TA-Libでボリンジャーバンドを計算
```python
#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)
```

##描画
```python
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()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298289/fda6e696-aa0c-4cd1-c701-a386ed95b53f.png)


#まとめコード
```python
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()
```

もう少しだけ丁寧な解説を以下の記事で行っています．

https://optrip.xyz/?p=2596