Stratégies quantitatives basées sur le taux de changement


Date de création: 2023-12-12 15:56:56 Dernière modification: 2023-12-12 15:56:56
Copier: 0 Nombre de clics: 655
1
Suivre
1621
Abonnés

Stratégies quantitatives basées sur le taux de changement

Aperçu

Cette stratégie est basée sur le taux de variation (ROC) pour juger de la tendance du marché et générer des signaux de négociation. L’idée centrale de la stratégie est de suivre la tendance à long terme et d’obtenir des gains supérieurs au marché en prenant des risques plus importants.

Principe de stratégie

Règles d’entrée

  • Si le ROC est supérieur ou égal à zéro, faites plus; si le ROC est inférieur ou égal à zéro, faites moins. Utilisez l’indicateur ROC pour déterminer la direction de la tendance.
  • Pour filtrer les chocs, le signal de transaction est émis uniquement si le ROC est resté sur le même côté pendant deux jours consécutifs.

Règles de stop-loss

Le stop loss est fixé à 6%. Lorsque le stop loss est déclenché, le changement de direction de la position. Cela signifie que nous sommes peut-être du mauvais côté de la tendance et que nous avons besoin d’une opération de revers de stop loss en temps opportun.

Le mécanisme anti-bubble

Si le ROC est supérieur à 200, il s’agit d’une bulle. Lorsque le ROC revient en dessous de la bulle, un signal de coupe est émis. De plus, il est demandé que la bulle dure au moins une semaine.

Gestion des fonds

Utilisez la méthode de la position fixe + augmentation. Chaque fois que 400 \( augmente ou diminue, augmentez ou diminuez la position de 200 \). Cela permet d’utiliser les bénéfices pour la mise en position et ainsi obtenir un plus grand rendement, mais augmente également le retrait.

Analyse des avantages

Il s’agit d’une stratégie qui suit les tendances à long terme.

  1. Suivre la philosophie du trading tendanciel est plus facile pour obtenir des bénéfices positifs à long terme.
  2. L’utilisation de stop-loss pour contrôler les risques peut atténuer l’impact des fluctuations à court terme.
  3. Les mécanismes anti-bubble permettent d’éviter une hausse au sommet du marché.
  4. La gestion des positions fixes et de l’augmentation des capitaux lui a permis d’obtenir une croissance exponentielle dans un contexte de hausse.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Le ROC est vulnérable aux chocs et génère des signaux erronés. Il est possible d’envisager d’ajouter d’autres indicateurs pour un filtrage combiné.
  2. Les bénéfices sont inférieurs à la valeur de la transaction, sans tenir compte des frais de transaction.
  3. Les paramètres anti-bubble sont mal réglés et peuvent facilement être manqués.
  4. La méthode des positions fixes + augmentation augmente le retrait en cas de perte.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Ajouter d’autres indicateurs de jugement pour constituer un système de négociation afin de filtrer les signaux erronés. Par exemple, ajouter des indicateurs tels que la moyenne, la volatilité.
  2. Optimisation des paramètres anti-bubble pour une meilleure précision dans la détection des bulles.
  3. Adapter les positions fixes et les paramètres croissants pour obtenir un meilleur équilibre risque/bénéfice.
  4. Ajout d’un mécanisme d’arrêt automatique des pertes.
  5. Il est important de prendre en compte l’impact des frais de transaction et de définir des critères d’entrée plus réalistes.

Résumer

Dans l’ensemble, il s’agit d’une stratégie de suivi des lignes longues avec le ROC comme indicateur central. Il s’agit d’une stratégie d’engagement positif qui permet d’obtenir des gains supplémentaires au-delà de la marge de risque en prenant des risques plus importants.

Code source de la stratégie
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
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/
// © gsanson66


