Stratégie de trading quantitative multi-période simulant l'arbitrage triangulaire


Date de création: 2024-01-29 11:10:33 Dernière modification: 2024-01-29 11:10:33
Copier: 0 Nombre de clics: 736
1
Suivre
1617
Abonnés

Stratégie de trading quantitative multi-période simulant l’arbitrage triangulaire

Aperçu

Cette stratégie utilise la combinaison de trois différents indicateurs techniques pour construire une stratégie d’arbitrage sur plusieurs périodes, permettant de réaliser des gains excessifs à faible risque en capturant les tendances des prix sur différentes périodes.

Principe de stratégie

Les trois indicateurs techniques utilisés dans cette stratégie sont respectivement le canal de Kelt (KC), le stop de volatilité (Vstop) et l’indicateur de rassemblement de William (WAE). Le canal de Kelt est utilisé pour déterminer si le prix est en dehors de la portée du canal et émet donc un signal de négociation. Le stop de volatilité est utilisé pour ajuster dynamiquement la position de stop et réduire les stops inutiles tout en garantissant un stop.

  1. Quand le prix est supérieur à la trajectoire ascendante de la Celtic Channel, il est considéré comme un signal positif. Quand le prix est inférieur à la trajectoire descendante de la Celtic Channel, il est considéré comme un signal négatif.

  2. Le stop-loss fluctuant est configuré en fonction de la volatilité des prix et de la largeur des canaux. Il est capable de s’adapter dynamiquement pour éviter des positions de stop-loss trop conservatrices, tout en garantissant le stop-loss.

  3. L’indicateur William détermine si les prix sont dans une forte tendance haussière ou baissière en calculant la largeur du canal de la bande de Brin et du MACD.

En combinant ces trois indicateurs, les signaux de différentes périodes de temps sont mutuellement vérifiés. Cela réduit la probabilité d’erreur de jugement et crée une logique de stratégie optimisée pour la stabilité.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans la précision des signaux de négociation apportés par la combinaison de plusieurs indicateurs. Les trois indicateurs agissent sur des périodes de temps différentes, se vérifient mutuellement, réduisant efficacement la probabilité d’erreur de jugement et améliorant l’exactitude du signal. De plus, le paramètre de stop loss du taux d’oscillation est dynamique, permettant d’ajuster la position de stop loss en fonction des fluctuations en temps réel et de contrôler davantage le risque.

La stratégie de combinaison offre un signal de trading plus précis et plus efficace que la stratégie d’un seul indicateur. De plus, la combinaison des trois indicateurs, qui forment un jugement de trading sur plusieurs périodes, est une conception logique très scientifique et rationnelle qui mérite d’être étudiée.

Analyse des risques

Le principal risque de cette stratégie est que des paramètres mal configurés peuvent entraîner une suradaptation. Il y a 8 paramètres dans les trois indicateurs, et un mauvais réglage peut avoir un effet négatif sur la stratégie. De plus, les relations de poids entre les indicateurs doivent être configurées de manière raisonnable, sinon les signaux peuvent se neutraliser les uns les autres, ce qui entraîne leur inefficacité.

Pour réduire ces risques, il est nécessaire de prendre en compte l’adaptation des paramètres aux différents environnements du marché dans le processus de définition des paramètres, et de les ajuster à la combinaison optimale de paramètres grâce à une analyse de retour. En outre, il convient d’ajuster de manière appropriée les rapports de poids entre les indicateurs, afin de garantir que les signaux de négociation puissent être efficacement déclenchés.

Direction d’optimisation

L’espace d’optimisation de cette stratégie se concentre principalement sur deux aspects: l’optimisation des paramètres et l’amélioration de la stratégie de stop-loss. Plus précisément, il peut s’agir des aspects suivants:

  1. Le choix des paramètres de l’indicateur et l’optimisation des combinaisons de paramètres sont plus scientifiques et rationnels. Les algorithmes peuvent être utilisés pour rechercher les paramètres optimaux en fonction des objectifs de maximisation des bénéfices et de minimisation des risques.

  2. Améliorer les stratégies de stop loss, réduire davantage les stops inutiles et augmenter le taux de victoire, tout en garantissant le stop loss. Par exemple, en combinant plus d’indicateurs comme signal de stop loss ou en définissant un réglage progressif de la position de stop loss.

  3. L’optimisation des relations pondérées des indicateurs et de la logique de jugement des signaux de négociation, réduisant le taux d’erreur de jugement. Il est possible d’introduire plus de caractéristiques de comportement des prix et de construire des règles de jugement plus stables et plus fiables.

  4. Essayez d’introduire des modèles d’apprentissage automatique pour optimiser automatiquement les paramètres. Ou utilisez une programmation d’apprentissage en profondeur pour évaluer et améliorer la stratégie.

Résumer

Cette stratégie utilise une combinaison de trois éléments: le canal de Celtic, le stop volatile et l’indicateur William pour construire un système d’arbitrage sur un cadre temporel. La combinaison de plusieurs indicateurs améliore la précision des signaux de négociation et le stop dynamique contrôle les risques. Cependant, il reste de la place pour l’amélioration de la définition et de l’optimisation des paramètres.

Code source de la stratégie
/*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///