Die Adaptive Trend Following Strategie ist eine quantitative Handelsstrategie, die Bollinger Bands und gleitende Durchschnittsindikatoren kombiniert, um den Trendstärkefaktor dynamisch anzupassen und Trend Following und Stop Loss zu erreichen. Diese Strategie verwendet Bollinger Bands, um die Preisvolatilität zu berechnen und somit eine angemessene Trendstärke dynamisch zu berechnen. Sie verwendet dann den ATR-Indikator, um einen adaptiven Trendkanal zu erstellen, um bullische und bärische Trends zu bestimmen und zu verfolgen. Gleichzeitig verfügt die Strategie über einen eingebauten Stop-Loss-Mechanismus, um Risiken effektiv zu kontrollieren.
Der Kernindikator dieser Strategie sind Bollinger Bands. Bollinger Bands bestehen aus einem mittleren Band, einem oberen Band und einem unteren Band. Das mittlere Band ist der einfache gleitende Durchschnitt von n Tagen, das obere Band ist das mittlere Band + k mal die Standarddeviation von n Tagen und das untere Band ist das mittlere Band - k mal die Standarddeviation von n Tagen. Hier wählen wir das 20-tägige mittlere Band und 2 mal die Standardabweichung aus, um die Bollinger Bands zu konstruieren.
Dann berechnen wir die Bandbreite (Oberband - Unterband) über das mittlere Bandverhältnis, das als
Mit einem angemessenen Stärkefaktor, kombiniert mit dem ATR-Indikator, bewegen sich die oberen und unteren Bands jeweils um ATR * Stärkefaktor Abstand nach oben und unten, um einen anpassungsfähigen Trendkanal zu bilden.
Darüber hinaus legt die Strategie auch einen Stop-Loss-Mechanismus fest. Wenn der Preis nach der Bildung einer Long-Position unter den niedrigsten Punkt fällt, wenn die Position geöffnet wurde, wird der Stop-Loss-Ausgang durchgeführt; das gleiche gilt für Short-Positionen.
Diese Strategie hat folgende Vorteile:
Hohe Anpassungsfähigkeit: Die Berechnung des Stärkefaktors ermöglicht es der Strategie, die Kanalbreite dynamisch anhand der Marktvolatilität anzupassen, den Kanal in einem Bullenmarkt zu erweitern und den Kanal in einem schwankenden Markt zu verengen, um sich an verschiedene Arten von Märkten anzupassen.
Im Vergleich zu einfachen gleitenden Durchschnittsstrategien passen die Bollinger-Band-Strategien die Kanäle seltener an und vermeiden unnötig häufiges Öffnen und Schließen von Positionen.
Der Durchbruch der oberen und unteren Schienen kann Marktlärm effektiv filtern und eine hohe Wahrscheinlichkeit für die Erfassung der Tendenzöffnung gewährleisten.
Der eingebaute Stop-Loss-Mechanismus kann einen einzelnen Verlust effektiv kontrollieren, was ein großer Vorteil dieser Strategie ist.
Diese Strategie birgt auch einige Risiken:
Die Periode n und der Multiplikator k der Bollinger Bands haben einen großen Einfluss auf die Ergebnisse, so dass wiederholte Tests erforderlich sind, um die optimale Parameterkombination zu finden.
Unfähigkeit, Trends zu verfolgen, wenn Bollinger Bands divergieren. Wenn die Preise heftig schwanken, erweitern sich Bollinger Bands schnell, was zu einer Unfähigkeit zur Verfolgung von Trends führt. Die Strategie muss dann pausiert werden und darauf warten, dass sich die Schienen konvergieren, bevor sie erneut ausgeführt wird.
Gelegentliche falsche Signale. Bollinger Bands Strategien sind nicht perfekt, es wird auch eine gewisse Menge an falschen Signalen erzeugt, die erfordert, die entsprechenden Verluste zu tragen.
Relativ einfache Stop-Loss-Methode. Der Stop-Loss dieser Strategie berücksichtigt nur die höchsten und niedrigsten Preise nach Eröffnung einer Position, ohne komplexere Stop-Loss-Methoden auf der Grundlage von Volatilität usw. einzubeziehen, die zu aggressiv oder konservativ sein können und Optimierung erfordern.
Diese Strategie muss in folgenden Aspekten optimiert werden:
Die Parameter der Strategie können für verschiedene Währungen und Zyklen optimiert werden, um die Anpassungsfähigkeit der Strategie zu verbessern.
Optimieren Sie den Stop-Loss-Mechanismus. Bewegliche Stop-Loss, oszillierende Stop-Loss, Trailing Stop-Loss usw. können eingeführt werden, um die Stop-Loss-Methode intelligenter zu machen.
Indikatoren wie MACD, KDJ usw. können hinzugefügt werden, um falsche Signale von Bollinger Bands in seitlich oszillierenden Märkten zu vermeiden.
Ergänzung von Positionsmanagement-Mechanismen, Implementierung von Stop-Profit-Tracking, Pyramidenhandel, Fixed Proportion Position usw. Managementmethoden zur Verbesserung der Rentabilität von Strategien.
Durchführung von Backtest-Optimierungen. Umfassende Untersuchung der Strategieergebnisse durch Erweiterung des Backtest-Zeitrahmens, Anpassung der Parameter, Analyse von Backtestberichten usw. um optimale Parameter zu finden.
Insgesamt ist die adaptive Trendfolging-Strategie eine ziemlich ausgereifte quantitative Strategie. Sie verwendet Bollinger-Bänder, um Trends dynamisch zu erfassen, kombiniert mit dem ATR-Indikator, um einen adaptiven Kanal zum Beurteilen von langen und kurzen Trends zu erstellen. In der Zwischenzeit verfügt sie über einen eingebauten Stop-Loss-Mechanismus zur Risikokontrolle. Die Vorteile dieser Strategie sind eine angemessene Betriebsfrequenz, genaue Eintrittszeit und eine gute Risikokontrolle. Es gibt jedoch einige Probleme, die in Bereichen wie Parameterwahl, Stop-Loss-Methode, Signalfilterung optimiert werden müssen, um die Strategie robuster und intelligenter zu machen.
/*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)