ボリンジャーバンドの使い方と計算式、Pythonでボリンジャーバンドを書いてみる
こんにちは、新米データサイエンティスト(@algon_fx)です。今日もしっかり7.0km走れて大満足です。朝は本業の方でk-nearest-neighborsと戯れていました。
さて、今日も特徴量としてのテクニカル指標シリーズとして、テクニカル指標の定番中の定番、「ボリンジャーバンド」についてまとめます。
ボリンジャーバンドの使い方、計算方法、さらにPythonとPandasを使ってボリンジャーバンドの計算処理をやってみます。定番の指標なだけあって(?)、計算式もめっちゃシンプルで簡単でした。
【人気記事】
ボリンジャーバンドとは?
1980年前半にボリンジャーさんが公表したのが「ボリンジャーバンド」です。テクニカル指標として人気は非常に高く、初心者から上級者までこよなく使われている指標の一つです。
ボリンジャーバンドですが、統計の「標準偏差」と「正規分布」の考え方に基づいた指標です。
標準偏差とは、データの散らばり具合を表す統計指標で、統計の正規分布の考え方で「±1標準偏差の中に収まる確率は68.25%」「±2標準偏差の中は95.44%」「±3標準偏差の中は99.73%」と言う、「68-95-99ルール」があります。
ボリンジャーバンドは、所定の期間の為替レートの平均値と標準偏差を計算して、正規分布の性質である「68-95-99ルール」を使ったテクニカル指標って訳ですね。
ボリンジャーバンドの計算方法
上で説明した通り、ボリンジャーバンドは標準偏差と正規分布で構成されます。また所定の期間を設定する訳ですが、一般的に20日間が使われることが多いようです。
下記がボリンジャーバンドの計算方法ですが、数学が苦手な方は飛ばして問題ないです。実際にNumpyで書けば np.std() で計算可能ですし(笑)
では、まずは標準偏差=σ(シグマと読む)の計算方法から。標準偏差は標本標準偏差を使うようです。下の式で、Nが期間(一般的に20日)、期間中の全ての為替レートで「現在のレート – 期間中の平均レート」を引いて二乗したものの総和を「期間 – 1日」で引いたものの平方根です。
で、正規分布の68-95-99ルールを使う訳なので、1σ〜3σまで算出してあげる訳です。先に説明した通り、1σとは平均から標準偏差1個分離れていて、正規分布の性質上、約68%の確率でそのレンジに収まると言う意味です。
上記の式で標準偏差を計算してあげて、単純に1〜3と、-1〜-3を標準偏差に掛けてあげるだけで、ボリンジャーバンドに必要な指標は全て揃います。
ボリンジャーバンドの使い方
ボリンジャーバンドですが、主に2つの使い方があります。一つ目は、為替レートがボリンジャーバンドに対して、どの位置にあるのか?二つ目はボリンジャーバンドがどれくらい広いor狭いのか?です。
実際のチャートを見て考えて見ましょう。
下のチャートですが、ドル円の1分足のチャートで、ボリンジャーバンドの設定期間は20分、外側のバンドが3σ(平均から標準偏差3つ離れている)、内側のバンドが2σ(平均から標準偏差2つ離れている)、真ん中の赤いラインが20分の中央値(つまり20分間の平均)です。
ボリンジャーバンドの使い方は非常に単純です。統計学で考えたら、為替のレートはバンド内にあるべきで、もしバンドの外に出たら、またバンドの中に戻る可能性が高いよ!って使い方をする訳です。
左側の赤矢印に注目して見ましょう。1分足の下のひげ部分が2σのバンドを超えていますよね?統計上それはおかしい!こりゃ中央線(赤い線)の方向へレートが戻る可能性高いで!って訳で買いのサインってことですね。
逆に右側の赤矢印を見てください。今回はローソク足自体が2σを超えてしまってますよね?つまり、統計で考えたらレートが高い確率で下がるよ!今が売るタイミングだ!って訳です。
では、この初心者からプロトレーダー御用達のボリンジャーバンドをPythonで描いてみましょう。
ボリンジャーバンドをPythonで計算してみる
今日は、ドル円のティックデータを1分足にしたデータを使いましょう。ドル円の為替データの取得方法、Pandasを使ってティックから1分足に変換する方法はこちらの記事を参照してください。(5分くらいですぐにできます)
では、本題のボリンジャーバンドを計算してみましょう。まずは、ライブラリのインポート。
1 2 3 4 5 6 7 8 9 10 11 |
#ライブラリ import pandas as pd import numpy as np import time import seaborn as sns import matplotlib.pyplot as plt import datetime %matplotlib qt |
次にドル円のTickデータを1分足へ、1週分のデータを100分へ切り分けてあげましょう。あと、欠損値も埋めてあげます。 USD_JPY_Week2.csv はこちらの記事で取得方法まとめてます。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 為替レートのCSV読み込んで簡単な前処理してあげる df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) df.index = pd.to_datetime(df.index) del df['Tid'] del df['Dealable'] del df['Pair'] min_1 = df.resample('1Min', how='ohlc') buy_1min = min_1.xs('Buy', axis=1, drop_level=True) buy_1min_s = buy_1min[0:100] buy_1min_s = buy_1min_s.fillna(method='ffill') |
これで為替レートのデータセットはOKですね。念のため、データフレームの最初の5行を確認して見ましょう。
1 2 3 4 |
# 1分毎の為替レートのデータフレーム buy_1min_s.head() |
では、ボリンジャーバンドの計算をしてあげましょう。今回は rolling(window=20) として20分を期間として使いました。
あとは単純にNumpyの mean() で20分毎の平均値、 std() で20分毎の標準偏差を計算するだけです。
20分毎の平均と標準偏差が揃ったら、あとは2σラインの値を作ってあげましょう。下のコードを見ても分かる通りbband[‘std’] * 2としてます。単純にこの掛ける数字を1や3に変更するだけで1σ、3σも計算可能です。
1 2 3 4 5 6 7 8 9 |
# ボリンジャーバンドの計算 bband = pd.DataFrame() bband['close'] = buy_1min_s['close'] bband['mean'] = buy_1min_s['close'].rolling(window=20).mean() bband['std'] = buy_1min_s['close'].rolling(window=20).std() bband['upper'] = bband['mean'] + (bband['std'] * 2) bband['lower'] = bband['mean'] - (bband['std'] * 2) |
では、確認してみましょう。
1 2 3 4 |
# ボリンジャーバンドのデータフレーム確認 bband[18:25] |
ちゃんと計算されていますね!一目均衡表は手こずりましたが…ボリンジャーバンドはめっちゃ処理が簡単です(笑)
では、ボリンジャーバンドをMatplotlibでプロッティングして見ましょう。データブレームに標準偏差が入っているので、それ以外をプロットする必要があります。標準偏差はボリンジャーバンドの計算で使っただけなので。
1 2 3 4 5 6 7 |
# Matplotlibでボリンジャーバンドを表示(超簡易版) bband[['close', 'mean', 'upper', 'lower']].plot() plt.title('20 Bollinger Band') plt.ylabel('USD/JPY') plt.show() |
見辛いですが青が為替レート、緑が2シグマライン、赤-2シグマラインです。赤丸のポイントを見てみると、レート(青)が2シグマライン(緑)を超えて下降トレンドへ転換していますね。
まとめと次の課題
今日はボリンジャーバンドの使い方と計算式、Pandas + Numpy + Matplotlibを使ってボリンジャーバンドを書いてみました。
統計の初歩的な知識がないと計算方法などは少し判りづらいですが、単純に為替レートがボリンジャーバンドの外側に出たら、内側に戻ってくる可能性が高いよ!ってことですね。
特徴量としては、いささか微妙な感じですが…まぁ何事も知識として知っておいて損では無いですよね(笑)。他にも機械学習の特徴量として使えそうなテクニカル指標をまとめていますので、興味がある方は下のページをご覧ください。
以上です!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
Thanks Goodjob
ボリンジャーバンドはおもろいですね
正規分布にはしょっく
一連の処理系化するとMORE BETER
うちは盗聴されてるのでこのへんで