Quantitative Trendfolgestrategie basierend auf Momentum


Erstellungsdatum: 2024-01-19 15:29:35 zuletzt geändert: 2024-01-19 15:29:35
Kopie: 2 Klicks: 618
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitative Trendfolgestrategie basierend auf Momentum

Überblick

Die Strategie basiert auf einer Seilbahn-Level-Ach-K-Linie und kombiniert Dynamik-Analysen auf verschiedenen Phasen, um dynamisch die Stützkräfte hinter dem aktuellen Aktienpreis zu bestimmen und so zu beurteilen, wann es an der Zeit ist, eine Position zu errichten oder zu behalten.

Strategieprinzip

  1. Berechnung der Schlusskosten der Ach-K-Linien der Seen in verschiedenen Perioden. Dies ist die Grundlage für die Berechnung der nachfolgenden Dynamik.

  2. Die Schwankungen der Börsenöffnung und -schließung im Monats- und im Tageszeitraum werden jeweils berechnet. Dies spiegelt die Dynamik der aktuellen Aktienkurse gegenüber den historischen Kursen wider.

  3. Die Schwankungen der dynamischen Energie der Mond- und der Sonnenlinie werden durchschnittlich gemessen, wobei ein Teil der Geräusche herausgefiltert wird, um einen stabilen Mond- und Sonnenlinie-Dynamikindikator zu erhalten.

  4. Aus der durchschnittlichen Dynamik-Wachs- und Abwärtstrend lässt sich die Marktstützkraft berechnen, die sich in den aktuellen Aktienpreisen widerspiegelt, d.h. der Preis, der die Auswirkungen der Marktschwankungen abschließt. Dieser Preis kann als Dynamik-Schwelle für den aktuellen tatsächlichen Aktienpreis angesehen werden.

  5. Wenn der Schlusskurs über der dynamischen Schwelle liegt, wird monatlich mehr Lager gebaut. Wenn der Schlusskurs unter der dynamischen Schwelle liegt, wird der Lagerplatz stillgelegt.

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, dass sie nicht einfach dem Aktienpreis folgt, sondern dass sie auf der Grundlage der Dynamik hinter dem Aktienpreis die tatsächlichen Unterstützungskräfte berechnet, um so Positionen zu erstellen und Verluste zu stoppen. Dies filtert effektiv den Lärm von schwankenden Verhältnissen und sperrt Chancen auf einen stabilen Anstieg.

Außerdem stammt die gesamte Datenbasis der Strategie aus den K-Linien der Seen-Ach. Diese spezielle K-Line selbst verringert das Problem der übermäßigen Abhängigkeit von Verbindungszyklen. Daher ist die Strategie stabiler als andere K-Line-Strategien.

Risikoanalyse

Das größte Risiko dieser Strategie besteht darin, dass die Dynamikberechnung auf den historischen Preisen basiert. Wenn sich die Grundlagen und die Marktlage des Unternehmens erheblich ändern, wird die Repräsentativität der historischen Preise sinken, was zu einer Verzerrung der Positionserfassung und der Stop-Loss-Beschlüsse führt.

Darüber hinaus verwendet die Strategie monatliche und tagliche Perioden. Dies bedeutet, dass die Strategie nicht sehr realistisch ist und nicht schnell auf drastische Veränderungen der Marktlage reagieren kann. Dies birgt ein Stop-Loss-Risiko bei Marktveränderungen.

