📝 概要
今回は、TradingViewのPine Scriptで作成した Bollinger Bands Strategy(1Bb) を紹介します。
この戦略は、ボリンジャーバンドの上下バンドを利用した、シンプルな平均回帰型ストラテジーです。価格がバンドの外側まで行き過ぎたところで逆張りし、反対側のバンドまで戻る動きを狙います。
基本的な売買ルールは次の通りです。
- 終値が下側バンドを下回ったらロング
- 終値が上側バンドを上回ったらロング決済
- 終値が上側バンドを上回ったらショート
- 終値が下側バンドを下回ったらショート決済
デフォルトでは、12期間SMAと標準偏差2倍(±2σ) のボリンジャーバンドを使っています。
一般的なボリンジャーバンド逆張りでは、ミドルバンドまでの回帰を狙うことも多いですが、この戦略は少し違います。下側バンドで買って上側バンドまで、上側バンドで売って下側バンドまで と、バンド全体を横断する動きを狙います。
また、ショート側にはミドルバンドの下抜けを確認した後、再び上側バンドまで戻った場合に追加ショートを試みるロジックも組み込まれています。
💻️ バックテスト
CADCHF

CHFJPY

EURAUD

GBPCHF

EURJPY

🎯 作成の意図
ボリンジャーバンドを使った戦略で最もシンプルな発想のひとつが、「価格が行き過ぎたら、いずれ平均方向へ戻るのではないか」 という平均回帰です。
たとえば、価格が下側バンドを大きく割り込んだ場合、直近の値動きと比較して売りが強く出ていると考えられます。そこで短期的な売られすぎを想定してロングします。
反対に、価格が上側バンドを超えた場合は、買われすぎによる反落を期待してショートします。
ただし、この戦略の特徴は、平均線まで戻ったところですぐに決済しないことです。ロングなら上側バンド、ショートなら下側バンドまで保有します。
つまり、単なる平均線への回帰ではなく、バンドの一方から反対側までの大きな価格変動を狙う 設計です。
当然、強いトレンドが発生すると、価格がバンドに沿って動き続ける「バンドウォーク」が起こることもあります。そうなると逆張りポジションは大きな含み損を抱える可能性があります。
このコードには固定幅の損切りもありません。そのため、レンジ相場では機能しても、強いトレンド相場では苦戦する可能性があります。
だからこそ、銘柄や時間足を変えてバックテストし、ボリンジャーバンドの外側への行き過ぎに、本当に平均回帰のエッジがあるのか を検証したいところです。
📘 コード(戦略部分)の解説
まず、ロングのエントリー条件はこちらです。
if isBelowLowerBand and not entryActive and inBacktestWindow
strategy.entry("BB_Long", strategy.long, qty=strategy.initial_capital)
entryActive := true
終値が下側バンドを下回り、エントリー管理フラグがオフであればロングします。下方向への行き過ぎを狙った、シンプルな逆張りです。
ロングの決済条件はこちらです。
if isAboveUpperBand
strategy.close("BB_Long")
strategy.close("BB_Long")
entryActive := false
basisCrossed := false
upperBandExceeded := false
終値が上側バンドを上回ったらロングを決済します。ミドルバンドではなく反対側のバンドまで保有するため、比較的大きな反発を狙う設計です。
次に、ショートのエントリー条件です。
if isAboveUpperBand and not entryActive and inBacktestWindow
strategy.entry("BB_Short", strategy.short, qty=strategy.initial_capital)
entryActive := true
こちらはロングの逆で、終値が上側バンドを上回ったところでショートします。ロング決済後、条件がそろっていればそのままショート方向に切り替わります。
ショートの決済条件もシンプルです。
if isBelowLowerBand
strategy.close("BB_Short")
strategy.close("BB_Short2")
entryActive := false
basisCrossed := false
upperBandExceeded := false
終値が下側バンドを下回ると、ショートポジションを決済します。
つまり、基本的には 下側バンドで買い、上側バンドで売る。そして上側バンドでショートし、下側バンドで買い戻す という往復型の戦略です。
さらに、ショート側には追加エントリーの仕組みがあります。
if ta.crossunder(close, bbBasis) and entryActive and not lowerBandExceeded
basisCrossed := true
ショート保有中に終値がミドルバンドを下抜けたことを記録し、その後、価格が再び上側バンドを上回った場合に追加ショートを試みます。
if isAboveUpperBand and entryActive and basisCrossed and not lowerBandExceeded and close > strategy.position_avg_price * shortReentryPriceMultiplier and inBacktestWindow
strategy.entry("BB_Short2", strategy.short, qty=strategy.initial_capital)
basisCrossed := false
つまり、一度ミドルバンドまで下落した価格が再び上側バンドへ戻った場合に、もう一度売りを仕掛けようという考え方です。
ただし、現状のコードでは lowerBandExceeded が一度trueになるとリセットされないため、その後の追加ショートが制限されます。また、追加注文が実際に約定するかはピラミッディング設定にも依存します。この点はバックテストで確認しておきたいところです。
この Bollinger Bands Strategy(1Bb) は、ボリンジャーバンドの上下バンド間の平均回帰を狙う、かなりシンプルな逆張り戦略です。
ロングとショートの両方に対応し、ショート側には追加エントリー判定もあります。固定損切りがない点には注意が必要ですが、価格の行き過ぎと反発という、平均回帰の基本的な性質を検証するためのベース戦略 として使いやすいコードだと思います。
🔏 コアメンバー向けソース
こちらからどうぞ。


コメント