Analyse des performances temporelles Stratégie d'optimisation SuperTrend

ATR supertrend Profit Factor Winrate Performance Analytics Strategy Optimization
Date de création: 2025-07-25 13:30:18 Dernière modification: 2025-07-25 13:30:18
Copier: 2 Nombre de clics: 280
2
Suivre
319
Abonnés

Analyse des performances temporelles Stratégie d’optimisation SuperTrend Analyse des performances temporelles Stratégie d’optimisation SuperTrend

Aperçu

La stratégie est un système de trading basé sur les indicateurs de SuperTrend, combiné à un cadre d’analyse de la performance sur une date complète, capable de suivre et d’analyser la performance de la stratégie sur différentes périodes de temps. La stratégie génère des signaux de trading via l’ATR et l’indicateur de SuperTrend, tout en intégrant un puissant outil d’analyse de la performance, permettant une analyse statistique de l’efficacité des transactions sur différents jours de négociation par semaine et par mois, fournissant aux traders un support décisionnel basé sur des données pour identifier les meilleurs moments de négociation et optimiser les stratégies de négociation.

Principe de stratégie

Le cœur de la stratégie se compose de deux parties: un mécanisme de génération de signaux de transaction et un système d’analyse de la performance.

  1. Mécanisme de génération de signaux de négociation

    • Génération de signaux d’entrée basés sur les indicateurs SuperTrend
    • SuperTrend est un indicateur de suivi des tendances qui combine l’ATR et le calcul de facteurs personnalisés.
    • Signaux de négociation déclenchés lorsque l’indicateur SuperTrend change de direction
    • Exécutez plusieurs opérations lorsque la direction est inversée négativement
    • Exécution de la manœuvre de blanchiment lorsque la direction est inversée de positif à négatif
  2. Système d’analyse des performances

    • Des structures de données spéciales ont été créées (DayStats) pour enregistrer les statistiques de chaque jour de transaction
    • Les indicateurs de suivi incluent: nombre de transactions gagnantes / négatives, bénéfices bruts, pertes brutes
    • Calculer les indicateurs dérivés: bénéfice net, facteur de profit, taux de victoire
    • Indicateurs de performance statistiques pour sept jours par semaine (du lundi au dimanche)
    • En même temps, surveillez les transactions du 1er au 31 de chaque mois.
    • Affichage des données de performances, y compris des états de dépréciation de différents symboles de couleurs, à l’aide de tableaux visuels

Cette stratégie utilise les propriétés d’orientation objet de Pine Script pour créer une classe DayStats pour stocker et mettre à jour les statistiques de transaction, permettant une gestion et un calcul efficaces des données. Les statistiques sont mises à jour à la fin de chaque transaction via la fonction update_all_stats (), qui garantit que les données de performance reflètent en temps réel les derniers résultats de la transaction.

Avantages stratégiques

  1. Une analyse complète des dimensions temporellesL’avantage le plus notable de cette stratégie est qu’elle permet d’analyser en profondeur la performance des transactions dans une dimension temporelle, en aidant les traders à identifier les jours ou les jours de la semaine où les transactions sont les plus efficaces, fournissant une base de données solide pour les stratégies de filtrage temporel.

  2. L’aide à la décision basée sur les donnéesEn calculant en détail les indicateurs clés tels que le taux de réussite, le ratio de gain et de perte et le bénéfice net de chaque jour de négociation, les traders peuvent prendre des décisions de négociation basées sur des données objectives plutôt que sur des sentiments subjectifs, ce qui réduit les interférences émotionnelles.

  3. Amélioration de la gestion des risquesEn identifiant les jours de trading historiquement médiocres, les traders peuvent choisir d’éviter les transactions ou d’ajuster la taille de leur position pour réduire efficacement le risque systémique.

  4. Présentation visuelle des performances: La fonctionnalité de présentation de tableaux intégrée à la stratégie présente de manière intuitive les performances des transactions pour les différentes périodes, en utilisant des symboles de différentes couleurs pour indiquer les pertes et les pertes, afin que les traders puissent saisir les performances de la stratégie à première vue.

  5. Haute personnalisationLa stratégie fournit plusieurs paramètres d’entrée, y compris le cycle ATR, le facteur SuperTrend, la position du tableau et les paramètres de couleur, permettant aux traders de s’adapter en fonction de leurs préférences personnelles et des caractéristiques du marché.

  6. Une capacité d’intégration flexible: Le code de la section analyse des performances est conçu pour être facilement intégré à d’autres stratégies de trading, ce qui améliore la fonctionnalité et l’évolutivité de la stratégie.

