Quantitative Handelsstrategie mit mehreren Zeitrahmen zur Simulation von Dreiecksarbitrage


Erstellungsdatum: 2024-01-29 11:10:33 zuletzt geändert: 2024-01-29 11:10:33
Kopie: 0 Klicks: 736
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitative Handelsstrategie mit mehreren Zeitrahmen zur Simulation von Dreiecksarbitrage

Überblick

Diese Strategie kombiniert drei verschiedene technische Indikatoren, um eine Arbitrage-Strategie mit mehreren Zeitrahmen zu erstellen, die ein niedriges Risiko mit einem Überschuss erzielt, indem sie die Preisentwicklung in verschiedenen Zeiträumen erfasst.

Strategieprinzip

Die drei technischen Indikatoren, die in dieser Strategie verwendet werden, sind der Kelt-Kanal (KC), der Volatilitätsstop (Vstop) und der William-Street-Street-Indikator (WAE). Der Kelt-Kanal wird verwendet, um zu bestimmen, ob der Preis außerhalb des Kanalbereichs ist und somit ein Handelssignal auslöst. Der Volatilitätsstop wird verwendet, um die Stop-Position dynamisch anzupassen und unnötige Stop-Losses zu reduzieren, während ein Stop-Loss garantiert wird.

  1. Wenn der Preis höher ist als der Celtic-Channel-Oberlauf, wird dies als bullish betrachtet. Wenn der Preis niedriger ist als der Celtic-Channel-Unterlauf, wird dies als bearish betrachtet.

  2. Die Stop-Position wird anhand der Preisschwankungen und der Breite des Kanals eingestellt. Sie kann dynamisch angepasst werden, um eine zu konservative Stop-Position zu vermeiden, während die Stop-Position garantiert wird.

  3. Der William-Indikator berechnet die MACD und die Breite der Brin-Band-Kanäle, um zu bestimmen, ob sich der Preis in einem starken Auf- oder Abwärtstrend befindet.

Durch die Kombination dieser drei Indikatoren können Signale in verschiedenen Zeitspannen gegenseitig verifiziert werden. Dies reduziert die Wahrscheinlichkeit von Fehleinschätzungen und erzeugt eine stabil optimierte Strategielogik.

Analyse der Stärken

Der größte Vorteil dieser Strategie liegt in der Präzision der Handelssignale, die aus einer Kombination aus mehreren Indikatoren resultieren. Die drei Indikatoren wirken in verschiedenen Zeiträumen und verifizieren sich gegenseitig, wodurch die Wahrscheinlichkeit von Fehleinschätzungen reduziert und die Genauigkeit der Signale erhöht wird. Darüber hinaus ist die Stop-Loss-Einstellung der Volatilität dynamisch und kann die Stop-Loss-Position anhand von Echtzeit-Volatilitäten anpassen, um das Risiko weiter zu kontrollieren.

Die Kombinationsstrategie kann im Vergleich zu einer einzelnen Indikatorstrategie ein genaueres und effizienteres Handelssignal liefern. Gleichzeitig sind die drei Indikatoren in Zusammenarbeit miteinander verbunden, um Handelsurteile in mehreren Zeitrahmen zu bilden. Diese logische Gestaltung ist sehr wissenschaftlich und vernünftig und lohnt sich.

Risikoanalyse

Das Hauptrisiko dieser Strategie besteht darin, dass eine falsche Einstellung der Parameter zu einer Überpassung führen kann. Die drei Indikatoren haben insgesamt 8 Parameter, die sich negativ auf die Strategie auswirken können. Darüber hinaus müssen die Gewichtsverhältnisse zwischen den Indikatoren vernünftig konfiguriert werden, da sich die Signale gegenseitig kompensieren und zu Unwirksamkeit führen können.

Um diese Risiken zu verringern, muss die Anpassung an die verschiedenen Marktbedingungen in den Parameter-Setting-Prozess einbezogen werden. Die Gewichte zwischen den Indikatoren sollten entsprechend angepasst werden, um sicherzustellen, dass die Handelssignale wirksam ausgelöst werden können.

Optimierungsrichtung

Die Optimierungsmöglichkeiten für diese Strategie konzentrieren sich auf zwei Aspekte: Parameteroptimierung und Verbesserung der Stop-Loss-Strategie. Konkret kann man aus folgenden Aspekten beginnen:

  1. Eine wissenschaftlichere und vernünftigere Auswahl der Indikatorparameter und Optimierung der Parameterkombinationen. Mit Hilfe von Algorithmen können die optimalen Parameter nach Zielen wie Gewinnmaximierung und Risikominimierung gesucht werden.

  2. Verbesserung der Stop-Loss-Strategie, um unnötige Stopps weiter zu reduzieren und die Gewinnrate zu erhöhen, unter der Voraussetzung, dass die Stop-Loss-Strategie gewährleistet ist. Zum Beispiel die Kombination von mehr Indikatoren als Stop-Signal oder die schrittweise Zurücksetzung der Stop-Loss-Position.

  3. Optimierung der Gewichtsbeziehungen der Indikatoren und der Urteilslogik der Handelssignale, Verringerung der Fehlentscheidungsrate. Es können mehr Merkmale des Preisverhaltens eingeführt werden, um stabilere und zuverlässigere Urteilsregeln zu erstellen.

  4. Versuchen Sie, ein Machine-Learning-Modell einzuführen, um die automatische Optimierung der Parameter zu ermöglichen. Oder verwenden Sie Deep-Reinforcement-Lern-Programmierung zur Strategiebewertung und -verbesserung.

Zusammenfassen

Die Strategie baut ein Arbitrage-System auf, das sich über einen Zeitrahmen erstreckt. Die Kombination von mehreren Indikatoren erhöht die Genauigkeit der Handelssignale und die dynamische Stop-Loss-Kontrolle des Risikos. Es gibt jedoch noch Raum für Verbesserungen bei der Parametersetzung und -Optimierung.

Strategiequellcode
/*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///