この記事ではPythonとビットコインの2014年分からの過去データを使ってボリンジャーバンドを引くための方法を解説します。
ボリンジャーバンドはご存知の人も少なくないと思いますが標準偏差(σ=シグマ)を加えた移動平均線のようなものです。
ボリンジャーバンドは移動平均線20日をベースに、+2σをレジスタンスラインに、-2σをサポートラインに見立てて線を引くことが多いです。
この記事では一般的な「移動平均線20日のライン」「+2σのライン」「-2σのライン」の3つを引いたチャートをPythonで引いてみることにします。

前回は移動平均線を【 Python 】ビットコインのテクニカル分析をプログラミングで行う方法という記事で引いてみました。この記事が難しそうな人はこちらから試してみることをお勧めします。
草猫店長の目次ノート
この記事での目標 ~Pythonを使ってボリンジャーバンドを描写する~

下は拡大図
このグラフを描写することを目標とします。使うエディターなどの指定はありませんが、上の図はVScodeエディターで実行して描写させています。
「 ブルーclose: 終値 」「 オレンジaverage20: 20日平均線 」「グリーンは+2σのライン」「レッドは-2σのライン」となっています。
やることを整理しましょう。

VSCodeの使い方とダウンロードはこちらのページ(ビットコイン板情報(価格)をPythonで取得する方法)を参考にしてほしいにゃあ。
ボリンジャーバンドを引く手順
今回の完成コードはこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() bolinger['close'] = df['Close'] bolinger['average20'] = bolinger['close'].rolling(window=20).mean() bolinger['std'] = bolinger['close'].rolling(window=20).std() bolinger['+2σ'] = bolinger['average20'] + (bolinger['std'] * 2) bolinger['-2σ'] = bolinger['average20'] - (bolinger['std'] * 2) print(bolinger['2019-02-01':'2019-08-01']) bolinger[['close', 'average20', '+2σ', '-2σ']].plot() plt.title('20Days Bollingers Band') plt.ylabel('BTC/USD') plt.show() |
①. ビットコインの過去データを読み込む
②. データを整える
③. 計算式を使って必要なデータを変数に格納する
④. ボリンジャーバンドのデータを描写する
主に4つの過程を順番に説明していきます。
①. ビットコインの過去データを読み込む
まずは手持ちのビットコインデータを使ってみましょう。
終値データと日時データの2つだけ使います。(日足で解説しています)
「ビットコインの過去データなんか持ってないよ」という人の方がおそらく多いと思います。
必要なデータとライブラリの準備のページにデータを貼っているので欲しい人はどうぞ。
こちらのデータを使って解説しています。
1 2 3 4 5 6 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") |
まずは必要なライブラリを読み込みます。
次にcsvデータを読み込みましょう。
1 2 3 4 5 6 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") |
「df = pd.read_csv(“./CoinbaseDayHistory.csv”, index_col=”DateTime”)」のオプションである「index_col=”DateTime”」は日付データのヘッダーの名前(列につけた名前)をデータの順番の基準(インデックス)にするオプションになります。
ちなみに元データはこのようになっています。

②. データを整える
必要なデータは「終値」「日付」だけです。不要な列は削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() |
delコマンドで読み込んだ元データの列である[‘Symbol’]、[‘Open’]、[‘High’]、[‘Low’]、[‘Volume BTC’]、[‘Volume USD’]を削除しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() |
bolinger = pd.DateFrame()でボリンジャーバンド用のデータセットを作っていきましょう。

