Stratégie de canal de régression dynamique


Date de création: 2024-02-23 12:14:49 Dernière modification: 2024-02-23 12:14:49
Copier: 0 Nombre de clics: 667
1
Suivre
1617
Abonnés

Stratégie de canal de régression dynamique

Aperçu

La stratégie de canal de régression dynamique est une stratégie de négociation quantitative qui utilise la régression linéaire pour analyser la tendance des prix et combiner les arrêts dynamiques pour suivre la tendance. La stratégie utilise la régression linéaire pour tracer le canal des prix, déterminer les signaux de rupture du canal des prix, émettre des ordres d’achat et de vente.

Principe de stratégie

La stratégie commence par calculer la courbe de régression linéaire du prix pour déterminer si le prix a franchi le canal de retour vers le haut ou vers le bas. Un signal d’achat est généré lorsque le prix dépasse le canal de retour vers le haut; un signal de vente est généré lorsque le prix tombe sous le canal de retour vers le bas.

Après la mise en bourse, la stratégie suit en temps réel le cas où le prix a franchi la ligne d’arrêt-perte moyenne. Si le prix est supérieur à la ligne d’arrêt-perte moyenne, un ordre de vente à la perte est émis. Si le prix est supérieur à la ligne d’arrêt-perte moyenne, un ordre d’achat à la perte est émis.

Il est à noter que si le prix ré-percute le canal et effectue une opération inversée, la stratégie est immédiatement remplacée par une opération inversée.

Analyse des avantages

Cette stratégie, combinant tendance et inversion, permet de suivre la tendance générale des prix tout en saisissant les opportunités d’ajustement à court terme. La stratégie de stop loss mise à jour en temps réel permet également de contrôler efficacement les risques et constitue une méthode de négociation plus équilibrée.

Par rapport à la simple stratégie de la ligne moyenne mobile, la stratégie de la chaîne de retour dynamique est plus sensible aux variations de prix et peut réduire les erreurs de négociation. De plus, la stratégie n’est utilisée que lorsque les prix franchissent la chaîne et descendent, ce qui permet d’éviter des transactions radicales désordonnées.

Analyse des risques

La stratégie est principalement exposée à des risques liés à l’inexactitude de la correspondance de la courbe de retour. Si la portée de la courbe de retour est mal définie et trop large, cela augmente la probabilité d’une transaction inefficace. Une courbe trop étroite entraînera un manque d’opportunités de négociation.

En outre, la position de stop loss est également essentielle. Un stop loss trop serré est susceptible d’être déclenché par des fluctuations de prix à court terme; un stop loss trop lâche ne peut pas avoir d’effet de contrôle du risque. Les paramètres doivent être ajustés en fonction des variétés.

Direction d’optimisation

On peut envisager d’optimiser automatiquement les paramètres en fonction de différents cycles ou variétés, afin de rendre les voies de retour et les lignes de stop plus adaptées à la tendance des prix. Par exemple, on peut combiner des algorithmes d’apprentissage automatique pour former les paramètres optimaux.

D’un autre côté, il est possible d’essayer différents types de régressions, comme la régression polynomial, la régression à pondération locale, etc., pour une meilleure adaptation. Ou de combiner plusieurs indicateurs de régression pour construire des règles de négociation et améliorer la stabilité de la stratégie.

Résumer

La stratégie de courbe de régression dynamique utilise des méthodes d’analyse combinant tendance et inversion, afin de saisir les opportunités de correction à court terme tout en suivant la tendance générale des prix. La définition des courbes de régression et des positions de stop-loss clés a un impact important sur l’efficacité de la stratégie.

Code source de la stratégie
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)

// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)

// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)

// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0


var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0

// Regressão linear para uso como sinal de entrada 
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)

//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])

// Condição de entrada (reversão da regressão)
if long_entry_signal
    long_signal := true
    short_signal := false
    long_entry_level := high
    long_stop_level := low

if short_entry_signal
    short_signal := true
    long_signal := false
    short_entry_level := low
    short_stop_level := high


// Indica quando o preço cruzou o nível de stop 
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)

// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
    if low > long_entry_level
        long_stop_level := high

// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
    if high < short_stop_level
        short_stop_level := low

// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
    if long_entry_signal //and short_order_open
        strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
        short_order_open:= false
    if short_entry_signal //and long_order_open
        strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
        long_order_open:=false

// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    long_order_id+=1
    // strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level) 
    strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
    long_order_open := true
    // log.info("Open Long:"+str.tostring(long_order_id))

if short_signal and close < short_entry_level and not short_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    short_order_id+=1
    // strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    short_order_open := true
    // log.info("Open Short:"+str.tostring(short_order_id))

// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
    strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
    long_order_open := false

if short_signal and close > short_stop_level and short_order_open
    strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
    short_order_open := false

// Plotagem da regressão e do stop

plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))

plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")

plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)

plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")