Quantitative Strategie zur Kombination von Mittelumkehrung und Trendverfolgung

Schriftsteller:ChaoZhang, Datum: 14.9.2023 Uhr
Tags:

In diesem Artikel wird eine quantitative Handelsstrategie detailliert erläutert, die sowohl Mittelumkehr- als auch Trendfolgetechniken kombiniert.

I. Strategische Logik

Die Strategie verwendet hauptsächlich den einfachen gleitenden Durchschnitt und den RSI-Indikator, um Handelssignale zu generieren:

  1. Wenn der Preis unter der 200-Perioden-SMA liegt, wird der aktuelle Markt als Abwärtstrend beurteilt.

  2. Wenn der RSI unter 20 liegt, werden Gegentrend-Reversionsgeschäfte durchgeführt.

  3. Wenn der Preis über der 200-Perioden-SMA liegt, beurteilt er den aktuellen Markt als Aufwärtstrend.

  4. Wenn der Preis über der SMA steigt, müssen Trends gefolgt werden.

  5. Ausgänge werden ausgelöst, wenn der RSI 80 übersteigt oder der Preis um einen bestimmten Prozentsatz unter den SMA fällt.

  6. Die Positionsdimensionierung für die mittlere Umkehrung und den Trend kann separat angepasst werden.

Die Strategie kombiniert mittlere Umkehr- und Trendfolgetechniken und wendet sie in verschiedenen Marktstadien an.

II. Vorteile der Strategie

Die wichtigsten Vorteile sind:

  1. Die Kombination zweier Techniken verbessert die Anpassungsfähigkeit der Strategie.

  2. Es kann Handelsmöglichkeiten in Trend- und Schwellenmärkten finden.

  3. Die Risiken können durch Anpassung der Positionsgröße kontrolliert werden.

  4. Einfache Parameter-Einstellungen erleichtern die Implementierung.

III. Potenzielle Risiken

Die Risiken sind jedoch:

  1. Indikatoren wie SMA und RSI sind anfällig für falsche Ausbrüche.

  2. Der Wechsel zwischen zwei Moden kann verzögert sein.

  3. Für langfristige Gewinne müssen gewisse Abzüge ertragen werden.

IV. Zusammenfassung

Zusammenfassend wird in diesem Artikel eine quantitative Strategie erklärt, die mittlere Umkehrung und Trendfolgetechniken verwendet. Es kann in verschiedenen Marktstadien gehandelt werden, um die Anpassungsfähigkeit zu verbessern.


/*backtest
start: 2022-09-07 00:00:00
end: 2023-04-05 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/
// © I11L

//@version=5
strategy("Mean Reversion and Trendfollowing", overlay=true, pyramiding=1, default_qty_value=100000, initial_capital=100000, default_qty_type=strategy.cash, process_orders_on_close=false, calc_on_every_tick=false)

// Input for the starting date
start_date = input(timestamp("1 Feb 2000 12:00"), title="Starting Date")
enableMeanReversion = input.bool(true)
enableTrendfollowing = input.bool(true)
trendPositionFactor = input.float(1)
meanReversionPositionFactor = input.float(0.5)

// Convert the input string to a timestamp
start_ts = timestamp(year(start_date), month(start_date), dayofmonth(start_date), 0, 0)

// Check if the current bar's time is greater than or equal to the start timestamp
start_condition = time >= start_ts

var tradeOrigin = ""

sma200 = ta.sma(close,200)
rsi2 = ta.rsi(close,2)

isMeanReversionMode = close < sma200 or not(enableTrendfollowing)
isTrendfollowingMode = close > sma200 or not(enableMeanReversion)

isRsiBuy = rsi2 < 20 and enableMeanReversion
isRsiClose = rsi2 > 80 and enableMeanReversion

isSmaBuy = close > sma200 and enableTrendfollowing
isSmaClose = close < sma200 * 0.95 and enableTrendfollowing

isBuy = (isMeanReversionMode and isRsiBuy) or (isTrendfollowingMode and isSmaBuy)

positionSizeFactor = isSmaBuy ? trendPositionFactor : meanReversionPositionFactor

// Only execute the strategy after the starting date
if (start_condition)
    if (isBuy and strategy.opentrades == 0)
        tradeOrigin := isSmaBuy ? "SMA" : "RSI"
        strategy.entry("My Long Entry Id", strategy.long, qty=(strategy.equity / close) * positionSizeFactor, comment=str.tostring(positionSizeFactor))
    isClose = tradeOrigin == "SMA" ? isSmaClose : isRsiClose
    if (isClose)
        strategy.exit("Exit", limit = close)

plot(sma200)
plot(sma200 * 0.95, color=color.orange)

Mehr