③. 計算式を使って必要なデータを変数に格納する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() bolinger['close'] = df['Close'] bolinger['average20'] = bolinger['close'].rolling(window=20).mean() bolinger['std'] = bolinger['close'].rolling(window=20).std() bolinger['+2σ'] = bolinger['average20'] + (bolinger['std'] * 2) bolinger['-2σ'] = bolinger['average20'] - (bolinger['std'] * 2) |
bolinger[‘close’] = df[‘Close’]は元データの終値をbolingerに格納しています。
「rolling(window=20)」は20行分(20日分)の処理をしつつ「mean()」で平均値を算出しています。
「rolling(window=20)」の「std()」で標準偏差を算出します。
bolinger[‘+2σ’] = bolinger[‘average20’] + (bolinger[‘std’] * 2)
bolinger[‘-2σ’] = bolinger[‘average20’] – (bolinger[‘std’] * 2)
こちらは文字通り+2σと-2σの計算を行なって変数として格納しています。
④. ボリンジャーバンドのデータを描写する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() bolinger['close'] = df['Close'] bolinger['average20'] = bolinger['close'].rolling(window=20).mean() bolinger['std'] = bolinger['close'].rolling(window=20).std() bolinger['+2σ'] = bolinger['average20'] + (bolinger['std'] * 2) bolinger['-2σ'] = bolinger['average20'] - (bolinger['std'] * 2) print(bolinger['2019-02-01':'2019-08-01']) |
データを描写する前に正しく計算できていそうなのか中身を確認してみましょう。
「print(bolinger[‘2019-02-01′:’2019-08-01’])」でインデックスにした日付の範囲を指定して出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ python python_bolinger_band.py close average20 std +2σ -2σ DateTime 2019-02-01 3437.50 3541.5090 83.001403 3707.511806 3375.506194 2019-02-02 3468.43 3539.2185 84.413593 3708.045687 3370.391313 2019-02-03 3414.78 3526.7480 83.396402 3693.540804 3359.955196 2019-02-04 3409.57 3518.1885 86.295796 3690.780092 3345.596908 2019-02-05 3428.40 3509.1230 85.696664 3680.516329 3337.729671 ... ... ... ... ... ... 2019-07-28 9533.00 10485.4445 929.094792 12343.634084 8627.254916 2019-07-29 9495.01 10331.6395 813.017960 11957.675421 8705.603579 2019-07-30 9589.01 10206.1920 713.620673 11633.433346 8778.950654 2019-07-31 10087.30 10143.1070 661.114118 11465.335237 8820.878763 2019-08-01 10405.94 10073.3040 539.203687 11151.711373 8994.896627 [170 rows x 5 columns] |
うまくいっていることを確認できたら描写しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv("./CoinbaseDayHistory.csv", index_col="DateTime") del df['Symbol'] del df['Open'] del df['High'] del df['Low'] del df['Volume BTC'] del df['Volume USD'] bolinger = pd.DataFrame() bolinger['close'] = df['Close'] bolinger['average20'] = bolinger['close'].rolling(window=20).mean() bolinger['std'] = bolinger['close'].rolling(window=20).std() bolinger['+2σ'] = bolinger['average20'] + (bolinger['std'] * 2) bolinger['-2σ'] = bolinger['average20'] - (bolinger['std'] * 2) print(bolinger['2019-02-01':'2019-08-01']) bolinger[['close', 'average20', '+2σ', '-2σ']].plot() plt.title('20Days Bollingers Band') plt.ylabel('BTC/USD') plt.show() |
「bolinger[[‘close’, ‘average20’, ‘+2σ’, ‘-2σ’]].plot()」では列を4つ指定して「plot()」(レンダリング)させています。
「plt.title(’20Days Bollingers Band’)」でタイトル指定
「plt.ylabel(‘BTC/USD’)」でy軸のラベル指定
「plt.show()」でここまでのplotの内容で実際に描写します。下のようなグラフが描写されれば完成です。

ビットコイン過去データでボリンジャーバンドを引く方法 まとめ

「描写できたのはいいけれど、どうやって自動売買に活かせばいいのかわからない」
と悩む人も中にはいるかと。次はボリンジャーバンドを使って売買シミュレーションを行なってみたいと思います。
仮想通貨の自動売買でバックテストを行う方法( commin soon… )
ビットコイン過去データで移動平均線を引いてみる記事は【 Python 】ビットコインのテクニカル分析をプログラミングで行う方法という記事です。
この記事が難しかった人はこちらを実践してみると良いかと思います。
良かったらシェアしてね♪ /