Système de suivi des tendances de rééquilibrage dynamique de la position

Auteur:ChaoZhang est là., Date: 2024-01-26 14:41:08 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie intègre le système de croisement de moyenne mobile exponentielle et le système de trading de tortue, deux stratégies de trading systématique populaires.

La logique de la stratégie

La stratégie comporte deux sous-stratégies: la stratégie de tendance et la stratégie de rupture.

La stratégie de tendance utilise l'EMA rapide et les croisements de l'EMA lente comme signaux de trading. La période de l'EMA rapide est définie par l'utilisateur et la période de l'EMA lente est 5 fois celle de l'EMA rapide. Le signal est généré en divisant la différence de l'EMA par l'écart type de rendement de 252 périodes, qui est ajusté en fonction de la volatilité pour produire des signaux plus fiables.

La stratégie de rupture utilise comme référence la moyenne des prix les plus élevés et les plus bas sur une période de rétrospective fixe.

La taille de la position est basée sur la volatilité récente des prix et l'objectif de risque annuel défini par l'utilisateur. Une taille plus grande est prise lorsque la volatilité est faible tandis qu'une taille plus petite est prise lorsque la volatilité est élevée. Cela réalise une gestion dynamique de la position avec un ajustement du risque.

Les arrêts durs sont définis comme des multiples de la plage moyenne réelle.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. La combinaison des sous-stratégies de suivi des tendances et de rupture s'adapte à différents environnements de marché avec une forte robustesse.

  2. L'application de techniques avancées de dimensionnement des positions et de gestion des risques permet une gestion dynamique des positions et un contrôle efficace des risques.

  3. Les positions ajustées en fonction de la volatilité récente et de l'objectif de risque annuel permettent de maintenir un risque de portefeuille relativement stable dans les régimes à volatilité élevée/faible.

  4. La fixation d'un stop loss basé sur la fluctuation réelle des prix évite de petites pertes inutiles lors d'un stop run.

  5. L'ajustement de l'arrêt de trail en temps réel suit de manière flexible les tendances pour comptabiliser les bénéfices et s'arrête en temps opportun.

Analyse des risques

Les principaux risques de cette stratégie sont les suivants:

  1. Les différents paramètres ont un impact considérable sur les performances de la stratégie, de sorte que des tests complets sont nécessaires pour trouver les paramètres optimaux.

  2. Des arrêts fréquents dans des tendances agitées.

  3. Sensibilité au capital initial et aux coûts de négociation: un capital initial insuffisant et des coûts de négociation élevés ont un impact négatif sur la rentabilité.

  4. La dépendance à l'égard d'estimations précises de la volatilité pour la dimensionnement des positions et le contrôle des risques.

Directions d'optimisation

Les principales orientations d'optimisation sont les suivantes:

  1. Rechercher des ensembles de paramètres optimaux par le biais de tests rétroactifs avec des ensembles de données historiques plus importants.

  2. Améliorer les mécanismes d'arrêt en testant divers arrêts tels que les arrêts de mouvement, les arrêts de temps, les arrêts de volatilité, etc.

  3. Optimiser la taille des positions et la gestion des risques en testant différentes cibles de risque pour trouver le meilleur profil risque-rendement.

  4. Essayez plus d'indicateurs auxiliaires pour améliorer la précision du signal et la robustesse de la stratégie.

  5. Testez différentes périodes de détention en aidant les décisions avec des signaux plus longs afin d'améliorer la précision de l'attribution des positions.

Conclusion

Cette stratégie intègre deux grandes catégories de stratégies de trading: le suivi de tendance et les ruptures. En appliquant des techniques avancées d'ajustement dynamique de position, elle contrôle efficacement le risque tout en suivant les mouvements du marché vers le profit. Elle démontre un fort potentiel de profit et mérite d'être testée et optimisée.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Crunchster1

//@version=5
strategy(title="Crunchster's Turtle and Trend System", shorttitle="Turtle Trend", overlay=true, slippage=10, pyramiding=1, precision = 4, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_value = 0.1, initial_capital = 1000, commission_value = 0.06, process_orders_on_close = true)