Risque stratégique

  1. Les données de l’échantillon sont insuffisantesDans le cas d’un petit nombre de transactions, les résultats statistiques pour certaines dates peuvent ne pas être statistiquement significatifs et les décisions prises sur la base de ces données limitées peuvent conduire à une mauvaise orientation d’optimisation. La solution consiste à s’assurer d’un cycle de retour suffisamment long et à obtenir plus de transactions pour améliorer la fiabilité statistique.

  2. Le risque d’une suradaptation: la performance historique trop dépendante d’une date particulière peut conduire à une suradaptation de la stratégie aux données historiques et à l’échec de la stratégie lorsque le contexte du marché change à l’avenir. Les traders devraient utiliser l’analyse du temps comme facteur de référence et non comme seule base de décision et vérifier régulièrement la stabilité des résultats de l’analyse.

  3. Limitations du mécanisme de génération de signaux: L’indicateur SuperTrend peut générer de fréquents faux signaux dans les marchés instables, ce qui entraîne des transactions excessives et des pertes inutiles. Il est recommandé de l’utiliser dans les marchés à forte tendance ou en combinaison avec d’autres indicateurs de confirmation pour filtrer les faux signaux.

  4. Calculer la consommation de ressources: Avec l’augmentation du nombre de transactions, la quantité de données que le système d’analyse de performance doit stocker et traiter augmente également, ce qui peut affecter l’efficacité de l’exécution de la stratégie. Attention à l’occupation des ressources dans les transactions à long terme ou en stock.

  5. Influence des facteurs saisonniers: certains marchés présentent une régularité saisonnière, et l’impact saisonnier d’un cycle plus long peut être ignoré par une simple analyse hebdomadaire ou mensuelle. On peut envisager d’ajouter une analyse au niveau trimestriel ou annuel pour capturer des modèles de cycles plus longs.

Orientation de l’optimisation de la stratégie

  1. Analyse de plusieurs périodesLes stratégies actuelles analysent les performances sur une seule période, mais peuvent être étendues pour analyser les performances de transactions sur plusieurs périodes, par exemple en examinant simultanément les différences de performances sur les lignes journalières, les lignes de 4 heures et les lignes de 1 heure, afin d’obtenir une vision plus complète des dimensions temporelles.

  2. Augmentation de la classification des conditions du marchéL’ajout de classifications de conditions de marché dans l’analyse de la performance, telles que la distinction entre la performance dans un marché tendanciel et un marché oscillant, ou les différences entre un environnement à forte volatilité et un environnement à faible volatilité, peut aider à découvrir les avantages et les inconvénients d’une stratégie dans un environnement de marché particulier.

  3. Système de notation de la qualité du signalIntroduction d’un système de notation de la qualité des signaux, évaluant chaque signal de transaction sur la base de facteurs tels que la cohérence des indicateurs techniques, la structure des prix et la confirmation du volume de transactions, et intégrant la dimension de la qualité du signal dans l’analyse des performances, ce qui permet d’identifier les caractéristiques des signaux de haute qualité.

  4. Optimisation des paramètres d’adaptationL’adaptation automatique des paramètres ATR et des facteurs de SuperTrend sur la base des données de performance historique permet à la stratégie de s’adapter aux changements des conditions du marché et d’améliorer l’adaptabilité et la stabilité de la stratégie.

  5. Intégration des données du calendrier économique: intégrer des informations sur les événements tels que la publication de données économiques importantes, les décisions des banques centrales dans l’analyse de la performance, étudier les lois de la performance des transactions avant et après un événement économique spécifique, fournir aux traders un soutien à la décision basé sur les événements.

  6. Le développement des indicateurs statistiquesL’ajout d’indicateurs statistiques tels que les gains/pertes maximaux consécutifs, le ratio moyen des gains/pertes et le ratio de Sharpe fournissent une évaluation plus approfondie de la performance et aident les traders à mieux comprendre les caractéristiques de la stratégie.

  7. Reconnaissance de modèles d’apprentissage automatiqueL’introduction d’algorithmes d’apprentissage automatique simples pour identifier automatiquement les modèles et les règles de temps potentiels à partir des données de performance historique, pour prédire les performances possibles des futures journées de négociation et pour fournir des conseils prospectifs aux décisions de négociation.

