Stratégie d'arbitrage transversal basée sur plusieurs indicateurs

Auteur:ChaoZhang est là., Date: 2024-01-29 11:10:33 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise une combinaison de trois indicateurs techniques différents pour élaborer une stratégie d'arbitrage trans-cyclique qui capture les tendances des prix sur différentes périodes afin d'obtenir des rendements excédentaires à faible risque.

La logique de la stratégie

Les trois indicateurs techniques utilisés dans cette stratégie sont Keltner Channel (KC), Volatility Stop (Vstop) et Williams Alligator (WAE). Le canal de Keltner est utilisé pour déterminer si les prix sont en dehors de la plage du canal et générer ainsi des signaux de trading.

  1. Lorsque le prix est supérieur à la ligne supérieure du canal de Keltner, il est considéré comme un signal haussier.

  2. Il peut s'ajuster dynamiquement pour assurer un stop loss tout en évitant des positions de stop loss trop conservatrices.

  3. L'indicateur Williams Alligator évalue si les prix sont dans une forte tendance haussière ou à la baisse en calculant la largeur du canal MACD et la bande de Bollinger.

En combinant ces trois indicateurs, les signaux sont validés en croisement sur différentes périodes, ce qui réduit la probabilité d'erreurs de jugement et crée une logique de stratégie optimisée.

Analyse des avantages

Le plus grand avantage de cette stratégie est les signaux de trading précis apportés par la combinaison de plusieurs indicateurs. Les trois indicateurs fonctionnent dans des délais différents et se valident mutuellement, ce qui peut réduire efficacement la probabilité d'erreur de jugement et améliorer la précision des signaux.

En comparaison avec les stratégies à indicateur unique, cette stratégie combinée peut fournir des signaux de trading plus précis et plus efficaces.

Analyse des risques

Le principal risque de cette stratégie est que des paramètres incorrects peuvent provoquer un surajustement. Les trois indicateurs ont 8 paramètres au total. Des paramètres incorrects peuvent affecter négativement la stratégie. En outre, la relation de poids entre les indicateurs doit également être correctement configurée, sinon les signaux peuvent se neutraliser et devenir invalides.

Pour réduire ces risques, l'adaptabilité aux différents environnements de marché doit être pleinement prise en compte lors de la définition des paramètres et la combinaison optimale de paramètres doit être ajustée par l'analyse de backtesting.

Directions d'optimisation

L'espace d'optimisation de cette stratégie se concentre principalement sur deux aspects: l'ajustement des paramètres et l'amélioration des stratégies de stop loss.

  1. Choisissez les paramètres d'indicateur de manière plus scientifique et optimisez les combinaisons de paramètres.

  2. Améliorer la stratégie de stop-loss pour réduire davantage les stop-loss inutiles tout en assurant le stop-loss, améliorant ainsi le taux de gain. Par exemple, incorporer plus d'indicateurs comme signaux de stop-loss ou définir un retrait progressif des positions stop-loss.

  3. Optimiser les pondérations entre les indicateurs et la logique des jugements des signaux de trading pour réduire le taux de faux-jugements.

  4. Essayez d'introduire des modèles d'apprentissage automatique pour obtenir une optimisation automatique des paramètres ou utilisez une programmation d'apprentissage par renforcement profond pour l'évaluation et l'amélioration de la stratégie.

Résumé

Cette stratégie construit un système d'arbitrage à cycle croisé grâce à la combinaison de Keltner Channel, Volatility Stop et Williams Alligator. La combinaison multi-indicateur améliore la précision du signal et contrôle les risques de stop loss dynamiques. Mais il y a place à l'amélioration de la définition et de l'optimisation des paramètres. Dans l'ensemble, cette stratégie a une forte scientifique et mérite d'être poursuivie.


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


Plus de