ボリンジャーバンドに基づくトレンドフォロー戦略


作成日: 2024-01-15 14:31:21 最終変更日: 2024-01-15 14:31:21
コピー: 0 クリック数: 556
1
フォロー
1617
フォロワー

ボリンジャーバンドに基づくトレンドフォロー戦略

概要

この策略は, BollingerBands トレンド追跡策略と呼ばれています.これは,BollingerBands指数を使用して価格の傾向を判断し,価格がBollingerBands通路を破るときに入場し,多空を行う.これは,均線フィルターと組み合わせて,突破が発生したときにトレンドの方向を判断し,多空を行うことを決定します.

戦略原則

この戦略は,主に価格の傾向と位置入場点を判断するBollingerBands指標に依存している.BollingerBandsは3つの線で構成されています.

  1. 中央線:n日の移動平均
  2. 上線: 標準差のn日分の距離を上へ移動する
  3. 下線: 標準差のn日間の距離を 下に移動する

価格が下線から上線を突破すると,看板トレンドが形成されていると考えられる.価格が上線から下線を突破すると,下向きトレンドが形成されていると考えられる.この2つの突破が発生する際には,入場策は空調を余儀なくする.

具体的には,戦略の論理は次のとおりです.

  1. 閉店価格がBandsの下線から上線に突破すると,追加入場を行う.
  2. 閉店価格が上線から下線に突破すると,空白入場

偽のブレイクをフィルターするために,策略は平均線判断を加える. 閉盘価格がBandsを突破すると同時に平均線を突破した場合のみ,入場を誘発する.

平均線として指数関数移動平均を使用しています.

この戦略は,トレンドブレイクを以下のように判断します.

  1. 複数のシグナル: 閉盘価格がBands上線を突破 && 閉盘価格が平均線を突破
  2. 空気信号:閉店価格がBands下線を突破 &&閉店価格が平均線を突破する

入場後,ストップは中線を追跡する. 価格が中線に再触したとき,ストップを退出する.

優位分析

この戦略の利点は以下の通りです.

  1. 中央線突破によって形成される新しいトレンドを捉えることができる. 帯の通路は価格の変動を容認するスペースがあり,突破の通路は価格が新しい方向を形成し始めることを意味します.
  2. 均線フィルタリングと組み合わせることで,偽突破の問題を回避し,実際のトレンドの転換時に入場することを保証します.
  3. バンドの中央線に戻ったときにアクティブ・ストップする内置のストップメカニズムがあり,リスクを効果的に制御する.
  4. 策略論理はシンプルで明快で,容易に理解し,実装し,取引を量化するためのアルゴリズム策略である.
  5. バンドチャネルと均等線指標を利用して,価格を予測する必要なく,事後の証拠に基づいてトレンドを判断し,反測効果が優れている。

リスク分析

この戦略には利点があるものの,以下のリスクがあります.

  1. Bandsのパラメータを正しく設定しない場合,取引頻度や取引リスクが増加する可能性があります.パラメータが過度に敏感である場合,大量に偽突破が発生し,システムが頻繁にポジションを開く可能性があります.
  2. 平均線パラメータの不適切な選択は,真のトレンドを逃すか,偽信号を生成する可能性がある.パラメータの設定は,繰り返しテストと最適化を必要とする.
  3. ストップ・ロスは中線に依存し,早めに出場したり,価格に余分な調整スペースを与えることもあります.これは,利益のほとんどを逃したり,損失のリスクを増加させることもあります.

上記のリスクを制御するために,以下の方法で最適化できます.

  1. バンドのパラメータを適切に調整し,通路幅を増やし,偽突破の確率を減らす
  2. 平均線の種類や長さをテストして,最適な組み合わせを決定します.
  3. トレンドフォローストップやストップを段階的に移動するなど,他のストップ方法を試す

最適化の方向

上記のリスク分析から,この戦略は以下のような点でさらに最適化できます.

  1. パラメータ最適化: 遺伝的アルゴリズムなどのより体系的な方法によって,バンドと平均線パラメータの最適な組み合わせを探し,戦略をより安定的かつ収益性のあるものにする.

  2. ストップ・ロスト・最適化:ATR停止,追跡停止などのさまざまな停止方法をテストし,最適な停止機構を決定する.

  3. フィルター最適化:RSI,KDなどの他の指標を追加のフィルタリング条件として加え,偽信号の確率を下げ,利率を向上させる.

  4. 入学条件の最適化: トレンド判断,異動VOLUMEなどの他の考量要素を追加し,入場タイミングを厳密に選択し,不要なポジション開設を減らす.

  5. 機械学習詳細な歴史データを収集し,LSTM,RNNなどのディープラーニングモデルを使ってモデル化し,AIを使って最高の入場・出場地点を判断する.

  6. リスクと利益の動態の管理固定比率のストップ・ストップ・損失,利益目標の後にストップ・ストップ幅を増やす方法,リスクと利益のダイナミックな管理.

上記のいくつかの側面を最適化することで,戦略の安定性,収益率,リスク調整能力などの指標を全面的に向上させ,実物取引のためのアルゴリズム戦略にすることができます.

要約する

総じて,このBollingerBandsトレンドトラッキング戦略は,Bands指標と均線判断価格トレンドを利用し,重要な点位突破時に参入し,トレンドトラッキングタイプの戦略である.判断が明確で,論理が簡潔で,実行しやすいなどの優位性があり,パラメータ最適化,止損方法などの最適化方法もある.パラメータ設定をさらに調整し,止損機構を最適化し,機械学習などのモデルに加入することで,空間を安定させ,信頼性の高い量化戦略にすることができる.

ストラテジーソースコード
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================