Outil d'analyse de stratégie dynamique

Auteur:ChaoZhang est là., Date: 2023-10-13 15:54:35 Je suis désolé
Les étiquettes:

Résumé

L'idée principale de cette stratégie est de simuler le trading en temps réel, de collecter des données de trading hebdomadaires et de présenter les statistiques dans un tableau pour un examen plus intuitif de la performance de la stratégie.

La logique de la stratégie

  1. Définir les heures de début et de fin de la période de calcul.

  2. Définissez la précision des statistiques et le nombre de semaines dans chaque groupe.

  3. Simuler la stratégie RSI pour les entrées et les sorties.

  4. Définir des variables pour le tableau des statistiques.

  5. Calculer le résultat pour la période en cours.

  6. Si la période change et que le trading est activé, enregistrer l'heure et le résultat pour cette période.

  7. Si c'est la dernière barre et que le trading est activé, enregistrer l'heure et le résultat de la période en cours.

  8. Si la période change et que la négociation est désactivée, enregistrer l'heure et le résultat de la période précédente.

  9. Trouvez les résultats les plus élevés et les plus bas.

  10. Rendez le tableau des statistiques.

  • Calculer d'abord le nombre total de périodes statistiques

  • Iterer à travers chaque période, rendre les en-têtes, le temps et les résultats

  • Calculer le résultat cumulé pour chaque groupe

  • Résultats positifs et négatifs en code couleur

Analyse des avantages

  • Peut observer les résultats hebdomadaires en temps réel pour une évaluation rapide de la stratégie

  • Présentation intuitive des résultats pour des informations claires

  • Aide à identifier les périodes de mauvaise performance pour l'ajustement de la stratégie

  • Convient pour suivre les gains cumulés pour les stratégies à long terme

  • Peut comparer les styles de négociation à travers différentes périodes

  • Précision et groupes personnalisables pour répondre à différents besoins

  • Code simple et clair, facile à comprendre et à étendre

Analyse des risques

  • La stratégie est basée sur le RSI, qui présente une tendance inhérente à la suite de

  • Les coûts de négociation peuvent avoir une incidence significative sur les résultats réels

  • Les données des tests antérieurs peuvent ne pas refléter les conditions réelles du marché

  • Le capital en défaut dans le backtest peut ne pas correspondre à la taille du compte réel

  • Évitez le surajustement en réglant aveuglément les paramètres basés sur des statistiques

Peut incorporer plus d'indicateurs pour la tendance et optimiser les entrées et les sorties pour améliorer la stratégie de base du RSI. Utiliser les coûts de négociation réels dans le trading en direct. Ajouter du hasard à la taille du capital dans le backtest. Maintenir le scepticisme au lieu d'un sur-ajustement basé sur les statistiques.

Directions d'optimisation

  • Envisager d'ajouter un stop loss pour limiter la baisse

  • Optimiser les paramètres RSI tels que les niveaux de surachat et de survente

  • Essayez différentes fréquences de négociation comme intraday vs détention mensuelle

  • Incorporer plus d'indicateurs pour la tendance et le calendrier

  • Ajouter la logique de prise de profit

  • Optimiser les paramètres statistiques

  • Élargir pour suivre plusieurs actifs

Les stops peuvent mieux gérer le risque/récompense. Le réglage RSI améliore le taux de gain. Plus d'indicateurs et de fréquences rendent la stratégie robuste. Le réglage statistique met en évidence des données importantes. L'expansion à plusieurs actifs donne une vue complète.

Résumé

L'objectif est de recueillir des résultats périodiques pour une visualisation statistique intuitive afin de juger rapidement des performances dans le temps. Cela fournit des données pour optimiser les stratégies. Les points forts incluent les résultats hebdomadaires en temps réel, la clarté et l'extensibilité. Méfiez-vous de la dépendance excessive et de l'ajustement des courbes aux sorties statistiques. Utilisez rationnellement la logique de la stratégie de base pour les idées, et non comme base pour les changements.


/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// strategy('Strategy weekly results as numbers v1', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=25, commission_type=strategy.commission.percent, commission_value=0.04)

after = input(title='Trade after', defval=timestamp('01 Jan 2019 00:00 UTC'), tooltip="Strategy will be executed after this timestamp. The statistic table will include only periods after this date.")
before = input(title='Trade before', defval=timestamp('31 Dec 2024 23:59 UTC'), tooltip="Strategy will be executes before this timestamp. The statistic table will include only periods before this date.")

statisticPrecision = input.int(title='Statistic precision', group='Statistic visualisation', defval=1, tooltip="Defines how many digits should be rendered in every statistic cell.")
statisticGroupSize = input.int(title='Statistic group size', group='Statistic visualisation', defval=12, tooltip="Defines how many cells should be in one group inside the statistic table.")

// determinet whether the starategy should be traded between the period
isTradeEnabled = true


// *******************************************************************************************
// Core strategy simulation logic
// *******************************************************************************************
// calculate rsi strategy emulation data
rsiEmulationData = ta.rsi(close, 7)
rsiEmulationCrossover = ta.crossover(rsiEmulationData, 70)
rsiEmulationCrossunder = ta.crossunder(rsiEmulationData, 30)

