ボリンジャー・バンド(Bollinger Band)

 

概要
図1 ボリンジャーバンド

ボリンジャーバンド(Bollinger Band)は1980年代前半にジョン・ボリンジャー氏が考案した指標で、図1に示すように中央の単純移動平均線(SMA)の上下にこれまでの値動きから統計的に計算した線(バンド)を引いたものです。中央のSMAに対して相場(レート)の動きが小さい場合は落ち着いた相場ということが出来ます。逆に、SMAからレートが大きく離れるような値上がりや値下がりは統計的には異常値と考えます。売買トレンドとはこのようなSMAから外れた異常値が続き、やがてトレンドの終息と共にレートはSMAへ帰着すると考えます。ボリンジャーバンドはレートが異常値を示したときをトレンドの開始点、終わった時をトレンドの終了点と捉え、売買を行うタイミングを予想する順張りのトレンド系のテクニカル指標です。

計算方法(日足の場合)

バンドの計算には正規分布と標準偏差という統計学ではよく知られた考え方を使用します。日足の場合、レートは20日(n=20)のSMA(20)を中央値とした正規分布に従うと考え、正規分布の標準偏差σを考えると

$$ \rm{} SMA(n)が正規分布なら \\ \pm1\sigma以内でレートが動く確率:68.27% \\ \pm2\sigma以内でレートが動く確率:95.45% \\ \pm3\sigma以内でレートが動く確率:99.73% \\ $$

となります。レートは標準偏差で定義されるバンドの範囲内に入ると考えることが出来ます。つまり、ほとんどのレートの変動はSMAから2σ以内に入り、SMAから2σ外れるようなレートの変動は確率的には4.55%しか起きない異常な値と考えることが出来ます。この様な異常値は短期しか継続せずやがてSMAの中央値へ戻っていくと考えますが、SMAから+2σ離れた場合、相場は強い上昇トレンドにあり、-2σ離れた場合は相場が強い下降トレンドにあると考えます。以下が計算式となります。

$$ \rm{} 価格をPとする \\ 中央のバンド:単純移動平均線(\rm{SMA})、\rm{SMA}(n) =(\sum_i^n P_i )/n \\ 標準偏差σ:ボラティリティにあたる \\ \sigma=\sqrt{\sum_𝑖^n(P_i – \bar{P})^2}/\sqrt{n -1} \\ \bar{P}はSMA(n)とする\\ 上部バンド1:\rm{SMA}(n)+1\sigma \\ 上部バンド2:\rm{SMA}(n)+2\sigma \\ 上部バンド3:\rm{SMA}(n)+3\sigma \\ 下部バンド1:\rm{SMA}(n)−1\sigma \\ 下部バンド2:\rm{SMA}(n)−2\sigma \\ 下部バンド3:\rm{SMA}(n)−3\sigma \\ $$

ボリンジャーバンドは中央線(SMA)とその上下にある±1σライン、±2σライン、±3σラインを引く形で描画します。通常は図2のように2σラインまでを使用します。

図2 ボリンジャーバンド(2σまで)
Pythonによる実装

必要なライブラリを読み込みます

!pip install mpl_finance #Collaboratoryに入っていないライブラリを読み込みます
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import mpl_finance
import sys
import numpy as np
from datetime import datetime
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import requests
import io

データをcsvファイルから読み込みます

#ファイルの読み込み
URL = "https://neulab.co.jp/wp-content/uploads/pseudo_data.csv" #csvファイルのURL

datafile = requests.get(URL)#ファイルの読み込み

#データフレームの作成
df_temp = pd.read_csv(io.BytesIO(datafile.content), header=0, index_col=0, parse_dates=True, encoding="UTF-8")

df = df_temp.loc[:,['Open','High','Low','Close']]
df.head()

ボリンジャーバンドの中心線とバンドを計算します

df_tp = df.loc[:,['High', 'Low', 'Close']].mean(axis='columns')
df_tp_sma = df_tp.rolling(20).mean()
df_tp_std = df_tp.rolling(20).std()

df_onesigma_up = df_tp_sma + df_tp_std
df_twosigma_up = df_tp_sma + 2*df_tp_std
df_threesigma_up = df_tp_sma + 3*df_tp_std

df_onesigma_down = df_tp_sma - df_tp_std
df_twosigma_down = df_tp_sma - 2*df_tp_std
df_threesigma_down = df_tp_sma - 3*df_tp_std

チャートへの描画と保存例です

canvas_color = '#fffafa'
line_color = '#c8ced1'
font_color = '#171510'
colorup = '#bf0000'
colordown = '#006fbf'

n_data = -100
data = df[n_data:]
ohlc = np.vstack((range(len(data)), data.T)).T

fig = plt.figure(figsize=(12, 8))
fig.patch.set_facecolor(canvas_color)

