Stratégie de filtrage adaptatif de la volatilité basée sur le momentum sur plusieurs périodes

momentum volatility SMA ATR stdev SPX
Date de création: 2025-02-24 09:38:10 Dernière modification: 2025-02-24 09:38:10
Copier: 0 Nombre de clics: 345
2
Suivre
319
Abonnés

Stratégie de filtrage adaptatif de la volatilité basée sur le momentum sur plusieurs périodes Stratégie de filtrage adaptatif de la volatilité basée sur le momentum sur plusieurs périodes

Aperçu

La stratégie est un système de trading avancé basé sur des indicateurs de dynamique multi-périodes et des filtres de volatilité. Il construit un système de notation dynamique intégré en calculant la dynamique des prix sur quatre périodes de temps de 3 mois, 6 mois, 9 mois et 12 mois.

Principe de stratégie

La logique centrale de la stratégie comprend les éléments clés suivants:

  1. Calcul de la dynamique: la méthode de calcul des indices de dynamique pour les 4 périodes de temps est calculée à l’aide de ((prix actuel / prix historique-1)).
  2. Filtrage de la volatilité: calculer le décalage standard du taux de rendement journalier et l’annualiser en le comparant à la limite de préférence ((0,5)) pour filtrer les périodes de forte volatilité.
  3. Génération de signaux: lorsque l’indicateur de dynamique global est inversé négativement et que le taux d’oscillation est inférieur au seuil, un signal de multiplication est généré; lorsque l’indicateur de dynamique est inversé négativement, un signal de plage est généré.
  4. Gestion des risques: un stop loss de 1% et un stop stop de 50% sont utilisés pour contrôler le risque d’une seule transaction.

Avantages stratégiques

  1. L’analyse de la dynamique multidimensionnelle permet d’évaluer plus globalement l’intensité et la persistance des tendances des prix en tenant compte de la dynamique de plusieurs périodes de temps.
  2. Filtrage de fréquence d’oscillation adaptatif: par le calcul dynamique et le filtrage de fréquence d’oscillation, le faux signal est efficacement évité pendant les périodes de forte oscillation.
  3. Contrôle des risques: les valeurs de stop loss et de stop loss sont définies pour contrôler efficacement le risque d’une seule transaction.
  4. Décision systématisée: la stratégie est complètement systématisée, évitant les interférences de jugement subjectif.

Risque stratégique

  1. Risque de renversement de tendance: une forte tendance peut entraîner des pertes importantes si elle est soudainement inversée.
  2. Sensitivité des paramètres: les effets de la stratégie sont sensibles aux paramètres tels que les cycles de dynamisation et les seuils de volatilité.
  3. Dépendance de l’environnement du marché: les faux signaux peuvent être fréquents dans les marchés en crise.
  4. Effets des points de glissement: les coûts de transaction peuvent être plus élevés en cas de manque de liquidité sur le marché.

Orientation de l’optimisation de la stratégie

  1. Optimisation des paramètres dynamiques: un mécanisme d’ajustement des paramètres adaptatifs peut être introduit, afin d’ajuster dynamiquement les cycles de dynamique et les seuils de volatilité en fonction des conditions du marché.
  2. Classification de l’état du marché: ajout d’un module de reconnaissance de l’état du marché, avec des paramètres différents dans différents environnements de marché.
  3. Mécanisme de confirmation des signaux: introduction d’indicateurs techniques supplémentaires pour confirmer les signaux de négociation et améliorer la stabilité de la stratégie.
  4. Optimisation de la gestion des fonds: la taille des positions peut être ajustée en fonction de la dynamique de l’intensité du signal, permettant une meilleure efficacité de l’utilisation des fonds.

Résumer

La stratégie, combinant l’analyse de la dynamique multi-cycle et le filtrage des taux d’oscillation, construit un système de trading complet de suivi des tendances. Son avantage central réside dans le processus de décision systématique et le mécanisme de contrôle des risques. Bien qu’il existe des risques inhérents, la stratégie a encore beaucoup de place d’amélioration grâce à la direction d’optimisation proposée. Dans l’ensemble, c’est une stratégie de négociation rationnelle et logiquement rigoureuse conçue pour être utilisée dans les marchés tendanciels à faible volatilité.