// entry loogic based on the rsi calculations
if (isTradeEnabled and rsiEmulationCrossover)
    strategy.entry('Long', strategy.long)
if (isTradeEnabled and rsiEmulationCrossunder)
    strategy.entry('Short', strategy.short)


// *******************************************************************************************
// Weekly statistics table
// *******************************************************************************************
// define statistic variables
var statisticTable = table(na)
var statisticPeriodTime = array.new_int(0)
var statisticPeriodResult = array.new_float(0)
var statisticIsLatestCalculated = bool(na)
var statisticResultHighest = float(na)
var statisticResultLowest = float(na)
var statisticColorGray = color.new(color.gray, transp = 60)
var statisticColorGreen = color.new(color.green, transp = 60)
var statisticColorRed = color.new(color.red, transp = 60)

// claculate current period result
barResult = not na(strategy.equity[1])
             ? (strategy.equity / strategy.equity[1] - 1) : 0
isPeriodChanged = not na(time[1]) and weekofyear(time) != weekofyear(time[1])
currentPeriodResult = 0.0
currentPeriodResult := not na(currentPeriodResult[1]) and not isPeriodChanged
                       ? ((1 + currentPeriodResult[1]) * (1 + barResult) - 1) : 0.0

// initialise highest and lowest results variables
statisticResultHighest := na(statisticResultHighest) ? currentPeriodResult : statisticResultHighest
statisticResultLowest := na(statisticResultLowest) ? currentPeriodResult : statisticResultLowest

// search for highest and lowest results
statisticResultHighest := currentPeriodResult > statisticResultHighest ? currentPeriodResult : statisticResultHighest
statisticResultLowest := currentPeriodResult < statisticResultLowest ? currentPeriodResult : statisticResultLowest

// new week while trade is active
if isPeriodChanged and isTradeEnabled
    timeCalculated = time - 1000 * 60 * 60 * 24 * 7
    resultCalculated = currentPeriodResult[1]
    statisticIsLatestCalculated := false

    array.push(statisticPeriodTime, timeCalculated)
    array.push(statisticPeriodResult, resultCalculated)

// latest bar while trade is active
if barstate.islast and isTradeEnabled
    timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) - 2)
    resultCalculated = currentPeriodResult

    array.push(statisticPeriodTime, timeCalculated)
    array.push(statisticPeriodResult, resultCalculated)

// new week after trade disabled
if isPeriodChanged and not isTradeEnabled and not na(statisticIsLatestCalculated) and not statisticIsLatestCalculated
    timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) + 5)
    resultCalculated = currentPeriodResult[1]
    statisticIsLatestCalculated := true

    array.push(statisticPeriodTime, timeCalculated)
    array.push(statisticPeriodResult, resultCalculated)

// render statistics table
if barstate.islast
    statisticLength = array.size(statisticPeriodResult)
    statisticTableSteps = math.floor(statisticLength / statisticGroupSize) + (statisticLength % statisticGroupSize != 0 ? 1 : 0)
    statisticTable := table.new(position.bottom_right, columns = statisticGroupSize + 2, rows = statisticTableSteps + 1, border_width = 1)

    // render headers
    for i = 0 to (statisticGroupSize - 1)
        statisticHeaderContent = str.tostring(i + 1)
        table.cell(statisticTable, 1 + i, 0, statisticHeaderContent, bgcolor = statisticColorGray)

    // render time points
    for i = 0 to (statisticTableSteps - 1)
        statisticPointContent = str.format("{0,date,medium}", array.get(statisticPeriodTime, i * statisticGroupSize))
        table.cell(statisticTable, 0, 1 + i, statisticPointContent, bgcolor = statisticColorGray)

    // render the result
    statisticResultCummulative = 0.0
    for i = 0 to (array.size(statisticPeriodTime) - 1)
        statisticColumn = 1 + i % statisticGroupSize
        statisticRow = 1 + math.floor(i / statisticGroupSize)

        statisticResult = array.get(statisticPeriodResult, i)
        statisticResultCummulative := (i % statisticGroupSize == 0) ? 0.0 : statisticResultCummulative
        statisticResultCummulative := (1 + statisticResultCummulative) * (1 + statisticResult) - 1

        statisticResultColor = statisticResult > 0 ? statisticColorGreen : statisticColorRed
        table.cell(statisticTable, statisticColumn, statisticRow, str.tostring(math.round(statisticResult * 100, statisticPrecision)), bgcolor = statisticResultColor)

        // if it is the last item of the row or data array
        isStatisticLastOfTheRow = ((i + 1) % statisticGroupSize) == 0
        isStatisticLastOfTheData = i == (statisticLength - 1)
        if (isStatisticLastOfTheRow or isStatisticLastOfTheData)
            resultsTableCummulativeCellColor = statisticResultCummulative > 0 ? statisticColorGreen : statisticColorRed
            resultsTableCummulativeCellContent = str.tostring(math.round(statisticResultCummulative * 100, statisticPrecision))
            table.cell(statisticTable, 1 + statisticGroupSize, statisticRow, resultsTableCummulativeCellContent, bgcolor = resultsTableCummulativeCellColor)

Plus de