Stratégie d'optimisation de portefeuille basée sur la moyenne mobile lissée


Date de création: 2024-01-26 14:57:08 Dernière modification: 2024-01-26 14:57:08
Copier: 1 Nombre de clics: 583
1
Suivre
1617
Abonnés

Stratégie d’optimisation de portefeuille basée sur la moyenne mobile lissée

Aperçu

La stratégie est basée sur une combinaison de moyennes mobiles lisses et d’indicateurs stochastiques, dans le but de capturer plus d’opportunités dans la tendance. Elle utilise principalement des moyennes mobiles indicielles de deux périodes différentes pour former un signal stratégique, combiné à la croisée des lignes K et D dans l’indicateur stochastique comme une sélection de timing d’entrée, dans l’espoir d’obtenir un taux de gain plus élevé dans la tendance.

Principe de stratégie

Cette stratégie utilise deux moyennes mobiles lisses de 12 et 26 cycles. Lorsque la ligne rapide traverse la ligne lente par le bas, faites plus; lorsque la ligne rapide traverse la ligne lente par le haut, faites moins. Pour filtrer les faux signaux, elle exige que la ligne rapide et la ligne lente soient synchronisées, la ligne rapide ne peut faire plus que sur la ligne lente et la ligne rapide ne peut faire moins que sous la ligne lente.

Lorsque la ligne K dans l’indicateur stochastique se croise avec la ligne D comme moment d’entrée. Lorsque la ligne K se croise avec la ligne D de la direction en dessous de la ligne de surachat, faites plus; lorsque la ligne K se croise avec la ligne D de la direction en dessous de la zone de survente, faites moins.

La moyenne mobile lisse détermine la direction de la tendance, l’indicateur stochastique filtre le bruit et sélectionne le moment d’entrée. Leur combinaison permet d’obtenir plus d’opportunités de profit dans la tendance.

Avantages stratégiques

  • La stratégie des moyennes mobiles lisse est elle-même caractérisée par une tendance à la hausse et facile à suivre.
  • Filtrez le bruit avec les indicateurs stochastiques pour augmenter la probabilité de gagner
  • La combinaison de la ligne moyenne rapide et lente permet d’obtenir de meilleures opportunités de jeu lorsque la ligne rapide est redirigée vers la ligne lente.
  • L’utilisation d’une combinaison croisée de lignes K et D dans les indicateurs stochastiques permet de choisir davantage de points d’entrée.

Cette stratégie permet donc de saisir les opportunités de manière aléatoire et sélective, ce qui permet d’obtenir des taux de rendement plus élevés.

Analyse des risques

  • Il y a plus de risque de quitter le terrain dans un court laps de temps. Il est possible que le signal soit refusé ou bloqué lorsque la ligne rapide est redirigée vers la ligne lente.
  • En raison de sa nature tendancielle, il ne peut pas s’adapter rapidement à une reprise spectaculaire de la situation, ce qui peut entraîner des pertes plus importantes.

Pour réduire ces risques, nous pouvons définir des stop-loss ou utiliser une combinaison de paramètres de moyenne mobile plus souple.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Tester différentes combinaisons de paramètres de la moyenne mobile pour trouver le meilleur
  2. Tester différentes combinaisons de stochastiques
  3. Augmentation des stratégies de réduction des pertes
  4. Augmentation de la stop loss dynamique basée sur la volatilité
  5. Optimisation des combinaisons pour différents paramètres cycliques de différentes variétés
  6. Paramètres d’optimisation pour tester les algorithmes d’apprentissage automatique

En testant différentes combinaisons de paramètres, des paramètres plus puissants peuvent être trouvés; en même temps, la mise en place d’une stratégie de stop-loss peut réduire efficacement le risque et améliorer la stabilité de la stratégie.

Résumer

La stratégie intègre les avantages des moyennes mobiles et des stochastiques, permet de suivre les tendances en continu et de choisir les meilleurs moments d’entrée. Elle est facile à utiliser, à contrôler et à utiliser.

Code source de la stratégie
/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")