Multifaktor-Quantitative Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-31 13:55:37
Tags:

img

Übersicht

Dies ist eine quantitative Handelsstrategie, die mehrere technische Indikatoren beinhaltet. Sie kombiniert gleitende Durchschnitte, MACD, Bollinger Bands, RSI und andere Indikatoren, um ein multi-Faktor-modellgetriebenes automatisiertes Trading zu implementieren.

Strategie Logik

Die Handelssignale dieser Strategie bestehen aus folgenden Teilen:

  1. Goldenes Kreuz und Todeskreuz von zwei gleitenden Durchschnitten
  2. MACD-Nulllinie-Kreuzungen
  3. Bollinger-Band-Ober- und Unterbahnumkehrungen
  4. Überkaufte und überverkaufte Umkehrungen des RSI

Wenn die oben genannten Indikatoren gleichzeitig Kauf- oder Verkaufssignale ausgeben, trifft die Strategie entsprechende Long- oder Short-Entscheidungen.

Insbesondere wenn der schnelle gleitende Durchschnitt den langsamen überschreitet, die MACD-Histogramme zu steigen beginnen, der RSI aus der Überverkaufszone aufsteigt und der Preis sich der unteren Bollinger Bands nähert, gilt dies als Trendumkehrsignal für einen Long-Eintrag.

Und wenn der schnelle MA unter den langsamen MA überschreitet, beginnen die MACD-Histogramme zu sinken, der RSI fällt aus dem Überkaufbereich und der Preis erreicht die oberen Bollinger-Bänder, wird er als kurzfristige obere Umkehrung für einen kurzen Einstieg angesehen.

Durch die Kombination von Signalen aus mehreren Indikatoren können gefälschte Signale wirksam herausgefiltert und die Stabilität der Strategie verbessert werden.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass ein Multifaktor-Handelsmodell verwendet wird, das die Zuverlässigkeit der Signale, Stabilität und Rentabilität der Strategie erhöht.

  1. Das Multifaktormodell kann Handelssignale untereinander überprüfen und Störungen durch gefälschte Signale wirksam reduzieren.

  2. Indikatoren aus verschiedenen Kategorien können umfassendere Merkmale der Marktbewegungen erfassen und genauere Beurteilungen abgeben.

  3. Die Kombination mehrerer Indikatoren kann die Schwankungen einzelner Indikatoren ausgleichen und eine stabilere Rendite gewährleisten.

  4. Die Indikatoren und ihre Gewichte in der Kombination können flexibel angepasst werden, um die Strategie an die unterschiedlichen Marktbedingungen anzupassen.

Risikoanalyse

Einige Risiken dieser Strategie sollten berücksichtigt werden:

  1. Die komplexe Kombination mehrerer Indikatoren erfordert eine präzise Parameter-Ausrichtung und -Prüfung, da sonst ungültige Signale erzeugt werden können.

  2. Die Leistung eines einzelnen Produktes ist möglicherweise nicht stabil genug, daher sollte ein Portfolio aus geeigneten Produkten aufgebaut werden, um Risiken zu diversifizieren.

  3. Die Größe der Positionen und die Stop-Loss-Mechanismen sollten streng kontrolliert werden, um Verluste unter extremen Marktbedingungen zu begrenzen.

Optimierungsrichtlinien

In einigen Richtungen kann diese Strategie optimiert werden:

  1. Testkombinationen mehrerer Indikatoren zur Ermittlung der optimalen Parameter, wie implizite Volatilität, Volumen usw.

  2. Verwenden von Methoden des maschinellen Lernens, um automatisch optimale Kombinationen von Indikatoren und Parametermengen zu generieren.

  3. Mehr Backtests und Optimierungen in längeren Zeitrahmen durchführen, die Gewichte entsprechend für verschiedene Marktstadien anpassen.

  4. Einbeziehung von Risikomanagementinstrumenten zur strikten Kontrolle von Verlusten bei Einzelgeschäften und Gesamtpositionen.

Schlussfolgerung

Diese Strategie nutzt in vollem Umfang die Vorteile verschiedener technischer Indikatoren und bildet ein Multifaktormodell, das die Genauigkeit der Signale wirksam verbessert.


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

//@version=5
strategy("Математическая Торговая Система с Ишимоку, TP/SL, ADX, RSI, OBV", shorttitle="МТС Ишимоку TP/SL ADX RSI OBV", overlay=true)

is_short_enable = input(0, title="Короткие сделки")
is_long_enable = input(1, title="Длинные сделки")

// Входные параметры для скользящих средних
fast_length = input(21, title="Быстрый период")
slow_length = input(26, title="Медленный период")

// Входные параметры для Ишимоку
tenkan_length = input(9, title="Тенкан-сен")
kijun_length = input(26, title="Киджун-сен")
senkou_length = input(52, title="Сенкоу-спан B")

// Входные параметры для ADX
adx_length = input(14, title="ADX период")
adx_level = input(30, title="ADX уровень")

