Les ressources ont été chargées... Je charge...

Tendance à la suite d'une stratégie d'évaluation adaptative de la valeur attendue basée sur des moyennes mobiles croisées

Auteur:ChaoZhang est là., Date: 2024-06-17 16:29:02 Je vous en prie.
Les étiquettes:SMALe taux d'intérêt

img

Résumé

Cette stratégie utilise le croisement de deux moyennes mobiles simples avec des périodes différentes pour déterminer la direction de la tendance et entre dans les transactions lorsqu'une tendance apparaît. En même temps, la stratégie introduit également un panneau de valeur attendue pour calculer et afficher les rendements attendus de la stratégie à différentes échelles de temps, permettant aux utilisateurs d'évaluer mieux la performance de la stratégie. Le panneau de valeur attendue prend en compte des indicateurs clés tels que le taux de gain de la stratégie, le profit moyen et la perte moyenne au cours des périodes historiques, et présente de manière intuitive la performance de la stratégie dans différentes conditions de marché.

Principe de stratégie

Le noyau de cette stratégie est d'utiliser le croisement de deux moyennes mobiles simples avec des périodes différentes (14 jours et 28 jours dans cet exemple) pour déterminer les tendances du marché. Lorsque la moyenne à court terme franchit au-dessus de la moyenne à long terme par le bas, on considère que le marché est entré dans une tendance à la hausse, et la stratégie ouvre une position longue. Inversement, lorsque la moyenne à court terme franchit au-dessous de la moyenne à long terme par le haut, on considère que le marché est entré dans une tendance à la baisse, et la stratégie ouvre une position courte. De cette façon, la stratégie peut s'adapter aux différentes tendances du marché et établir des positions en temps opportun lorsque les tendances semblent capturer les profits apportés par les tendances.

En plus de la détermination de la tendance de base et de la logique de négociation, la stratégie introduit également un panneau de valeur attendue pour calculer et afficher les rendements attendus de la stratégie à différentes échelles de temps (mensuelles et annuelles).

  1. Taux de réussite: proportion des transactions rentables par rapport au total des transactions réalisées au cours de la période
  2. Profit moyen: montant moyen des bénéfices de toutes les opérations rentables réalisées au cours de la période
  3. L'exposition au risque est le montant de la déduction de l'exposition au risque.

À l'aide de ces indicateurs, la valeur attendue de la stratégie pour cette période peut être calculée: Valeur attendue = taux de gain × bénéfice moyen - (1 - taux de gain) × perte moyenne

En affichant les valeurs attendues pour différentes périodes sous forme de feuille de calcul sur le graphique, les utilisateurs peuvent voir en un coup d'œil les performances attendues de la stratégie dans différentes conditions de marché, ce qui permet de mieux comprendre l'applicabilité et le risque de la stratégie.

Analyse des avantages

  1. Une forte adaptabilité aux tendances: en utilisant des croisements de moyennes mobiles pour déterminer les tendances, la stratégie peut ajuster les positions en temps opportun en fonction des différentes tendances du marché afin de s'adapter aux changements du marché.

  2. Évaluation intuitive des performances: le panneau de valeur attendue intégré affiche les rendements attendus de la stratégie à différentes périodes sous forme de feuille de route, permettant aux utilisateurs d'évaluer la performance de la stratégie dans différentes conditions de marché en un coup d'œil.

  3. Considération des indicateurs statistiques clés: le calcul de la valeur attendue tient compte non seulement du taux de gain de la stratégie, mais intègre également l'impact du bénéfice moyen et de la perte moyenne.

  4. Paramètres flexibles: les utilisateurs peuvent définir de manière flexible si l'affichage du panneau de valeur attendue et sa transparence en fonction de leurs besoins.

Analyse des risques

  1. Faibles performances sur les marchés à fourchette: étant donné que la stratégie repose principalement sur les tendances pour générer des bénéfices, les transactions fréquentes dans des conditions de marché à fourchette ou peu claires peuvent entraîner des dérapages et des coûts de transaction importants, ce qui affecte la performance globale de la stratégie.

  2. Limites du calcul de la valeur attendue: Bien que le tableau de la valeur attendue offre un moyen intuitif d'évaluer le rendement de la stratégie, il est toujours basé sur des données historiques pour le calcul.

  3. L'impact de la sélection des paramètres est important: la performance de la stratégie dépend en grande partie de la sélection des périodes de moyenne mobile. Les combinaisons de périodes différentes peuvent donner des résultats commerciaux complètement différents. Si les paramètres sélectionnés ne peuvent pas bien s'adapter aux caractéristiques du marché, la performance réelle de la stratégie peut s'écarter considérablement de la valeur attendue.

Direction de l'optimisation

  1. Introduction d'un plus grand nombre d'indicateurs techniques: sur la base des moyennes mobiles existantes, d'autres indicateurs techniques tels que le MACD et le RSI peuvent être envisagés pour mieux déterminer la force et la pérennité des tendances, améliorant ainsi le calendrier des entrées et des sorties de la stratégie.

  2. Optimiser la gestion des positions: Actuellement, la stratégie adopte une approche de position fixe lorsque des signaux de trading apparaissent.

  3. Ajouter des mécanismes de stop-profit et de stop-loss: l'ajout de mécanismes raisonnables de stop-profit et de stop-loss à la stratégie peut aider la stratégie à verrouiller les bénéfices existants en temps opportun tout en limitant les pertes potentielles. Cela aide à améliorer le rapport risque-rendement de la stratégie et à maintenir une performance relativement stable dans divers environnements de marché.

  4. Optimiser le calcul de la valeur attendue: la méthode de calcul de la valeur attendue peut être encore optimisée, par exemple en tenant compte des coûts de transaction et en introduisant des fenêtres mobiles pour améliorer l'efficacité et la praticité de l'indicateur de valeur attendue.

Résumé

Cette stratégie détermine les tendances du marché en utilisant des croisements de moyennes mobiles et établit des positions en temps opportun lorsque les tendances semblent capturer les bénéfices apportés par les tendances. Dans le même temps, la stratégie introduit également un panneau de valeur attendue intuitif pour afficher les rendements attendus de la stratégie à différentes échelles de temps, fournissant aux utilisateurs plus de références de prise de décision. Bien que la stratégie puisse avoir de mauvaises performances sur les marchés à fourchette et que le calcul de la valeur attendue ait certaines limitations, en introduisant plus d'indicateurs techniques, en optimisant la gestion des positions, en ajoutant des mécanismes de stop-profit et de stop-loss et d'autres mesures, le rapport risque-rendement de la stratégie peut être encore amélioré, lui permettant de mieux s'adapter aux environnements changeants du marché.


/*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]


Relationnée

Plus de