//This strategy use the Rate of Change (ROC) of the closing price to send enter signal. 
//@version=5
strategy("RATE OF CHANGE BACKTESTING", shorttitle="ROC BACKTESTING", overlay=false, precision=3, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//--------------------------------FUNCTIONS-----------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, loc) =>
    label.new(bar_index, loc, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//----------------------------------USER INPUTS----------------------------------//

//Technical parameters
rocLength = input.int(defval=365, minval=0, title='ROC Length', group="Technical parameters")
bubbleValue = input.int(defval=200, minval=0, title="ROC Bubble signal", group="Technical parameters")
//Risk management
stopLossInput = input.float(defval=10, minval=0, title="Stop Loss (in %)", group="Risk Management")
//Money management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2017 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//-------------------------------------VARIABLES INITIALISATION-----------------------------//

roc = (close/close[rocLength] - 1)*100
midlineConst = 0
var bool inBubble = na
bool shortBubbleCondition = na
equity = strategy.equity - strategy.openprofit
strategy.initial_capital = 50000
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking if we are in a bubble
if roc > bubbleValue and not inBubble
    inBubble := true

//Checking if the bubble is over
if roc < 0 and inBubble
    inBubble := false

//Checking the condition to short the bubble : The ROC must be above the bubblevalue for at least 1 week
if roc[1]>bubbleValue and roc[2]>bubbleValue and roc[3]>bubbleValue and roc[4]>bubbleValue and roc[5]>bubbleValue and roc[6]>bubbleValue and roc[7]>bubbleValue
    shortBubbleCondition := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116), loc=roc)
    strategy.close_all()


//-------------------------------LONG/SHORT CONDITION-------------------------------//

//Long condition
//We reduce noise by taking signal only if the last roc value is in the same side as the current one
if (strategy.position_size<=0 and ta.crossover(roc, midlineConst)[1] and roc>0 and inRange)
    //If we were in a short position, we pass to a long position
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    stopLoss = close * (1-stopLossInput/100)
    strategy.exit("Long Risk Managment", "Long", stop=stopLoss)

//Short condition
//We take a short position if we are in a bubble and roc is decreasing
if (strategy.position_size>=0 and ta.crossunder(roc, midlineConst)[1] and roc<0 and inRange) or 
     (strategy.position_size>=0 and inBubble and ta.crossunder(roc, bubbleValue) and shortBubbleCondition and inRange)
    //If we were in a long position, we pass to a short position
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    stopLoss = close * (1+stopLossInput/100)
    strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//--------------------------------RISK MANAGEMENT--------------------------------------//

//We manage our risk and change the sense of position after SL is hitten
if strategy.position_size == 0 and inRange
    //We find the direction of the last trade
    id = strategy.closedtrades.entry_id(strategy.closedtrades-1)
    if id == "Short"
        qty = cashOrder/close
        strategy.entry("Long", strategy.long, qty)
        stopLoss = close * (1-stopLossInput/100)
        strategy.exit("Long Risk Managment", "Long", stop=stopLoss)
    else if id =="Long"
        qty = cashOrder/close
        strategy.entry("Short", strategy.short, qty)
        stopLoss = close * (1+stopLossInput/100)
        strategy.exit("Short Risk Managment", "Short", stop=stopLoss)


//---------------------------------PLOTTING ELEMENTS---------------------------------------//

//Plotting of ROC
rocPlot = plot(roc, "ROC", color=#7E57C2)
midline = hline(0, "ROC Middle Band", color=color.new(#787B86, 25))
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(rocPlot, midLinePlot, 40, 0, top_color = strategy.position_size>0 ? color.new(color.green, 0) : strategy.position_size<0 ? color.new(color.red, 0) : na, bottom_color = strategy.position_size>0 ? color.new(color.green, 100) : strategy.position_size<0 ? color.new(color.red, 100) : na,  title = "Positive area")
fill(rocPlot, midLinePlot, 0,  -40,  top_color = strategy.position_size<0 ? color.new(color.red, 100) : strategy.position_size>0 ? color.new(color.green, 100) : na, bottom_color = strategy.position_size<0 ? color.new(color.red, 0) : strategy.position_size>0 ? color.new(color.green, 0) : na, title = "Negative area")