Um diese Risiken zu verringern, kann man die Einführung von höherfrequenten Daten und Echtzeit-Feedbacks zu den Fundamentaldaten des Unternehmens in Betracht ziehen oder in Verbindung mit anderen, subjektiveren Handelssignalen zur Akzeptanz und Optimierung.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Die K-Linie selbst kann weiter optimiert werden, z. B. durch die Anpassung der Gewichtsverteilung.

  2. Erhöhung der Daten für verschiedene Zeitspannen, Erstellung eines Index-Durchschnitts für die Dynamik-Bewertung und Verbesserung der Stabilität

  3. Die Einführung höherer Frequenzen wie z.B. Tages-/Minuten-Linien-Daten verbessert die Echtzeitfähigkeit der Strategie.

  4. In Kombination mit Ergebnisberichten, Umstrukturierungsgerüchten und anderen Informationen wird die Dynamik berechnet, um Feedback zu den Grundlagen des Unternehmens zu erhalten.

  5. Es kann in Betracht gezogen werden, die Anzahl der Tage oder Wochen zu erhöhen, um die Anzahl der Lagerstätten zu erhöhen.

Zusammenfassen

Die Strategie ist insgesamt sehr stabil und kontrolliert die Risiken durch Dynamikverfolgung. Ihr größter Vorteil liegt darin, dass die Dynamik hinter den Aktienkursen verwendet wird, um die realen Ereignisse zu bestimmen, anstatt nur den Aktienpreis selbst zu verfolgen. Der nächste Schritt besteht darin, die Strategie durch die Einführung von mehr, häufigeren und informativeren Daten weiter zu optimieren, um die Marktchancen besser zu erfassen.

Strategiequellcode
/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FrancoPassuello

//@version=5
strategy("Heiken Ashi ADM", overlay=true)
haClose = (open + high + low + close) / 4
// prevHaOpen = line.new(na, na, na, na, width = 1)
haOpen = (open[1] + close[1]) / 2
// line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1]))
// line.set_xy2(prevHaOpen, bar_index, haClose[1])


[monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on)
[dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on)


get_rate_of_return(price1, price2) =>
    return_ = (price1/price2 -1)*100
    return_

m0 = get_rate_of_return(monclose, monopen)
m1 = get_rate_of_return(_1monclose, _1monopen)
m2 = get_rate_of_return(monclose, _2monopen)
m3 = get_rate_of_return(_1monclose, _3monopen)
m4 = get_rate_of_return(monclose, _4monopen)
m5 = get_rate_of_return(monclose, _5monopen)
m6 = get_rate_of_return(_1monclose, _6monopen)
MS = (m1 + m3 + m6)/100
CS = (m0 + m2 + m5)/100

d1 = get_rate_of_return(dayclose1, _21dayopen)
d2 = get_rate_of_return(dayclose1, _63dayopen)
d3 = get_rate_of_return(dayclose1, _126dayopen)
DS = (d1 + d2 + d3)/100

//Last (DAILY)
lastd_s_avg1 = DS/3

lastd_Approximate1 = dayclose1*(1-lastd_s_avg1)

last_approx1_d21 = lastd_Approximate1 / _21dayopen-1
last_approx1_d63 = lastd_Approximate1 / _63dayopen-1
last_approx1_d126 = lastd_Approximate1 / _126dayopen-1

lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3
lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2))
lastd_price = lastd_approximate2

//plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")

//Last

last_s_avg1 = MS/3

last_Approximate1 = _1monclose*(1-last_s_avg1)

last_approx1_m1 = last_Approximate1 / _1monopen-1
last_approx1_m3 = last_Approximate1 / _3monopen-1
last_approx1_m6 = last_Approximate1 / _6monopen-1

last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3
last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2))
last_price = last_approximate2
Scoring_price = _1monclose*(1-CS)

plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")
//plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold")

//Long based on month close and being the first trade of the month.

var int lastClosedMonth = -1
limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Long based on day close and being the first trade of the month.
limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Close trade based on day close

DCloseLongCondition = dayclose1<lastd_approximate2

//Old standard Trading rules
longCondition = _1monclose > Scoring_price
MCloseLongCondition = _1monclose<Scoring_price
shortCondition = CS < 0

if (longCondition)
    strategy.entry("Long", strategy.long)


if (strategy.position_size > 0 and MCloseLongCondition)
    strategy.close("Long")
    lastClosedMonth := month(time)