Backtesting und Optimierung der RSI-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-10 11:59:40
Tags:

img

Übersicht

Diese Strategie basiert auf dem RSI (Relative Strength Index) Indikator, um überkaufte und überverkaufte Bedingungen zu bestimmen. Es nimmt Gegen-Trend-Positionen, wenn der RSI überkaufte oder überverkaufte Ebenen erreicht, um niedrig zu kaufen und hoch zu verkaufen. Die Strategie ist einfach und effektiv und profitiert von kurzfristigen überkauften und überverkauften Szenarien auf dem Markt.

Strategie Logik

Die Strategie verwendet den RSI-Indikator ausschließlich als Einstiegssignal. Sie geht lang, wenn der RSI unter den Tiefpunkt (Standard 20) überschreitet, und geht kurz, wenn der RSI über den Höchstpunkt (Standard 80) überschreitet. Sie handelt jedes Mal mit einem festen Betrag (Standard 100) und zielt unabhängig von den Marktbedingungen auf einen Gewinn von 1% ab. Wenn der Verlust 3% erreicht, stoppt sie. Um die Handelsfrequenz zu kontrollieren, stoppt die Strategie den Handel nach einem Verlusthandel für 24 Bars.

Die Kernlogik lautet:

  1. Verwenden Sie den RSI zur Bestimmung von Überkauft/Überverkauft
  2. Long gehen, wenn der RSI unter 20 fällt
  3. Kurz gehen, wenn der RSI über 80 liegt
  4. Der Handel ist jedes Mal auf 100 Dollar festgesetzt.
  5. Gewinn oder Stop-Loss zum Abschluss
  6. Im Falle eines Verlustes wird der Handel für 24 Bar pausiert.

Wie wir sehen können, ist die Strategie sehr einfach und mechanisch. Es gibt kaum Raum für Parameteroptimierung. Sie nutzt lediglich die mathematischen Eigenschaften des RSI, um Gegentrendpositionen um überkaufte/überverkaufte Regionen zu ergreifen.

Analyse der Vorteile

Der größte Vorteil dieser Strategie ist die Einfachheit und Effizienz.

  1. Verwendet einen einzigen Indikator RSI, keine komplexe technische Analyse erforderlich.
  2. Voll mechanisches System, frei von emotionalen Störungen.
  3. Gewinne aus kurzfristigen Abweichungen ohne Vorhersage der Marktrichtung.
  4. Risikomanagement mit Stop Loss/Take Profit.

Es implementiert auch Stop-Loss / Take-Profit-Verhältnisse, um Gewinne zu erzielen und Risiken zu kontrollieren, sowie Handelsunterbrechungen, um die Häufigkeit zu reduzieren. Dies maximiert die Belohnung und minimiert die Risiken.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind folgende:

  1. Der RSI kann bei anhaltendem Trend für längere Zeit in der Überkauf/Überverkaufszone bleiben.

  2. Ein zu großer Stop-Loss kann zu einem übermäßigen Verlust führen.

  3. Hohe Handelsfrequenz kann zu einem Überhandel nach Gewinnen führen.

  4. Die Konzentration der Risiken auf 100 Dollar sollte sich auf den Anteil des Kapitals optimieren.

Optimierungsrichtlinien

Auf der Grundlage der Analyse kann die Strategie wie folgt verbessert werden:

  1. Fügen Sie einen Trendfilter wie MA hinzu, um den Handel zu pausieren, wenn der Trend unklar ist.

  2. Optimieren Sie die Stop-Loss/Take-Profit-Verhältnisse, reduzieren Sie den Stop-Loss auf 1-2% und verwenden Sie dynamische Take-Profit-Verhältnisse.

  3. Grenzen für die Häufigkeit des Handels, z. B. max. 2 Trades pro Zeitraum.

  4. Größe der Transaktionen basiert auf % des Kapitals anstelle von 100 USD.

  5. Optimieren Sie die RSI-Parameter wie Periode, Überkauf-/Verkaufsniveau.

  6. Zusätzliche Positionsgröße, um bei Kapitalerhöhungen nicht zu erhöhen.

Mit diesen Optimierungen können die Risiken verringert und die Stabilität erheblich verbessert werden.

Schlussfolgerung

Zusammenfassend ist dies eine einfache und unkomplizierte Strategie, bei der der RSI verwendet wird, um überkaufte/überverkaufte Bedingungen für eine kurzfristige Durchschnittsumkehr zu handeln. Die Vorteile sind Einfachheit, Effizienz, keine Vorhersage erforderlich, klare Logik, leicht zu testen. Die Nachteile sind die Unfähigkeit, bei starken Trends und potenziellen Verlusten zu profitieren. Mit Ergänzungen wie Trendfilter, optimierten Parametern, Positionsgrößen usw. kann er für Stabilität und Rentabilität weiter verbessert werden. Die Logik ist innovativ und wertvoll für den praktischen Handel, wenn sie richtig angewendet wird.


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

Mehr