Résumer

La stratégie d’optimisation de l’analyse de la performance chronologique SuperTrend est une solution innovante qui combine un système de trading de suivi des tendances avec une analyse complète de la performance de la dimension temporelle. La stratégie fournit non seulement des signaux de trading basés sur les indicateurs de SuperTrend, mais, plus important encore, construit un cadre analytique robuste qui permet d’évaluer systématiquement les différences de performance de la stratégie au cours de différentes périodes de temps.

En suivant en détail les résultats des transactions sur les différentes dates de la semaine et du mois, les traders peuvent identifier les modèles de temps qui présentent un avantage statistique et optimiser les stratégies de trading de manière ciblée. La valeur de ce cadre d’analyse ne se limite pas à la stratégie SuperTrend actuelle, mais peut également être facilement intégrée à d’autres systèmes de trading, offrant une pensée d’optimisation de la dimension temporelle pour toutes sortes de stratégies.

Cette approche axée sur les données élève la négociation intuitive au niveau de l’analyse quantitative, permettant aux traders de prendre des décisions plus rationnelles basées sur des données statistiques objectives. La valeur de cette stratégie augmentera encore davantage avec l’accumulation d’échantillons de transactions et l’élargissement des dimensions d’analyse, offrant aux traders des conseils d’optimisation de plus en plus précis.

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

//@version=6
strategy("Daily Performance Analysis [Mr_Rakun]", overlay=true)

atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)

[st, direction] = ta.supertrend(factor, atrPeriod)

if ta.change(direction) < 0
    strategy.entry("My Long Entry Id", strategy.long)

if ta.change(direction) > 0
    strategy.entry("My Short Entry Id", strategy.short)

plot(st, title="SuperTrend", color=st < close ? color.green : color.red, linewidth=2)

//-------------------------------------------------------------
// Copy the rest of this line and add it to your own strategy.

// Daily Performance
type DayStats
    int wins = 0
    int losses = 0
    float gross_profit = 0.0
    float gross_loss = 0.0

update(DayStats ds, float profit) =>
    if profit > 0
        ds.wins += 1
        ds.gross_profit += profit
    else
        ds.losses += 1
        ds.gross_loss += math.abs(profit)

net_profit(DayStats ds) => ds.gross_profit - ds.gross_loss
profit_factor(DayStats ds) => ds.gross_loss > 0 ? ds.gross_profit / ds.gross_loss : na
winrate(DayStats ds) =>
    total = ds.wins + ds.losses
    total > 0 ? (ds.wins / total) * 100 : na

// ================== GLOBAL OBJECTS ==================

var DayStats monday    = DayStats.new()
var DayStats tuesday   = DayStats.new()
var DayStats wednesday = DayStats.new()
var DayStats thursday  = DayStats.new()
var DayStats friday    = DayStats.new()
var DayStats saturday  = DayStats.new()
var DayStats sunday    = DayStats.new()
var array<DayStats> monthStats = array.new<DayStats>()

