Zyklusübergreifende Arbitragestrategie auf der Grundlage mehrerer Indikatoren

Schriftsteller:ChaoZhang, Datum: 2024-01-29 11:10:33
Tags:

img

Übersicht

Diese Strategie verwendet eine Kombination aus drei verschiedenen technischen Indikatoren, um eine zyklusübergreifende Arbitrage-Strategie zu entwickeln, die die Preisentwicklung in verschiedenen Zeitrahmen erfasst, um übermäßige Renditen mit geringem Risiko zu erzielen.

Strategie Logik

Die drei technischen Indikatoren, die in dieser Strategie verwendet werden, sind Keltner Channel (KC), Volatility Stop (Vstop) und Williams Alligator (WAE). Der Keltner Channel wird verwendet, um festzustellen, ob die Preise außerhalb des Kanalbereichs liegen und somit Handelssignale generieren. Der Volatility Stop wird verwendet, um Stop-Loss-Positionen dynamisch anzupassen, um Stop-Loss zu gewährleisten und dabei unnötigen Stop-Loss zu reduzieren. Der Williams Alligator-Indikator wird verwendet, um festzustellen, ob die Preise einen starken Trend haben.

  1. Wenn der Preis über der oberen Keltner-Kanal-Reihe liegt, gilt er als Aufwärtssignal.

  2. Es kann sich dynamisch anpassen, um einen Stop-Loss zu gewährleisten und gleichzeitig übermäßig konservative Stop-Loss-Positionen zu vermeiden.

  3. Der Williams Alligator-Indikator beurteilt, ob sich die Preise in einem starken Auf- oder Abwärtstrend befinden, indem er die MACD- und Bollinger-Band-Kanalbreite berechnet.

Durch die Kombination dieser drei Indikatoren werden Signale über verschiedene Zeitrahmen hinweg validiert, wodurch die Wahrscheinlichkeit von Fehleinschätzungen verringert und eine optimierte Strategie-Logik aufgebaut wird.

Analyse der Vorteile

Der größte Vorteil dieser Strategie ist die präzise Handelssignale, die durch die Kombination mehrerer Indikatoren gebracht werden. Die drei Indikatoren arbeiten in verschiedenen Zeitrahmen und validieren sich gegenseitig, was die Wahrscheinlichkeit von Fehleinschätzungen effektiv reduzieren und die Genauigkeit der Signale verbessern kann. Darüber hinaus ist die Volatility Stop-Einstellung dynamisch und kann die Stop-Loss-Position entsprechend der Echtzeitvolatilität anpassen, um Risiken weiter zu kontrollieren.

Im Vergleich zu Einzelindikatorstrategien kann diese kombinierte Strategie genauere und effizientere Handelssignale liefern. Gleichzeitig arbeiten die drei Indikatoren zusammen, um Handelsurteile innerhalb mehrerer Zeitrahmen zu bilden, was ein sehr wissenschaftliches und vernünftiges Logikdesign ist, von dem es sich zu lernen lohnt.

Risikoanalyse

Das Hauptrisiko dieser Strategie besteht darin, dass unsachgemäße Parameter-Einstellungen zu einer Überanpassung führen können. Die drei Indikatoren haben insgesamt 8 Parameter. unsachgemäße Einstellungen können sich negativ auf die Strategie auswirken. Darüber hinaus muss auch das Gewichtsverhältnis zwischen den Indikatoren richtig konfiguriert werden, da sich die Signale sonst gegenseitig neutralisieren und ungültig werden können.

Um diese Risiken zu reduzieren, sollte die Anpassungsfähigkeit an verschiedene Marktumgebungen während der Parameter-Einstellung vollständig berücksichtigt werden, und die optimale Parameterkombination sollte durch Backtesting-Analyse angepasst werden. Darüber hinaus sollten die Gewichte zwischen den Indikatoren angemessen angepasst werden, um sicherzustellen, dass Handelssignale effektiv ausgelöst werden können. Wenn aufeinanderfolgende Verluste auftreten, sollten Sie die Positionsgröße reduzieren, um Verluste zu kontrollieren.

Optimierungsrichtlinien

