Die relative Dynamikstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-29 08:38:04
Tags:

img

Übersicht

Die relative Dynamikstrategie vergleicht die Dynamik einzelner Aktien und Indizes, um die relative Stärke von Aktien auf dem breiteren Markt zu beurteilen. Sie kauft, wenn die Aktiendynamik höher ist als die des Indizes, und verkauft, wenn die Aktiendynamik niedriger ist als die des Indizes, um den Wachstumshoch einzelner Aktien zu erfassen.

Grundsätze

Die Kernlogik dieser Strategie besteht darin, die relative Stärke einzelner Aktien gegenüber dem Markt zu beurteilen, insbesondere:

  1. Berechnen Sie die Rendite über einen bestimmten Zeitraum als Momentum der Aktie
  2. Berechnung der Indexrendite über den gleichen Zeitraum wie die Indexdynamik
  3. Verwenden Sie gleitenden Durchschnitt, um die Aktien- und Indexdynamik zu glätten
  4. Wenn der gleitende Durchschnitt der Aktiendynamik über dem des Indizes überschreitet, gilt die Aktiendynamik als stärker als der Gesamtmarkt - das ist das Kaufsignal
  5. Wenn der gleitende Durchschnitt des Aktienmomentums unter den gleitenden Durchschnitt des Indexmomentums fällt, gilt der Aktienmomentum als schwächer und löst das Verkaufssignal aus.

Durch diese Logik können wir Aktien kaufen, wenn ihr Wachstum blüht und verkaufen, wenn die Wachstumsdynamik abnimmt, und überschüssige Renditen während der Wachstumsspitze der Aktien einfangen.

Analyse der Vorteile

Die wichtigsten Vorteile der Strategie der relativen Dynamik:

  1. Kann dynamisch den Wachstumsspitzenwert von Aktien erfassen, ohne sich auf spezifische Marktbedingungen zu konzentrieren - nur kaufen, wenn das Wachstum der Aktien den Gesamtmarkt übertrifft
  2. Durch die Glättung mit gleitenden Durchschnitten werden kurzfristige Schwankungen ausgeschlossen und die Signalzuverlässigkeit erhöht
  3. Einfache, leicht verständliche und zu bedienende direkte Kauf- und Verkaufsbedingungen
  4. Flexibilität bei der Konfiguration des Zeitraums für die Berechnung des relativen Impuls und die Optimierung

Risikoanalyse

Die Strategie der relativen Dynamik birgt auch einige Risiken:

  1. Die Lagerbestände können nach dem Ende des Wachstumspikes zurückgehen, was ein unzureichendes Gewinnrisiko darstellt
  2. Relative Impulssignale können falsch sein und einen gefälschten anstelle eines echten Peaks identifizieren
  3. Sie müssen den Stop-Loss einstellen, um den maximalen Verlust zu kontrollieren.

Diese Risiken können durch angemessene Gewinnentnahme, Stop-Losses, Parameter-Tuning usw. verwaltet werden.

Optimierungsrichtlinien

Die relative Dynamikstrategie kann hauptsächlich aus folgenden Aspekten optimiert werden:

  1. Test verschiedene Zeiträume für die Berechnung Momentum, um das optimale zu finden
  2. Versuchen Sie verschiedene Arten und Längen von gleitenden Durchschnitten für die besten Parameter
  3. Fügen Sie Volumenfilter hinzu, um falsche Ausbrüche aufgrund mangelnder Dynamik zu vermeiden
  4. Einbeziehung anderer Indikatoren zur Bestätigung des optimalen Eintrittszeitraums

Schlussfolgerung

Die relative Dynamikstrategie erfasst die überschüssigen Wachstumsphasen einzelner Aktien gegenüber dem Gesamtmarkt, um Alpha zu generieren.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-01-28 00:00:00
period: 15m
basePeriod: 5m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Relative Returns Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

index_ticker=input("BTC_USDT:swap")
Loopback = input(40, step=20)
useStopAndIndexReturns = input(true)
useStopAndIndexReturnsMa = input(true)

useDifference = not useStopAndIndexReturns

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MALength = input(10, minval=10,step=10)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

index = f_secureSecurity(index_ticker, '1D', close, 0)
stock_return = (close - close[Loopback])*100/close
index_return = (index - index[Loopback])*100/index

stock_return_ma = f_getMovingAverage(stock_return, MAType, MALength)
index_return_ma = f_getMovingAverage(index_return, MAType, MALength)
relativeReturns = stock_return - index_return
relativeReturns_ma = f_getMovingAverage(relativeReturns, MAType, MALength)

plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma : stock_return : na, title="StockReturn", color=color.green, linewidth=1)
plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? index_return_ma : index_return : na, title="IndexReturn", color=color.red, linewidth=1)

plot(useDifference?relativeReturns:na, title="Relative-Returns", color=color.blue, linewidth=1)
plot(useDifference?relativeReturns_ma:na, title="MA", color=color.red, linewidth=1)

buyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma > index_return_ma : stock_return > index_return : relativeReturns > relativeReturns_ma)
closeBuyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma < index_return_ma : stock_return < index_return : relativeReturns < relativeReturns_ma)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when=closeBuyCondition)

Mehr