Quadratische Handelssignalstrategie

Schriftsteller:ChaoZhang, Datum: 23.09.2023
Tags:

Übersicht

Diese Strategie passt eine quadratische Kurve zu hohen/niedrigen Punkten der Bars an, um Handelssignale zu erzeugen, wenn der Preis durch die gepaßten Linien bricht.

Strategie Logik

Die wichtigsten Komponenten und Regeln sind:

  1. Kurvenanpassung an hohen/niedrigen Punkten mit quadratischer Regression.

  2. Kaufsignal, wenn der Schnitt über dem oberen Band liegt.

  3. Verkaufssignal, wenn die Schließung unter dem unteren Band liegt.

  4. N Prüfzeiten zur Vermeidung falscher Bruchvorgänge.

  5. Keine festen Ausstiegsregeln, Optimierung der Ausgänge durch Backtesting.

Die Strategie versucht, die wichtigsten Preise mathematisch zu identifizieren und die Breakouts zu handeln, ein typisches Breakout-System.

Vorteile

Im Vergleich zu anderen Breakout-Systemen sind die Hauptvorteile:

  1. Mathematische Anpassung ist objektiver als subjektives Urteilen.

  2. Neuer Ansatz, der technische Analyse und statistische Modelle kombiniert.

  3. Die mehrjährige Überprüfung verhindert falsche Bruchmeldungen.

  4. Backtesting kann die Ausgänge und die Wartezeit optimieren.

  5. Einfach umzusetzen mit flexiblen Anpassungen.

  6. Modell aktualisiert sich automatisch ohne manuelles Eingreifen.

  7. Kann die Robustheit der Parameter über Produkte und Zeitrahmen hinweg testen.

  8. Potenzial zur weiteren Optimierung durch maschinelles Lernen.

  9. Allgemein neuartiger Ansatz mit Explorationswert.

Risiken

Die Risiken sind jedoch:

  1. Die Ausrüstungsleistung hängt von der Parameter-Ausrichtung ab, das Risiko einer Überanpassung.

  2. Die gebauten Linien sind verzögert und können Verluste nicht vollständig vermeiden.

  3. Keine Bestätigung des Volumens, Gefahr, eingeschlossen zu werden.

  4. Statistische Arbitrage ist eine Herausforderung für persistente Alpha.

  5. Begrenzte Rückprüfungsperiode, muss die Robustheit überprüfen.

  6. Die Anpassungsfähigkeit an mehrere Märkte bedarf einer Validierung.

  7. Eine feste Größe kann nicht dynamisch angepasst werden.

  8. Es muss eine strenge Bewertung der Verhältnisse Belohnung/Risiko durchgeführt werden.

Verbesserungen

Auf der Grundlage der Analyse können Verbesserungen Folgendes beinhalten:

  1. Test der Robustheit der Parameter in allen Marktsystemen.

  2. Zusatz von Volumenbestätigungsindikatoren.

  3. Optimierung der Ein-/Ausgangslogik für Qualitätssignale.

  4. Erstellen dynamischer Positionsgrößenmodelle.

  5. Einbeziehung von Stops zur Begrenzung von Verlusten.

  6. Optimierung der Risikomanagementstrategien.

  7. Rollfenster-Backtest bestätigt.

  8. Bewertung der Stabilität auf mehreren Märkten.

  9. Maschinelles Lernen für die Optimierung von Modellen nutzen.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass diese Strategie einen gewissen innovativen Wert und Versuchswert aufweist. Die langfristige Tragfähigkeit der statistischen Arbitrage ist jedoch noch nicht bewiesen. Umfassende Probenuntersuchungen zu Robustheit, Risiko/Belohnung sind der Schlüssel, um Überanpassung zu verhindern und Anpassungsfähigkeit zu erhalten.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Mehr