ax = fig.add_subplot(1, 1, 1)
ax.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax.plot(range(len(data)), df_tp_sma.values[n_data:] , color='black', ls='-', label='SMA(20)')
ax.plot(range(len(data)), df_onesigma_up.values[n_data:] , color='darkgrey', ls='-', label='$+1\sigma$')
ax.plot(range(len(data)), df_twosigma_up.values[n_data:] , color='darkorange', ls='-', label='$+2\sigma$')
ax.plot(range(len(data)), df_threesigma_up.values[n_data:] , color='magenta', ls='-', label='$+2\sigma$')
ax.plot(range(len(data)), df_onesigma_down.values[n_data:] , color='darkgrey', ls='-', label='$-1\sigma$')
ax.plot(range(len(data)), df_twosigma_up.values[n_data:] , color='darkorange', ls='-', label='$+2\sigma$')
ax.plot(range(len(data)), df_threesigma_up.values[n_data:] , color='magenta', ls='-', label='$+2\sigma$')
ax.grid()

#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #ロゴファイルのURL
img_c = plt.imread(logoURL)
imagebox = OffsetImage(img_c, zoom=0.020) #画像をimageboxにいれる。
imagebox.image.axes = ax
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 9950), xycoords="data", boxcoords="data", pad=0.3, frameon=False)

l1,l2 = ax.get_legend_handles_labels()
ax.legend(l1,l2, loc='upper right', fontsize=14, edgecolor='none', facecolor=canvas_color)

ax.set_ylabel("Price of Something", fontsize=22)
ax.set_ylim(9000., 10050.)
ax.yaxis.tick_right()
ax.yaxis.set_label_coords(0, 0.5)
ax.tick_params(labelsize=24, labelcolor=font_color, color=line_color)

ax.spines['left'].set_linewidth(0)
ax.spines['right'].set_linewidth(0)
ax.spines['top'].set_linewidth(0)
ax.spines['bottom'].set_linewidth(0)

xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_tp.index][xtick0::12])

plt.subplots_adjust(left=0.03, right=0.92, bottom=0.1, top=0.99)
plt.grid(which='major',color=line_color,linestyle='-')
plt.grid(which='minor',color=line_color,linestyle='-')

ax.set_axisbelow(True)

plt.savefig('Bollinger.png')

以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。

リンクはこちら

ボリンジャーバンドの基本的な使い方

ボリンジャーバンドの中央値はSMAなので、上昇トレンドにあるときはレートは移動平均線の+側に、下降トレンドにあるときは-側に並びます。また、+2σ線を抵抗線(レジスタンスライン)、-2σ線を支持線(サポートライン)と考えることも出来て、トレンドが発生した場合レートがこれらのラインをブレイクすると考えます。開発者のボリンジャーは、いわゆる、ボリンジャーブレイクアウトを使った順張りでの使い方を推奨しています。

ボリンジャーブレイクアウト

買いシグナル:レートが+2σ線を上抜けした場合、強い上昇トレンドが生まれたと考えて順張りの買いを行います。

売りシグナル:レートが-2σ線を下抜けした場合、強い下降トレンドが生まれたと考えて順張りの売りを行います。

<
図3 順張り手法

図3が順張りによる買いの例となります。強い買いトレンドが続行している場合、レートは+2σのバンドの上を動きます。強い買いトレンドの場合は+2σのバンドの上を動きます。これをバンドウォークと呼びます。やがてレートは+2σラインを超えた状態から中心線へ戻っていきますが、例えば、図3のように今までバンドウォークしていたレートが+2σ線を下抜きした時が決済タイミングと考えられます。

バンドの収縮と拡大

ボリンジャーバンドのバンド幅が狭くなった時は、値動きが小さくなり次のトレンド発生のために力を蓄えていると考え、バンド幅が広くなり始めた時を新しいトレンドの始まりと考えます。この時にレートが±2σラインを超えたら順張りでのエントリーを行うことが有効と言われています。

ボリンジャーバンドの幅が十分に広くなった場合、トレンドが十分に形成されていて売買が活発に行われていると考えます。次にバンド幅の収縮が始まったらトレンドの終わりと考えることが出来ます。

レンジ相場

トレンドが終わり、SMAの傾きが小さく売買の方向感がなくなった場合はレンジ相場です。この局面でのエントリーでは後述する逆張りの方法が有効と言われています。

逆張りの方法

逆張りで使う方法もあります。レートが±2σ線を超えた場合にトレンドが始まり±2σ以下に入った時がトレンドの終了点と通常考えますが、終了点をトレンドの転換点と捉えて、+2σ線を下抜けして中心線へ戻り始めた場合に売りで、-2σ線を上抜けして中心線に戻り始めた場合に買いで入る手法です。図4が逆張りによる売り買いの例となります。5か所のポイントがありますが、4か所目は-2σ線を上に離れても相場の下落が続く、いわゆるダマシとなります。

図4 逆張り手法
注意点

統計上、レートが正規分布に従う独立した変数であれば、現在のレートが±2σの範囲内に95.45%の確率で入るという前提は正しいですが、実際は価格間には関連性があり独立ではないことから正規分布とはならないため、必ずバンドの中に入ると考えることは間違った考え方となります。また、実際には±2σを超えるような場面は多く見られ(図4)、一部はダマシとなります。以上のことから、ボリンジャーバンドを過信することは禁物で、他のテクニカル指標と組み合わせてトレンド転換のタイミングを捉えることが必要です。


※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。


現在、ニューラボでは人工知能による取引アルゴリズムを開発中です。11月にリリース予定。乞うご期待!
自動取引にご興味を持たれましたら お問い合わせページよりお気軽にお問合せください。