アダプティブトレンドフォロー戦略は,ボリンジャーバンドと移動平均指標を組み合わせ,トレンド強度因子を動的に調整し,トレンドフォローとストップロスを達成するための定量的な取引戦略である.この戦略は,ボリンジャーバンドを使用して価格波動性を計算し,それによって合理的なトレンド強度を動的に計算する.その後,ATR指標を使用して適応トレンドチャネルをプロットして,上昇傾向と下落傾向を決定し,追跡する.同時に,戦略にはリスクを効果的に制御するためのストップロスのメカニズムが組み込まれている.
この戦略のコア指標はボリンジャーバンドです.ボリンジャーバンドは中帯,上帯,下帯で構成されています.中帯はn日間の単純な移動平均線,上帯は中帯+k*n日間の標準偏差線,下帯は中帯−k*n日間の標準偏差線です.ここで20日間の中帯と2倍標準偏差線を選択してボリンジャーバンドを構築します.
次に,中間帯比の帯域幅 (上帯 - 下帯) を計算し",強度因子"と呼ばれる.この比は現在の市場変動とトレンド強さを反映する.強度因子の最大値と最小値を設定して,大きすぎたり小さすぎたりしないようにする.
合理的な強度因数とATR指標を組み合わせると,上と下の帯はそれぞれATR*強度因数距離で上下移動し,適応トレンドチャネルを形成する.閉じる価格が上から上へと上線を突破したとき,ロング;上から下線を突破したとき,ショートする.
ストップ・ロスのメカニズムも設定します.ロングポジションが形成された後,価格がポジション開設時の最低点を下回る場合は,ストップ・ロスの出口;ショートポジションも同じです.
この戦略には以下の利点があります.
高い適応性.強度因子の計算方法により,戦略は市場の変動に基づいてチャネル幅を動的に調整し,上昇市場の傾向でチャネルを拡大し,振動する市場でチャネルを狭め,異なるタイプの市場に自己適応を達成することができます.
適度な運用頻度.単純な移動平均戦略と比較して,ボリンジャーバンド戦略は,不必要な頻繁なポジション開閉を回避し,チャンネルをより頻繁に調整します.
上下のレールの突破は,効果的に市場のノイズをフィルタリングし,トレンドの開拓を把握する高い確率を保証します.
ストップ・ロスのメカニズム.内蔵ストップ・ロスのメソッドは,単一の損失を効果的に制御できる.これはこの戦略の主要な利点です.
この戦略にはいくつかのリスクもあります:
高いパラメータ感度.ボリンジャー帯の周期nと倍数kは結果に大きな影響を与えるため,最適なパラメータ組み合わせを見つけるために繰り返しテストが必要である.
ボリンジャーバンドが異なるときにトレンドを追跡できない.価格が激しく変動すると,ボリンジャーバンドのレールは急速に拡大し,トレンドを追跡できない.戦略は再び実行する前にレールが収束するのを待って一時停止する必要があります.
時折の誤った信号.ボリンジャー・バンドの戦略は完璧ではありません.また,一定の量の誤った信号が生成され,それに対応する損失を負担する必要があります.
比較的簡単なストップ・ロース・メソッド.この戦略のストップ・ロスは,波動性などに基づくより複雑なストップ・ロース・メソッドを組み込むことなく,ポジションを開いた後の最高値と最低値のみを考慮する.これは攻撃的すぎたり保守的になり,最適化が必要である.
この戦略は,次の側面において最適化する必要があります.
異なる通貨とサイクルのパラメータの影響をテストする.戦略のパラメータは,戦略の適応性を向上させるために,異なる通貨とサイクルのために最適化することができます.
ストップ・ロスのメカニズムを最適化する.ストップ・ロスの移動,ストップ・ロスの振動,ストップ・ロスの追尾など,ストップ・ロスの方法をよりスマートにするために導入することができる.
入力シグナルをフィルタリングするために他の指標を組み込む.横向きに振動する市場でボリンジャーバンドからの誤った信号を避けるために,MACD,KDJなどの指標を追加することができます.
ポジション管理メカニズムを追加する.戦略の収益性を向上させるために,ストップ・プロフィートの追跡,ピラミッド取引,固定比率ポジションなど管理方法を実装する.
バックテストの最適化を行う. バックテストのタイムフレームを拡大し,パラメータを調整し,バックテストレポートを分析し,最適なパラメータを見つけるために戦略結果を包括的に調べる.
一般的に,適応トレンドフォロー戦略はかなり成熟した定量戦略である.トレンドを動的に捕捉するためにボリンジャーバンドを使用し,ATR指標と組み合わせて,長期および短期トレンドを判断するための適応チャネルを構築する.一方,リスクを管理するためのストップ・ロスのメカニズムが組み込まれている.この戦略の利点は適切な運用頻度,正確なエントリータイミング,良質なリスク制御である.しかし,パラメータ選択,ストップ・ロスの方法,戦略をより堅牢かつスマートにするためにシグナルフィルタリングなどの分野で最適化が必要な問題がある.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true) Pd=input(2, minval=1,maxval = 100, title="Period") Bw=input(50, minval=1,maxval = 100, title="Bandwidth") minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor") maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor") plot_trend=input(true, title="Plot trend") plot_losscut = input(true, title="Plot losscut") /////////////// Calculate the BB's /////////////// basisBB = ema(close, 20) devBB = 2 * stdev(close, 20) upperBB = basisBB + devBB lowerBB = basisBB - devBB //plot(upperBB) //plot(lowerBB) ///////////// Trend //////////////////////////// rawFactor = ((upperBB-lowerBB)/basisBB)*Bw Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor Up=hl2-(Factor*atr(Pd)) Dn=hl2+(Factor*atr(Pd)) TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1) TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1) Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80) sig_trend_long = Trend[1] == -1 and Trend == 1 sig_trend_short = Trend[1] == 1 and Trend == -1 ///////////// Loss Cut //////////////////////////// price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1]) sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) ) has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1]) sig_reentry_long = not has_position and current_trend == 1 and low > price_cut sig_reentry_short = not has_position and current_trend == -1 and high < price_cut bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70) plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny) plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny) LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60) fill(TrendDownPlot, LossCutPlot, color=silver, transp=90) plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny) plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny) ///////////// Strategy //////////////////////////// if true strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long) strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short) if(current_trend == 1) strategy.close('long', when=sig_loss_cut == true) //strategy.exit('lc',from_entry='long', stop=price_cut) if( current_trend == -1 ) strategy.close('short', when=sig_loss_cut == true) //strategy.exit('sc',from_entry='short', stop=price_cut)