Der Optimierungsbereich dieser Strategie konzentriert sich hauptsächlich auf zwei Aspekte: Parameter-Tuning und Verbesserung von Stop-Loss-Strategien.

  1. Algorithmen können verwendet werden, um die optimalen Parameter mit den Zielen wie Ertragsmaximierung und Risikominimierung zu finden.

  2. Verbessern Sie die Stop-Loss-Strategie, um unnötigen Stop-Loss weiter zu reduzieren und gleichzeitig einen Stop-Loss zu gewährleisten, wodurch die Gewinnrate verbessert wird.

  3. Optimieren Sie die Gewichte zwischen Indikatoren und Logik der Handelssignalurteile, um die Fehlerquote zu reduzieren.

  4. Versuchen Sie, maschinelle Lernmodelle einzuführen, um eine automatische Parameteroptimierung zu erreichen, oder verwenden Sie eine tiefe Verstärkungs-Lernprogrammierung zur Strategiebewertung und -verbesserung.

Zusammenfassung

Diese Strategie baut durch die Kombination von Keltner Channel, Volatility Stop und Williams Alligator ein Querschnittszyklus-Arbitrage-System auf. Die Kombination aus mehreren Indikatoren verbessert die Signalgenauigkeit und steuert die Risiken dynamischer Stop-Loss. Aber es gibt Raum für Verbesserungen bei der Einstellung und Optimierung von Parametern. Insgesamt hat diese Strategie eine starke Wissenschaftlichkeit und ist eine weitere Forschung und Anwendung wert.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("QuarryLake", overlay=true)  ///Ultilized modified full kelly for this strategy = 36%

///Keltner channel///
nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1)
Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1)
xPrice = ema(hlc3, nPeriod)
xMove = ema(high - low, nPeriod)
xMoveMult = xMove * Mult
xUpper = xPrice + xMoveMult
xLower = xPrice - xMoveMult

// plot(xPrice, color=red, title="KSmid")
p1 = plot(xUpper, color=color.white, title="KSup")
p2 = plot(xLower, color=color.white, title="KSdn")
fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white)

kclongcondition = close > xUpper
kcshortcondition = close < xLower
kccloselongcondition = crossunder(close, xUpper)
kccloseshortcondition = crossover(close, xLower)

///Volatility Stop///
length = input(title="Vstop length", type=input.integer, defval=3, minval=1)
mult1 = 1.5

atr_ = atr(length)
max1 = 0.0
min1 = 0.0
is_uptrend_prev = false
stop = 0.0
vstop_prev = 0.0
vstop1 = 0.0
is_uptrend = false
is_trend_changed = false
max_ = 0.0
min_ = 0.0
vstop = 0.0
max1 := max(nz(max_[1]), close)
min1 := min(nz(min_[1]), close)
is_uptrend_prev := nz(is_uptrend[1], true)
stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_
vstop_prev := nz(vstop[1])
vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend := close - vstop1 >= 0
is_trend_changed := is_uptrend != is_uptrend_prev
max_ := is_trend_changed ? close : max1
min_ := is_trend_changed ? close : min1
vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : 
   vstop1

plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1)

vstoplongcondition = close > vstop
vstoplongclosecondition = crossunder(close, vstop)
vstopshortcondition = close < vstop
vstopshortclosecondition = crossover(close, vstop)

///Waddah Attar Explosion///
sensitivity = input(150, title="Sensitivity")
fastLength = input(20, title="FastEMA Length")
slowLength = input(40, title="SlowEMA Length")
channelLength = input(20, title="BB Channel Length")
mult = input(2.0, title="BB Stdev Multiplier")
DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7
calc_macd(source, fastLength, slowLength) =>
    fastMA = ema(source, fastLength)
    slowMA = ema(source, slowLength)
    fastMA - slowMA
calc_BBUpper(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis + dev
calc_BBLower(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis - dev
t1 = (calc_macd(close, fastLength, slowLength) - 
   calc_macd(close[1], fastLength, slowLength)) * sensitivity
t2 = (calc_macd(close[2], fastLength, slowLength) - 
   calc_macd(close[3], fastLength, slowLength)) * sensitivity
e1 = calc_BBUpper(close, channelLength, mult) - 
   calc_BBLower(close, channelLength, mult)
trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1
waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1

///Long Entry///
longcondition = kclongcondition and vstoplongcondition and waelongcondition
if longcondition
    strategy.entry("Long", strategy.long)

///Long exit///
closeconditionlong = kccloselongcondition or vstoplongclosecondition
if closeconditionlong
    strategy.close("Long")

///Short Entry///
shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition
if shortcondition
    strategy.entry("Short", strategy.short)

///Short exit///
closeconditionshort = kccloseshortcondition or vstopshortclosecondition
if closeconditionshort
    strategy.close("Short")

///Free Hong Kong, the revolution of our time///


Mehr