ノロのボリンジャー・トラッキング戦略

作者: リン・ハーンチャオチャン,日付: 2023-11-28 16:57:28
タグ:

img

概要

これはボリンジャー・バンドをベースとしたモメント・トラッキング戦略である.ボリンジャー・バンドを組み合わせて市場の動向と逆転点を判断し,市場の変動を追跡するためにロングとショートポジションを設定する.

原則

この戦略のコア指標は,中帯,上帯,下帯からなるボリンジャーバンドである.中帯はn日の移動平均であり,上帯と下帯は中帯プラス/マイナス標準偏差のオフセットである.価格が上帯/下帯に近づくと,過剰購入/過剰売却の信号とみなされる.この戦略は,トレンド偏差をオープニングポジションの基礎として組み込む.つまり,価格が真逆の方向に中帯を突破したときのオープニングポジションである.偽ブレイクによって引き起こされる損失を防ぐために,戦略はブレイクアウトの幅が平均よりも大きいことを要求する.閉じる条件は,価格が中帯を突破した後,戻るということです.

この戦略には,異なる取引機会に対応するトレンドフォローエントリと平均逆転エントリの両方が組み込まれています.トレンドフォローエントリには,中間帯がサポート/レジスタンス基準であり,デバイアンスブレイクアウトを形成する必要があります.平均逆転エントリは,上下ボリンジャー帯の近くで直接逆転します.この戦略は,これらの2種類の信号を組み合わせ,トレンドトラッキングと逆転操作の両方を行うことができます.

利点分析

この戦略は,ボリンジャーバンドの過剰購入/過剰売却特性を逆転点判断と組み合わせます.これは,トレンドとレンジングの両方の市場に適用され,さまざまなタイプの取引機会を把握することを可能にします.ストップロスの出口設定は損失の拡大を防ぐことができます.また,ロングとショートの両方を取引する能力は,戦略の適用性を向上させます.

シンプルなボリンジャー戦略と比較して,追加のトレンドロジックは,この戦略のエントリをより安定させ,逆転機会を捉える.これは信号対ノイズ比率を改善する.また,両方向の取引は,異なる市場状況で取引機会をより完全に利用する.

リスク分析

この戦略は主にボリンジャーバンドの過買い/過売特性に依存する.したがって,極端な価格変動があるとき,ボリンジャーバンドの幅は拡大し続け,複数の損失の取引に容易に繋がる.これは潜在的なリスクポイントである.さらに,逆転判断には依然としていくつかの不確実性とエラーがあり,失敗したエントリーやストップを引き起こす.

ボリンジャーバンドの失敗に対して,バンドをより敏感にするためにパラメータnを短縮したり,損失の確率を下げるためにバンド幅を短縮したりできます.逆転曲線判断については,ブレイアウトのパラメータを最適化することでエラーを減らすことができます.

オプティマイゼーションの方向性

この戦略を最適化するための主な方向は以下の通りである.

  1. ボリンジャー帯のパラメータは,最適な組み合わせを見つけるために,異なる市場に応じて調整できます.
  2. 偏差の大きさと平均値の計算は,他のオプションで試験することができる.
  3. 入力信号を判断し 偽陽性値を減らすために フィルターを追加します
  4. 他のストップ・ロスト・メソッドをテストします 例えばトライル・ストップ・ロスト
  5. パラメータは特定の製品や時間枠に最適化できます.

結論

この戦略は,標準ボリンジャー戦略に効果的な拡張と最適化を行います. 追加されたトレンド偏差は安定性を向上させ,逆転機会をうまく利用します. 両方向の取引とストップ損失の能力も戦略をより堅牢にします. パラメータ最適化やより多くのフィルターを追加することによってさらなる改善を達成できます.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.3", shorttitle = "Bollinger str 1.3", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")

length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length")
mult = input(2.0, defval = 2.0, minval = 0.001, maxval = 50, title = "Bollinger Mult")
source = input(ohlc4, defval = ohlc4, title = "Bollinger Source")

uset = input(true, defval = true, title = "Use trend entry")
usect = input(true, defval = true, title = "Use counter-trend entry")

fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
showbands = input(true, defval = true, title = "Show Bollinger Bands")

//Bollinger Bands
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Lines
col = showbands ? black : na 
plot(upper, linewidth = 1, color = col)
plot(basis, linewidth = 1, color = col)
plot(lower, linewidth = 1, color = col)

//Body
body = abs(close - open)
abody = ema(body, 30)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0 
up1 = bar == -1 and ohlc4 >= basis and ohlc4 < upper and (close < strategy.position_avg_price or strategy.position_size == 0) and uset
dn1 = bar == 1 and ohlc4 <= basis and ohlc4 > lower and (close > strategy.position_avg_price or strategy.position_size == 0) and uset
up2 = close <= lower and usect
dn2 = close >= upper and usect
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

もっと