Code source de la stratégie
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("GOATED Long-Only", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Strategy parameters
var float VOLATILITY_THRESHOLD = input.float(0.5, "Volatility Threshold", minval=0.1, maxval=1.0, step=0.1)
var int TRADING_DAYS_PER_YEAR = 252
var float SQRT_TRADING_DAYS = math.sqrt(TRADING_DAYS_PER_YEAR)

// Trade parameters
var float STOP_LOSS = input.float(0.05, "Stop Loss %", minval=0.01, maxval=0.20, step=0.01)
var float TAKE_PROFIT = input.float(0.15, "Take Profit %", minval=0.05, maxval=0.50, step=0.01)

// Momentum periods (in trading days)
var int MOMENTUM_3M = input.int(63, "3-Month Momentum Period", minval=20)
var int MOMENTUM_6M = input.int(126, "6-Month Momentum Period", minval=40)
var int MOMENTUM_9M = input.int(189, "9-Month Momentum Period", minval=60)
var int MOMENTUM_12M = input.int(252, "12-Month Momentum Period", minval=80)

// Function to calculate momentum for a specific period
momentum(period) =>
    close / close[period] - 1

// Function to calculate annualized volatility
calcVolatility() =>
    returns = ta.change(close) / close[1]
    stdDev = ta.stdev(returns, TRADING_DAYS_PER_YEAR)
    annualizedVol = stdDev * SQRT_TRADING_DAYS
    annualizedVol

// Calculate individual momentum scores
float mom3m = momentum(MOMENTUM_3M)
float mom6m = momentum(MOMENTUM_6M)
float mom9m = momentum(MOMENTUM_9M)
float mom12m = momentum(MOMENTUM_12M)

// Calculate average momentum score
var int validPeriods = 0
var float totalMomentum = 0.0

validPeriods := 0
totalMomentum := 0.0

if not na(mom3m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom3m

if not na(mom6m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom6m

if not na(mom9m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom9m

if not na(mom12m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom12m

float compositeMomentum = validPeriods > 0 ? totalMomentum / validPeriods : na

// Calculate volatility
float annualizedVolatility = calcVolatility()

// Generate trading signals
var float MOMENTUM_THRESHOLD = input.float(0.0, "Momentum Threshold", minval=-1.0, maxval=1.0, step=0.01)
bool validVolatility = not na(annualizedVolatility) and annualizedVolatility <= VOLATILITY_THRESHOLD
bool validMomentum = not na(compositeMomentum) and compositeMomentum > MOMENTUM_THRESHOLD

// Store previous momentum state
bool prevValidMomentum = nz(validMomentum[1])

// Entry and exit conditions
bool longCondition = validVolatility and validMomentum and not prevValidMomentum
bool exitLongCondition = validVolatility and (not validMomentum) and prevValidMomentum

// Plot signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exitLongCondition, title="Long Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot momentum and volatility indicators
plot(compositeMomentum, "Composite Momentum", color=color.blue, linewidth=2)
hline(MOMENTUM_THRESHOLD, "Momentum Threshold", color=color.gray, linestyle=hline.style_dashed)

plot(annualizedVolatility, "Annualized Volatility", color=color.purple, linewidth=1)
hline(VOLATILITY_THRESHOLD, "Volatility Threshold", color=color.gray, linestyle=hline.style_dashed)

// Strategy execution - Long positions
if (longCondition)
    strategy.entry("Long", strategy.long)
    
if (strategy.position_size > 0)
    float longStopLoss = strategy.position_avg_price * (1 - STOP_LOSS)
    float longTakeProfit = strategy.position_avg_price * (1 + TAKE_PROFIT)
    strategy.exit("Exit Long", "Long", stop=longStopLoss, limit=longTakeProfit)
    if (exitLongCondition)
        strategy.close("Long", comment="Signal Exit")