// Inputs and Parameters
src = input(close, 'Source', group='Strategy Settings')
length = input.int(title="Lookback period for fast EMA", defval=10, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the fast exponential moving average. The slow EMA is 5x the fast EMA length')
blength = input.int(title="Lookback period for Breakout", defval=20, minval=5, step=5, group='Strategy Settings')

long = input(true, 'Long', inline='08', group='Strategy toggle')
short = input(true, 'Short', inline='08', group='Strategy toggle', tooltip='Toggle long/short strategy on/off')

EMAwt = input(false, 'Trend', inline='01', group='Strategy toggle')
breakwt = input(true, 'Breakout', inline='01', group='Strategy toggle', tooltip='Toggle trend/breakout strategy on/off')

stopMultiple = input.float(2, 'Stop multiple', step=0.5, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price')
trail = input.int(10, 'Trail lookback', step=5, group='Risk Management Settings', tooltip='Lookback period for the trailing stop')
lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size')
riskT = input.float(15, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly')
comp = input(true, 'Compounding', inline='09', group='Risk Management Settings')
Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound')

// Backtesting period
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range')
FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range')
FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range')
ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range')
ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period')

start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window = time >= start and time <= finish

// Breakout strategy
lower = ta.lowest(low[1], blength)
upper = ta.highest(high[1], blength)
basis = math.avg(upper, lower)
signal = 20*(close - basis) / (upper - lower)

// Trend strategy
fEMA = ta.ema(close[1], length)
sEMA = ta.ema(close[1], length*5)
emadiff = fEMA - sEMA
nemadiff = 5*emadiff/(ta.stdev(close - close[1], 252))

//Risk Management formulae
strategy.initial_capital = 50000
tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range
stopL = ta.sma(tr, 14) //Average true range
stdev = ta.stdev(close-close[1], 14) //volatility of recent returns
maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit
annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe

risk = 1.1
if comp
    risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding
else
    risk := strategy.initial_capital

shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target
if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage
    shares := lev*maxcapital/close

//To set the price at the entry point of trade
Posopen() =>
    math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0

var float openN = na
if Posopen()
    openN := stopL

// Trailing stop
tlower = ta.lowest(low[1], trail)
tupper = ta.highest(high[1], trail)
tbasis = math.avg(tupper, tlower)
tsignal = 20*(close - tbasis) / (tupper - tlower)

// Strategy Rules
if EMAwt
    if long
        longCondition2 = (nemadiff >2 and nemadiff[1] <2) and window
        exitlong = tsignal <= -10
        if (longCondition2)
            strategy.entry('Trend Long!', strategy.long, qty=shares)
        if strategy.position_size > 0    
            strategy.exit('Stop Long', from_entry = 'Trend Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
        if (exitlong)
            strategy.close('Trend Long!', immediately = true)

    if short
        shortCondition2 = (nemadiff <-1 and nemadiff[1] >-1) and window
        exitshort = tsignal >= 10
        if (shortCondition2)
            strategy.entry('Trend Short!', strategy.short, qty=shares)
        if strategy.position_size < 0   
            strategy.exit('Stop Short', from_entry = 'Trend Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
        if (exitshort)
            strategy.close('Trend Short!', immediately = true)

if breakwt
    if long
        longCondition1 = (signal >= 10) and window
        exitlong = tsignal <= -10
        if (longCondition1)
            strategy.entry('Break Long!', strategy.long, qty=shares)
        if strategy.position_size > 0    
            strategy.exit('Stop Long', from_entry = 'Break Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
        if (exitlong)
            strategy.close('Break Long!', immediately = true)

    if short
        shortCondition1 = (signal <= -10) and window
        exitshort = tsignal >= 10
        if (shortCondition1)
            strategy.entry('Break Short!', strategy.short, qty=shares)
        if strategy.position_size < 0   
            strategy.exit('Stop Short', from_entry = 'Break Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
        if (exitshort)
            strategy.close('Break Short!', immediately = true)

// Visuals of trend and direction
plot(nemadiff, title='EMA Forecast', color=color.black, display=display.none)
plot(ta.sma(ta.median(math.sqrt(math.pow(nemadiff,2)), 700), 350), 'Forecast mean', color=color.rgb(245, 0, 0), display=display.none)

MAColor = fEMA > sEMA ? #00ff00 : #ff0000
MA1 = plot(fEMA, title='Fast EMA', color=MAColor)
MA2 = plot(sEMA, title='Slow EMA', color=MAColor)
fill(MA1, MA2, title='Band Filler', color=MAColor)

Plus de