Stratégie de négociation quantitative de moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-12-29 11h03 et 14h
Les étiquettes:

img

Résumé

Cette stratégie est conçue sur la base des indicateurs techniques de la moyenne mobile et du volume de négociation pour une stratégie quantitative à long terme qui suit la tendance. Lorsque le prix de clôture est supérieur à la ligne de la moyenne mobile de 20 jours et que le volume d'achat de la journée est supérieur au volume de vente et au volume moyen de négociation au cours des n derniers jours, le marché est considéré comme étant en hausse et qu'il est temps d'acheter. Lorsque le prix de clôture dépasse le niveau inférieur et que le volume de vente de la journée est supérieur au volume d'achat et au volume moyen de négociation au cours des n derniers jours, le marché est considéré comme étant en baisse et qu'il est temps de vendre.

Principe de stratégie

La stratégie repose principalement sur deux indicateurs de jugement:

  1. Deux lignes moyennes mobiles: Calculer la ligne de 20 jours et la ligne de 60 jours. Lorsque la ligne de 20 jours dépasse la ligne de 60 jours, le marché est considéré comme en hausse. Lorsque la ligne de 20 jours dépasse la ligne de 60 jours, le marché est considéré comme en baisse.

  2. Volume de négociation: Calculer le volume d'achat et le volume de vente quotidiens. Si le volume d'achat est supérieur au volume de vente et supérieur au volume moyen de négociation au cours des n derniers jours, il est déterminé que le marché est haussier. Si le volume de vente est supérieur au volume d'achat et supérieur au volume moyen de négociation au cours des n derniers jours, il est déterminé que le marché est baissier.

La stratégie et la logique de négociation spécifiques sont les suivantes:

Lorsque le prix de clôture est supérieur à la ligne moyenne mobile de 20 jours et que le volume d'achat de la journée est supérieur au volume de vente et au volume moyen de négociation au cours des n derniers jours, le marché est considéré comme haussier.

Va court: Lorsque le prix de clôture dépasse le niveau inférieur du rail inférieur et que le volume de vente de la journée est supérieur au volume d'achat et au volume de négociation moyen au cours des n derniers jours, le marché est considéré comme baissier.

Prise de profit et stop-loss: définissez des niveaux raisonnables de prise de profit et de stop-loss pour bloquer les profits ou réduire les pertes. Par exemple, lorsque le prix augmente de 5% par rapport au prix d'entrée, profitez; lorsque la perte atteint 10%, arrêtez la perte; ou lorsque le prix atteint un nouveau sommet récent et retombe ensuite dans une certaine mesure, profitez.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. La combinaison de deux lignes moyennes mobiles et d'indicateurs de volume de négociation permet d'éviter les points morts du jugement sur un seul indicateur technique.

  2. L'utilisation de bandes de Bollinger avec des paramètres différents détermine des prix d'entrée plus précis.

  3. La stratégie de prise de profit et de stop-loss est raisonnable, ce qui aide à verrouiller les bénéfices et à contrôler les risques.

  4. De bons résultats de backtesting avec des rendements stables, qui peuvent effectivement être appliqués au trading quantitatif.

Analyse des risques

La stratégie comporte également certains risques:

  1. Les stratégies de moyenne mobile doubles ont tendance à produire de faux signaux et doivent être filtrées par des indicateurs de volume.

  2. Les paramètres des bandes de Bollinger ne sont pas correctement réglés et peuvent entraîner des entrées trop fréquentes ou peu fréquentes.

  3. Les points de prise de profit fixe et de stop-loss inappropriés peuvent affecter les rendements de la stratégie.

  4. Une grande quantité de données historiques est requise pour le backtesting, et des pertes inattendues peuvent encore survenir dans le trading en direct.

Direction de l'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les paramètres du système des moyennes mobiles pour trouver la combinaison optimale des moyennes mobiles.

  2. Optimiser les paramètres des bandes de Bollinger pour une saisie plus précise.

  3. Ajustez dynamiquement les points de prise de profit et d'arrêt de perte en fonction des conditions du marché afin de fixer des ratios risque-rendement raisonnables.

  4. Améliorer le jugement d'autres indicateurs techniques tels que le MACD, le KD, etc. pour améliorer la précision de la stratégie.

  5. Utilisez des méthodes d'apprentissage automatique pour trouver automatiquement les paramètres optimaux pour rendre les stratégies plus robustes.

Résumé

Dans l'ensemble, il s'agit d'une stratégie de trading quantitative très pratique avec de bonnes performances de backtesting. Il est facile à mettre en œuvre, avec des risques contrôlables, et est une stratégie stable adaptée au trading en direct, ce qui vaut la peine d'être appris pour les traders quantitatifs. Bien sûr, il y a encore beaucoup de place pour l'optimisation de la stratégie, et j'attends avec impatience plus d'experts en trading quantitatif pour l'améliorer.


/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KAIST291

//@version=4
strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true)
// SETTING //
length1=input(1)
length3=input(3)
length7=input(7)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=(close>Supper and BV>SV and BV>Davgvol)
bull2=(close>ma20  and BV>SV and BV>Davgvol)
bux =(close<Supper and close>Slower and volume<Wavgvol)
bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol)
hi=highest(exit,10)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>ma3 and ma20>ma60 and rsi<70)
    strategy.entry("Long",strategy.long,0.1)

if (strategy.position_avg_price*1.05<close)
    strategy.close("Long",0.1)

else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long",0.1)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////


Plus de