Tests de retour et optimisation de la stratégie RSI

Auteur:ChaoZhang est là., Date: 2023-11-10 à 11h59
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indicateur RSI (Relative Strength Index) pour déterminer les conditions de surachat et de survente. Elle prend des positions contre tendance lorsque le RSI atteint des niveaux de surachat ou de survente pour acheter bas et vendre haut.

La logique de la stratégie

La stratégie utilise l'indicateur RSI uniquement comme signal d'entrée. Elle est longue lorsque le RSI dépasse le point bas (défaut 20), et court lorsque le RSI dépasse le point élevé (défaut 80). Elle négocie un montant fixe à chaque fois (défaut 100) et vise un profit de 1% indépendamment des conditions du marché. Si la perte atteint 3%, elle s'arrête.

La logique de base est la suivante:

  1. Utiliser le RSI pour déterminer la surachat/survente
  2. Passez long lorsque le RSI dépasse 20
  3. Faites du short lorsque le RSI dépasse 80
  4. Commerce fixé à 100 $ à chaque fois
  5. Profit ou stop-loss pour clôturer
  6. En cas de perte, mettre en pause la négociation pendant 24 bars

Comme nous pouvons le voir, la stratégie est très simple et mécanique. Il n'y a pratiquement pas d'espace pour l'optimisation des paramètres. Elle exploite purement les propriétés mathématiques du RSI pour prendre des positions contre tendance autour des régions surachetées / survendues.

Analyse des avantages

Le plus grand avantage de cette stratégie est la simplicité et l'efficacité.

  1. Utilise un seul indicateur RSI, aucune analyse technique complexe n'est nécessaire.
  2. Système entièrement mécanique, exempt d'interférences émotionnelles.
  3. Les bénéfices découlant d'un écart à court terme sans prédire la direction du marché.
  4. Les risques gérés avec stop loss/take profit.

Il implémente également des ratios stop loss/take profit pour verrouiller les profits et contrôler les risques, ainsi que la suspension des transactions pour réduire la fréquence.

Analyse des risques

Les principaux risques de cette stratégie proviennent de:

  1. Incapacité à tirer profit d'une forte tendance du marché. L'indice RSI peut rester dans la zone de surachat/survente pendant une longue période lorsque la tendance persiste.

  2. Le taux de stop loss actuel de 3% peut devoir être réduit à 1-2%.

  3. Une fréquence de trading élevée peut entraîner une sur-trading après des gains.

  4. La concentration des risques à 100 $ devrait être optimisée en pourcentage du capital.

Directions d'optimisation

Sur la base de l'analyse, la stratégie peut être améliorée de la manière suivante:

  1. Ajoutez un filtre de tendance comme MA pour mettre en pause les transactions lorsque la tendance est incertaine.

  2. Optimiser les ratios stop loss/take profit, réduire le stop loss à 1 à 2% et utiliser le take profit dynamique.

  3. Limiter la fréquence des transactions, par exemple au maximum 2 transactions par période.

  4. Taille des transactions basée sur le pourcentage du capital au lieu de 100 $ fixes.

  5. Optimiser les paramètres de l'indice de résistance comme la période, les niveaux de surachat/vente.

  6. Ajouter le dimensionnement des positions pour ne pas augmenter la taille lorsque le capital augmente.

Ces optimisations permettent de réduire les risques et d'améliorer considérablement la stabilité.

Conclusion

En résumé, il s'agit d'une stratégie simple et directe utilisant le RSI pour négocier des conditions de surachat / survente pour une réversion moyenne à court terme. Les avantages sont la simplicité, l'efficacité, aucune prédiction nécessaire, une logique claire, facile à tester. Les inconvénients sont l'incapacité de tirer profit de tendances fortes et de pertes potentielles.


/*backtest
start: 2023-11-02 00:00:00
end: 2023-11-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash)
open_pos = input.int(50000, title = "每次开单资金(usdt)")
rsi_period = input.int(14, title = "rsi周期")
rsi_line      = input.float(20.0,      title='RSI触发线',      step=0.05)
stop_rsi_top_line = input.float(70, title = "顶部rsi止损线")
stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线")
stop_loss_perc = input.float(0.03, title = "止损线")
stop_profit = input.float(0.01, title = "止盈")
loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易")


rsiParam = ta.rsi(close, rsi_period)

var int failedTimes = 0
var bool stopTrade = false

// plot(rsiParam)

if stopTrade
    failedTimes += 1
    if failedTimes == loss_stop_trade_k
        failedTimes := 0
        stopTrade := false



// 获取当前持仓方向
checkCurrentPosition() =>
    strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0

curPosition = checkCurrentPosition()

// 当前持仓成本价
position_avg_price = strategy.position_avg_price


// 当前持单, 触达反向的rsi线,清仓
if curPosition > 0 and rsiParam >= stop_rsi_top_line
    strategy.close_all(comment = "closebuy")

if curPosition < 0 and rsiParam <= stop_rsi_bottom_line
    strategy.close_all(comment = "closesell")


// 止盈止损清仓
if curPosition > 0
    // if (position_avg_price - close) / close >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closebuy")
    //     stopTrade := true
    if (close - position_avg_price) / position_avg_price >= stop_profit
        // 止盈
        strategy.close_all(comment = "closebuy")



if curPosition < 0
    // if (close - position_avg_price) / position_avg_price >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closesell")
    //     stopTrade := true

    if (position_avg_price - close) / close >= stop_profit
        // 止盈
        strategy.close_all(comment = "closesell")


a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)

if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
    stopTrade := true

var float openPrice = 0.0



if rsiParam <= rsi_line and stopTrade == false
	strategy.entry("long", strategy.long, open_pos / close, comment = "long")
    if curPosition == 0
        openPrice := close
    strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy")

if rsiParam >= 100 - rsi_line and stopTrade == false
    strategy.entry("short", strategy.short, open_pos / close, comment = "short")
    if curPosition == 0
        openPrice := close
    strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell")




plot(failedTimes)

Plus de