Stratégie quantitative de retournement à court terme des bandes de Bollinger basée sur la moyenne mobile


Date de création: 2023-12-19 16:17:47 Dernière modification: 2023-12-19 16:17:47
Copier: 0 Nombre de clics: 665
1
Suivre
1621
Abonnés

Stratégie quantitative de retournement à court terme des bandes de Bollinger basée sur la moyenne mobile

Aperçu

Cette stratégie est une stratégie de trading inverse de courte ligne basée sur l’indicateur de la ceinture de Brin. Elle combine la ligne moyenne, l’écart-type et le canal de la ceinture de Brin pour rechercher des opportunités de trading inverse lorsque le prix est anormalement dispersé.

Principe de stratégie

  1. Calculer la moyenne et l’écart-type. Calculer la moyenne et l’écart-type en utilisant la fonction sma (). Calculer l’écart-type en utilisant la fonction stdev ().

  2. La bande de Brin monte et descend en fonction de la moyenne et de l’écart-type. La ligne supérieure est le prix + l’écart-type*1, la ligne de fond est le prix-différence standard*1。

  3. Lorsque le prix est en hausse ou en baisse, cela indique qu’il y a une anomalie dans le prix, et c’est à ce moment-là que nous décidons de faire un revirement.

  4. Plus précisément, si le prix est en dessous de la barre inférieure, nous faisons une transaction à plusieurs niveaux; si le prix est au-dessus de la barre supérieure, nous faisons une transaction à court.

Analyse des avantages

  1. L’utilisation du canal de la ceinture de Brin pour détecter des anomalies de prix fournit une base pour le renversement des transactions.

  2. La combinaison de facteurs homogènes permet de filtrer efficacement une partie de la transaction de bruit.

  3. L’introduction du facteur d’écart standard a permis à Brin d’être plus dynamique et de mieux juger des anomalies de prix.

  4. La stratégie de retrait est plus modeste et présente une certaine stabilité.

Analyse des risques

  1. L’indicateur de la ceinture de Brin ne permet pas de juger de manière exhaustive des anomalies dans les prix, et il est possible qu’il y ait une fausse rupture.

  2. La fréquence des transactions peut être trop élevée, il est recommandé d’ajuster les paramètres pour contrôler la fréquence des transactions.

  3. Le signal de descente à travers la bande de Brin peut prendre plus de temps et nécessite une adaptation appropriée des paramètres pour un meilleur effet de retour.

  4. La mise en place d’un stop-loss approprié pour contrôler le risque.

Direction d’optimisation

  1. Optimisation des périodes de la moyenne et des paramètres de l’écart-type pour obtenir un passage plus raisonnable dans la bande de Bryn.
  2. Augmentation des facteurs auxiliaires tels que l’EMA et le MACD pour filtrer une partie du signal.
  3. Introduction d’un mécanisme de contrôle des pertes et des positions
  4. Optimiser la taille des positions et les mesures de contrôle des positions.

Résumer

La stratégie est basée sur l’indicateur de la courbe de Brin pour juger de l’anomalie des prix et de faire des transactions inverses avec des paramètres de moyenne et de standard. Elle a une certaine stabilité. Nous devons réduire davantage le retrait maximal de la stratégie et améliorer la stabilité par des moyens tels que l’optimisation des paramètres, l’introduction de facteurs auxiliaires, la gestion des pertes et le contrôle des positions.

Code source de la stratégie
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("BCE Version of EMA, SMA Mean Reversion", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
 
// Inputs
st_yr_inp = input(defval=2017, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
sma_lookback = input(defval=100, title="Lookback Period For SMA")
ema_lookback = input(defval=10, title="Lookback Period For EMA")
long_diff_perc = input(defval=6, title="Percentage Deviation From SMA to go Long")/100
short_diff_perc = input(defval=20, title="Percentage Deviation From SMA to go Short")/100
ema_filter_bars = input(defval=4, title="The number of bars the EMA must rise/fall")
lng_allwd = input(defval=true, title="Allow Longs?")
srt_allwd = input(defval=true, title="Allow Shorts?")
use_stop = input(defval=true, title="Use Stoploss?")
stop_perc = input(defval=30, title="Stop Loss Percentage")/100
 
// Dates
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
can_trade = time >= start and time <= end
// Indicators Setup
sma = sma(close, sma_lookback)
ema = ema(close, ema_lookback)
 
// Strategy Calcuations
close_stdev = stdev(close, sma_lookback)
sd1_upper = close + (close_stdev * 1)
sd1_lower = close - (close_stdev * 1)
close_diff = (close - sma) / sma
 
// Entries and Exits
longCondition = close > sma and open > sma
if (time >= start and time <= end)
    if (longCondition)
        strategy.entry("Long", strategy.long)
    if use_stop
        stop_price = close * (1 - stop_perc)
        strategy.order("Long Stoploss", false, stop=stop_price)
 
shortCondition = close < sma and open < sma
if (shortCondition)
//    strategy.entry("Short", strategy.short)
//    if use_stop
//        stop_price = close * (1 + stop_perc)
//        strategy.order("Short Stoploss", true, stop=stop_price)
//if (time >= start)    
    strategy.close("Long", when=close < sma and open < sma)
//strategy.cancel("Long Stoploss", when=sma < sma[1])
//    strategy.close("Short", when=close > sma and open > sma)
//strategy.cancel("Short Stoploss", when=close_diff<=0)
 
// Plotting
sma_col = sma > sma[1] ? green : red
ema_fill = close_diff <= -long_diff_perc ? lime : close_diff >= short_diff_perc ? maroon : aqua
p_sma = plot(sma, color=sma_col, linewidth=3)
p_ema = plot(ema, color=black, linewidth=2)
p_sd1 = plot(sd1_upper, color=black, linewidth=1, transp=85)
p_sd2 = plot(sd1_lower, color=black, linewidth=1, transp=85)
fill(p_sd1, p_sd2, title='STDEV Fill', color=silver, transp=80)
fill(p_sma, p_ema, title='EMA > Mean Percentage', color=ema_fill, transp=80)