Stratégie d'évaluation de la valeur attendue adaptative de suivi des tendances basée sur la moyenne mobile croisée

SMA EMA
Date de création: 2024-06-17 16:29:02 Dernière modification: 2024-06-17 16:29:02
Copier: 2 Nombre de clics: 266
1
Suivre
1166
Abonnés

Stratégie d’évaluation de la valeur attendue adaptative de suivi des tendances basée sur la moyenne mobile croisée

Aperçu

La stratégie utilise une croisée de moyennes mobiles simples de deux périodes différentes pour déterminer la direction d’une tendance et effectuer des transactions lorsque celle-ci se présente. Parallèlement, la stratégie introduit un panneau de valeurs attendues pour calculer et afficher les gains attendus de la stratégie sur différentes échelles de temps, afin que les utilisateurs puissent mieux évaluer la performance de la stratégie. Ce panneau de valeurs attendues prend en compte des indicateurs clés tels que le taux de victoire, le bénéfice moyen et la perte moyenne de la stratégie au cours de la période historique, ce qui permet de présenter de manière visuelle la performance de la stratégie dans différents environnements de marché.

Principe de stratégie

Le cœur de la stratégie est de déterminer la tendance du marché en utilisant des moyennes mobiles simples croisées de deux cycles différents (dans ce cas, les 14e et 28e jours). Lorsque la moyenne courte traverse la moyenne longue de bas en haut, le marché est considéré comme entrant dans une tendance à la hausse, la stratégie prend plus de positions; au contraire, lorsque la moyenne courte traverse la moyenne longue de haut en bas, le marché est considéré comme entrant dans une tendance à la baisse, la stratégie prend des positions vides. De cette façon, la stratégie est capable de s’adapter aux différentes tendances du marché et de construire des positions en temps opportun lorsque la tendance se produit, afin de tirer parti des gains de la tendance.

En plus de l’analyse de tendances et de la logique de négociation de base, la stratégie a introduit un panneau de valeurs attendues pour calculer et afficher les rendements attendus de la stratégie sur différentes échelles de temps (mois et année). Le calcul des valeurs attendues est basé sur les indicateurs statistiques clés de la stratégie au cours de la période historique, notamment:

  1. Taux de victoire: proportion du nombre de gains de la stratégie par rapport au nombre total de transactions au cours de la période
  2. Gain moyen: le gain moyen de la stratégie sur toutes les transactions gagnantes au cours de la période
  3. Perte moyenne: le montant moyen de la perte de la stratégie sur l’ensemble des transactions perteuses au cours de cette période

Ces indicateurs permettent de calculer les valeurs attendues par la stratégie pour cette période: Valeur attendue = taux de réussite x bénéfice moyen - (1 - taux de réussite) x perte moyenne

En affichant les valeurs attendues pour différentes périodes de temps sous forme de graphiques thermiques sur un graphique, l’utilisateur peut voir à première vue la performance attendue de la stratégie dans différents environnements de marché, ce qui permet de mieux comprendre l’applicabilité et les risques de la stratégie.

Analyse des avantages

  1. Adaptabilité à la tendance: en utilisant la croisée des moyennes mobiles pour juger de la tendance, la stratégie est capable d’ajuster ses positions en temps opportun dans différentes tendances du marché pour s’adapter aux changements du marché. Cela permet à la stratégie de générer de meilleurs rendements dans un marché tendanciel.

  2. Évaluation intuitive de la performance: le panneau de valeurs attendues intégré présente les gains attendus de la stratégie sous la forme d’un graphique thermique pour différentes périodes de temps, permettant à l’utilisateur d’évaluer à la première vue la performance de la stratégie dans différents environnements de marché. Cette représentation visualisée de la performance fournit aux utilisateurs plus de référence de décision.

  3. Le calcul des valeurs attendues prend en compte non seulement la probabilité de succès d’une stratégie, mais aussi l’impact de la rentabilité moyenne et de la perte moyenne. Ce calcul permet de refléter de manière plus complète et plus précise la performance réelle de la stratégie et de fournir aux utilisateurs une référence plus fiable.

  4. Réglage des paramètres: L’utilisateur peut afficher ou non le panneau des valeurs souhaitées en fonction de la flexibilité requise, ainsi que la transparence du panneau. Cela permet à l’utilisateur d’ajuster l’affichage du graphique en fonction de ses préférences, améliorant ainsi l’expérience d’utilisation.