// Входные параметры для RSI
rsi_length = input(14, title="RSI период")
rsi_overbought = input(70, title="RSI перекупленность")
rsi_oversold = input(30, title="RSI перепроданность")

// Входные параметры для OBV
obv_length = input(14, title="OBV период")

// Вычисление скользящих средних
fast_ma = ta.sma(close, fast_length)
slow_ma = ta.sma(close, slow_length)

// Вычисление Ишимоку
tenkan_sen = ta.sma(high + low, tenkan_length) / 2
kijun_sen = ta.sma(high + low, kijun_length) / 2
senkou_span_a = (tenkan_sen + kijun_sen) / 2
senkou_span_b = ta.sma(close, senkou_length)

// Вычисление ADX
[diplus, diminus, adx_value] = ta.dmi(14, adx_length)

// Вычисление RSI
rsi_value = ta.rsi(close, rsi_length)

// Вычисление OBV
f_obv() => ta.cum(math.sign(ta.change(close)) * volume)
f_obv_1() => ta.cum(math.sign(ta.change(close[1])) * volume[1])
f_obv_2() => ta.cum(math.sign(ta.change(close[2])) * volume[2])
f_obv_3() => ta.cum(math.sign(ta.change(close[3])) * volume[3])
obv_value = f_obv()

price_is_up = close[1] > close[3] 
price_crossover_fast_ma = close > fast_ma
fast_ma_is_up = ta.sma(close[1], fast_length) > ta.sma(close[3], fast_length)
rsi_is_trand_up = ta.rsi(close[1], rsi_length) > ta.rsi(close[3], rsi_length)
rsi_is_upper_50 = rsi_value > 50
obv_is_trand_up = f_obv_1() > f_obv_3() and obv_value > ta.sma(obv_value, obv_length)
is_up = price_is_up and price_crossover_fast_ma and fast_ma_is_up and rsi_is_trand_up and rsi_is_upper_50 and obv_is_trand_up

fast_ma_is_down = close < fast_ma
rsi_is_trend_down =  ta.rsi(close[1], rsi_length) < ta.rsi(close[2], rsi_length)
rsi_is_crossover_sma = rsi_value < ta.sma(rsi_value, rsi_length)
obv_is_trend_down =  f_obv_1() < f_obv_2()
obv_is_crossover_sma = obv_value < ta.sma(obv_value, obv_length)
is_down = fast_ma_is_down and rsi_is_trend_down and rsi_is_crossover_sma and obv_is_trend_down and obv_is_crossover_sma

//----------//
// MOMENTUM //
//----------//
ema8 = ta.ema(close, 8)
ema13 = ta.ema(close, 13)
ema21 = ta.ema(close, 21)
ema34 = ta.ema(close, 34)
ema55 = ta.ema(close, 55)

longEmaCondition = ema8 > ema13 and ema13 > ema21 and ema21 > ema34 and ema34 > ema55
exitLongEmaCondition = ema13 < ema55

shortEmaCondition = ema8 < ema13 and ema13 < ema21 and ema21 < ema34 and ema34 < ema55
exitShortEmaCondition = ema13 > ema55

// ----------  //
// OSCILLATORS //
// ----------- //
rsi = ta.rsi(close, 14)
longRsiCondition = rsi < 70 and rsi > 40
exitLongRsiCondition = rsi > 70

shortRsiCondition = rsi > 30 and rsi < 60
exitShortRsiCondition = rsi < 30

// Stochastic
length = 14, smoothK = 3, smoothD = 3
kFast = ta.stoch(close, high, low, 14)
dSlow = ta.sma(kFast, smoothD)

longStochasticCondition = kFast < 80
exitLongStochasticCondition = kFast > 95

shortStochasticCondition = kFast > 20
exitShortStochasticCondition = kFast < 5

// Логика входа и выхода
longCondition = longEmaCondition and longRsiCondition and longStochasticCondition and strategy.position_size == 0
exitLongCondition = (exitLongEmaCondition or exitLongRsiCondition or exitLongStochasticCondition) and strategy.position_size > 0

shortCondition = shortEmaCondition and shortRsiCondition and shortStochasticCondition and strategy.position_size == 0
exitShortCondition = (exitShortEmaCondition or exitShortRsiCondition or exitShortStochasticCondition) and strategy.position_size < 0

enter_long = (ta.crossover(close, senkou_span_a) or is_up) and longCondition
enter_short = (ta.crossunder(close, senkou_span_a) or is_down) and shortCondition

exit_long = ((ta.crossunder(fast_ma, slow_ma) or ta.crossunder(close, senkou_span_b) or enter_short) or exitLongCondition) 
exit_short = ((ta.crossover(fast_ma, slow_ma) or ta.crossover(close, senkou_span_b) or enter_long) or exitShortCondition)

// Выполнение сделок
if is_long_enable == 1
    strategy.entry("Long", strategy.long, when=enter_long)
    strategy.close("Long", when=exit_long)

if is_short_enable == 1
    strategy.entry("Short", strategy.short, when=enter_short)
    strategy.close("Short", when=exit_short)


Mehr