// ================== UPDATE METHOD ==================
update_all_stats() =>
    if barstate.isfirst
        for i = 0 to 30
            array.push(monthStats, DayStats.new())

    if strategy.closedtrades > strategy.closedtrades[1]
        idx = strategy.closedtrades - 1
        profit = strategy.closedtrades.profit(idx)
        poz_time = strategy.closedtrades.entry_time(idx)
        dom = dayofmonth(poz_time)
        day = dayofweek(poz_time)

        DayStats day_stats = switch day
            dayofweek.sunday    => sunday
            dayofweek.monday    => monday
            dayofweek.tuesday   => tuesday
            dayofweek.wednesday => wednesday
            dayofweek.thursday  => thursday
            dayofweek.friday    => friday
            dayofweek.saturday  => saturday

        if na(day_stats) == false
            update(day_stats, profit)

        if dom >= 1 and dom <= 31
            DayStats mstats = array.get(monthStats, dom - 1)
            update(mstats, profit)
        day_stats

update_all_stats()

 
// Table positioning inputs
weekly_position = input.string("Top Center", "Weekly Table Position", 
     options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
monthly_position = input.string("Top Right", "Monthly Table Position", 
     options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])

// Color inputs
header_bg_color = input.color(color.gray, "Header Background Color")
profit_color = input.color(color.lime, "Profit Color")
loss_color = input.color(color.red, "Loss Color")
neutral_color = input.color(color.gray, "Neutral Color")
row_bg_color = input.color(color.new(color.gray, 60), "Row Background Color")

// Function to get table position
get_table_position(string pos) =>
    switch pos
        "Top Left" => position.top_left
        "Top Center" => position.top_center
        "Top Right" => position.top_right
        "Middle Left" => position.middle_left
        "Middle Center" => position.middle_center
        "Middle Right" => position.middle_right
        "Bottom Left" => position.bottom_left
        "Bottom Center" => position.bottom_center
        "Bottom Right" => position.bottom_right
        => position.top_center

// TABLE PRINTING 
draw_table_headers(table weekly, table monthly) =>
    table.cell(weekly, 0, 0, "DAY",          text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 1, 0, "W/L (Count)",  text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 2, 0, "NET PROFIT",   text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 4, 0, "WINRATE",      text_color=color.white, text_size=size.small, bgcolor = header_bg_color)

    table.cell(monthly, 0, 0, "DAY",          text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 1, 0, "W/L (Count)",  text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 2, 0, "NET PROFIT",   text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 4, 0, "WINRATE",      text_color=color.white, text_size=size.small, bgcolor = header_bg_color)

fill_weekly_row(table tbl, int row, string day_name, DayStats ds) =>
    net_p = net_profit(ds)
    pf = profit_factor(ds)
    wr = winrate(ds)
    status_color = net_p > 0 ? profit_color: (net_p < 0 ? loss_color : neutral_color)

    table.cell(tbl, 0, row, day_name, text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)

fill_monthly_row(table tbl, int row, int day, DayStats ds) =>
    net_p = net_profit(ds)
    pf = profit_factor(ds)
    wr = winrate(ds)
    status_color = net_p > 0 ? profit_color : (net_p < 0 ? loss_color : neutral_color)

    table.cell(tbl, 0, row, str.tostring(day), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)

var table weekly_table = table.new(get_table_position(weekly_position), 5, 8)
var table monthly_table = table.new(get_table_position(monthly_position), 5, 32)

if barstate.isconfirmed
    draw_table_headers(weekly_table, monthly_table)

    fill_weekly_row(weekly_table, 1, "MON", monday)
    fill_weekly_row(weekly_table, 2, "TUE", tuesday)
    fill_weekly_row(weekly_table, 3, "WED", wednesday)
    fill_weekly_row(weekly_table, 4, "THU", thursday)
    fill_weekly_row(weekly_table, 5, "FRI", friday)
    fill_weekly_row(weekly_table, 6, "SAT", saturday)
    fill_weekly_row(weekly_table, 7, "SUN", sunday)

    for i = 0 to 30
        DayStats ms = array.get(monthStats, i)
        if ms.wins + ms.losses > 0
            fill_monthly_row(monthly_table, i + 1, i + 1, ms)