Analyse des risques

  1. Faibles performances dans les marchés turbulents: étant donné que la stratégie est principalement tributaire de la tendance pour obtenir des gains, les transactions fréquentes peuvent entraîner des points de glissement et des coûts de transaction importants dans les marchés turbulents ou dans un environnement de marché incertain, ce qui affecte la performance globale de la stratégie.

  2. Limitations du calcul des valeurs attendues: Bien que le tableau des valeurs attendues offre une façon intuitive d’évaluer la performance d’une stratégie, il est toujours calculé à partir de données historiques. En cas de changements majeurs du marché ou de situations extrêmes, les données historiques peuvent ne pas bien refléter la performance réelle de la stratégie et la valeur de référence des valeurs attendues peut être réduite.

  3. Le choix des paramètres a un impact important: la performance de la stratégie dépend en grande partie de la sélection des cycles des moyennes mobiles. Des combinaisons de cycles différentes peuvent entraîner des résultats de négociation complètement différents. Si les paramètres choisis ne sont pas bien adaptés aux caractéristiques du marché, la performance réelle de la stratégie peut être plus éloignée des valeurs attendues.

Direction d’optimisation

  1. Introduction de plus d’indicateurs techniques: Sur la base des moyennes mobiles existantes, il peut être envisagé d’introduire d’autres indicateurs techniques tels que le MACD, le RSI, etc., afin de mieux juger de la force et de la durabilité des tendances, ce qui améliore le moment d’entrée et de sortie de la stratégie.

  2. Optimisation de la gestion des positions: la stratégie actuelle consiste à fixer les positions à l’apparition de signaux de négociation. Il est possible d’envisager d’ajuster dynamiquement les positions en fonction de la volatilité du marché, de la force de la tendance, etc., afin de mieux contrôler les risques et d’améliorer les rendements.

  3. Ajout d’un mécanisme de stop-loss: l’ajout d’un mécanisme de stop-loss raisonnable dans la stratégie peut aider la stratégie à verrouiller les gains déjà réalisés en temps opportun, tout en limitant les pertes possibles. Cela contribue à améliorer le rapport risque/bénéfice de la stratégie, lui permettant de maintenir une performance relativement stable dans divers environnements de marché.

  4. Optimiser le calcul des valeurs attendues: les méthodes de calcul des valeurs attendues peuvent être optimisées davantage, par exemple en tenant compte des coûts de transaction, en introduisant des fenêtres mobiles, etc., afin d’améliorer l’efficacité et l’utilité des indicateurs de valeurs attendues. En outre, d’autres indicateurs d’évaluation de la performance stratégique peuvent être explorés pour fournir une référence plus complète aux utilisateurs.

Résumer

La stratégie utilise les croisements des moyennes mobiles pour déterminer les tendances du marché et, en cas de tendance, pour établir des positions en temps opportun afin de tirer profit de la tendance. En outre, la stratégie introduit un panneau de valeurs attendues intuitif pour afficher les gains attendus de la stratégie sur différentes échelles de temps, afin de fournir aux utilisateurs plus de référence pour la prise de décision. Bien que la stratégie puisse être peu performante dans les marchés en turbulence et que le calcul des valeurs attendues présente certaines limites, l’introduction de plus d’indicateurs techniques, l’optimisation de la gestion des positions et l’ajout de mesures de stop-loss peuvent améliorer encore le rapport risque-bénéfice de la stratégie, ce qui lui permet de mieux s’adapter à de nombreux changements de marché.

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ir0nantc2

//@version=5
strategy("Expected Value Panel", overlay=true)

// ロングエントリー条件 / Long entry condition
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// ショートエントリー条件 / Short entry condition
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)



// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// Please copy the code below and paste it into the strategy where you want to display the expected value.
// 以下のコードをコピーして期待値を表示させたいストラテジーに貼り付けて下さい。
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

// 表示選択 / Display selection
show_performance = input.bool(true, '期待値ON/OFF (Show Expected Value)', group='Expected Value / ©ir0nantc2')
transparency = input.int(50, '透過度 (Transparency)', minval=0, maxval=100, group='Expected Value / ©ir0nantc2')
prec = 2

// 背景色 / Background color
bg_color(value) =>
    na(value) ? color.new(color.gray, transparency) : value > 0.0 ? color.new(color.green, transparency) :
   value < 0.0 ? color.new(color.red, transparency) :color.new(color.gray, transparency)

// 利益と損失の追跡 / Track profits and losses
var float total_monthly_profit = 0.0
var float total_yearly_profit = 0.0

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    cur_month_pnl = 0.0, cur_year_pnl  = 0.0
    eq = strategy.equity
    bar_pnl = eq / eq[1] - 1

    // 月次・年次 期待値 / Monthly & Yearly Expected Value
    cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // 年次および月次期待値を格納 / Store monthly and yearly expected values
    var month_pnl  = array.new_float(), var month_time = array.new_int()
    var year_pnl  = array.new_float(), var year_time = array.new_int()
    
    // 期待値計算の変数 / Variables for expected value calculation
    var month_wins = array.new_int(), var month_losses = array.new_int()
    var month_avg_win = array.new_float(), var month_avg_loss = array.new_float()
    var year_wins = array.new_int(), var year_losses = array.new_int()
    var year_avg_win = array.new_float(), var year_avg_loss = array.new_float()

    // 月次および年次期待値の配列更新 / Update arrays for monthly and yearly expected values
    bool last_computed = false
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed and array.size(month_pnl) > 0)
            array.pop(month_pnl), array.pop(month_time)
            array.pop(month_wins), array.pop(month_losses)
            array.pop(month_avg_win), array.pop(month_avg_loss)

        array.push(month_pnl, cur_month_pnl[1]), array.push(month_time, time[1])
        array.push(month_wins, 0), array.push(month_losses, 0)
        array.push(month_avg_win, 0.0), array.push(month_avg_loss, 0.0)
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed and array.size(year_pnl) > 0)
            array.pop(year_pnl), array.pop(year_time)
            array.pop(year_wins), array.pop(year_losses)
            array.pop(year_avg_win), array.pop(year_avg_loss)

        array.push(year_pnl, cur_year_pnl[1]), array.push(year_time, time[1])
        array.push(year_wins, 0), array.push(year_losses, 0)
        array.push(year_avg_win, 0.0), array.push(year_avg_loss, 0.0)

    last_computed := barstate.islastconfirmedhistory ? true : last_computed

    // 勝ち取引と負け取引を追跡 / Track winning and losing trades
    if (strategy.closedtrades > 0 and na(strategy.closedtrades[1]) == false)
        closed_profit = strategy.netprofit - strategy.netprofit[1]
        if closed_profit > 0
            if array.size(month_wins) > 0
                wins = array.get(month_wins, array.size(month_wins) - 1) + 1
                avg_win = (array.get(month_avg_win, array.size(month_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(month_wins, array.size(month_wins) - 1, wins)
                array.set(month_avg_win, array.size(month_avg_win) - 1, avg_win)
            if array.size(year_wins) > 0
                wins = array.get(year_wins, array.size(year_wins) - 1) + 1
                avg_win = (array.get(year_avg_win, array.size(year_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(year_wins, array.size(year_wins) - 1, wins)
                array.set(year_avg_win, array.size(year_avg_win) - 1, avg_win)
        else
            if array.size(month_losses) > 0
                losses = array.get(month_losses, array.size(month_losses) - 1) + 1
                avg_loss = (array.get(month_avg_loss, array.size(month_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(month_losses, array.size(month_losses) - 1, losses)
                array.set(month_avg_loss, array.size(month_avg_loss) - 1, avg_loss)
            if array.size(year_losses) > 0
                losses = array.get(year_losses, array.size(year_losses) - 1) + 1
                avg_loss = (array.get(year_avg_loss, array.size(year_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(year_losses, array.size(year_losses) - 1, losses)
                array.set(year_avg_loss, array.size(year_avg_loss) - 1, avg_loss)

    // 月次テーブル / Monthly table
    var monthly_table = table(na)
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_time) + 1, border_width = 1)
        table.cell(monthly_table, 0,  0, "",     bgcolor = #bbbbbb00)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #bbbbbb)
    
        // 年次データの集計 / Collecting yearly data
        var year_total_pnl = array.new_float()
        var year_exp_val = array.new_float()
        
        for yt = 0 to array.size(year_time) - 1
            total_year_wins = 0, total_year_losses = 0
            total_year_avg_win = 0.0, total_year_avg_loss = 0.0
            total_year_pnl = 0.0

            for mt = 1 to 12
                idx = -1
                for j = 0 to array.size(month_time) - 1
                    if year(array.get(month_time, j)) == year(array.get(year_time, yt)) and month(array.get(month_time, j)) == mt
                        idx := j
                        break
                if idx != -1
                    total_year_pnl := total_year_pnl + array.get(month_pnl, idx)
                    total_year_wins := total_year_wins + array.get(month_wins, idx)
                    total_year_losses := total_year_losses + array.get(month_losses, idx)
                    total_year_avg_win := total_year_avg_win + (array.get(month_avg_win, idx) * array.get(month_wins, idx))
                    total_year_avg_loss := total_year_avg_loss + (array.get(month_avg_loss, idx) * array.get(month_losses, idx))
            
            total_year_avg_win := total_year_wins > 0 ? total_year_avg_win / total_year_wins : 0.0
            total_year_avg_loss := total_year_losses > 0 ? total_year_avg_loss / total_year_losses : 0.0
            win_rate = total_year_wins + total_year_losses > 0 ? total_year_wins / (total_year_wins + total_year_losses) : na
            exp_val = win_rate ? (win_rate * total_year_avg_win) - ((1 - win_rate) * math.abs(total_year_avg_loss)) : na
            array.push(year_total_pnl, total_year_pnl)
            array.push(year_exp_val, exp_val)
            
        for yt = 0 to array.size(year_time) - 1
            table.cell(monthly_table, 0,  yt + 1, str.tostring(year(array.get(year_time, yt))), bgcolor = #bbbbbb)
            
            y_color = bg_color(array.get(year_exp_val, yt))
            value_to_display = na(array.get(year_exp_val, yt)) ? "" : str.tostring(math.round(array.get(year_exp_val, yt) * 100, prec))
            table.cell(monthly_table, 13, yt + 1, value_to_display, bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mt = 0 to array.size(month_time) - 1
            m_row = year(array.get(month_time, mt)) - year(array.get(year_time, 0)) + 1
            m_col = month(array.get(month_time, mt))
            
            if array.size(month_wins) > mt and array.size(month_losses) > mt and array.size(month_avg_win) > mt and array.size(month_avg_loss) > mt
                win_rate = array.get(month_wins, mt) / (array.get(month_wins, mt) + array.get(month_losses, mt))
                exp_val = (win_rate * array.get(month_avg_win, mt)) - ((1 - win_rate) * math.abs(array.get(month_avg_loss, mt)))
                m_color = bg_color(exp_val)
                value_to_display = na(exp_val) ? "" : str.tostring(math.round(exp_val * 100, prec))
                table.cell(monthly_table, m_col, m_row, value_to_display, bgcolor = m_color, text_color=color.new(color.white, 0))
            else
                table.cell(monthly_table, m_col, m_row, "", bgcolor = color.new(color.gray, transparency), text_color=color.new(color.white, 0))
// [EOF]