Strategie für den quantitativen Handel mit doppelten gleitenden Durchschnitten

Schriftsteller:ChaoZhang, Datum: 2023-12-29 11:03:14
Tags:

img

Übersicht

Diese Strategie basiert auf den technischen Indikatoren des gleitenden Durchschnitts und des Handelsvolumens für eine langfristige trendfolgende quantitative Strategie. Wenn der Schlusskurs über der 20-tägigen gleitenden Durchschnittslinie liegt und das Kaufvolumen des Tages größer ist als das Verkaufsvolumen und das durchschnittliche Handelsvolumen in den letzten n Tagen, gilt der Markt als bullisch und es ist Zeit zu kaufen. Wenn der Schlusskurs unter die untere Schiene bricht und das Verkaufsvolumen des Tages größer ist als das Kaufvolumen und das durchschnittliche Handelsvolumen in den letzten n Tagen, gilt der Markt als bärisch und es ist Zeit zu verkaufen.

Strategieprinzip

Die Strategie stützt sich hauptsächlich auf zwei Indikatoren:

  1. Doppel gleitende Durchschnittslinien: Berechnen Sie die 20-Tage-Linie und die 60-Tage-Linie. Wenn die 20-Tage-Linie über die 60-Tage-Linie überschreitet, gilt der Markt als im Aufwärtstrend. Wenn die 20-Tage-Linie unter die 60-Tage-Linie überschreitet, gilt der Markt als im Abwärtstrend.

  2. Handelsvolumen: Berechnet das tägliche Kaufvolumen und das Verkaufsvolumen. Wenn das Kaufvolumen größer ist als das Verkaufsvolumen und größer als das durchschnittliche Handelsvolumen in den letzten n Tagen, wird festgestellt, dass der Markt bullisch ist. Wenn das Verkaufsvolumen größer ist als das Kaufvolumen und größer als das durchschnittliche Handelsvolumen in den letzten n Tagen, wird festgestellt, dass der Markt bärisch ist.

Die spezifische Handelsstrategie und -logik sind wie folgt:

Wenn der Schlusskurs über der 20-tägigen gleitenden Durchschnittslinie liegt und das Kaufvolumen des Tages größer ist als das Verkaufsvolumen und das durchschnittliche Handelsvolumen der letzten n Tage, gilt der Markt als bullisch. Berechnen Sie die Bollinger Bands basierend auf der Volatilität, wenn der Schlusskurs zwischen der Mittellinie und der unteren Schiene der Bollinger Bands liegt, gehen Sie lang.

Wenn der Schlusskurs unterhalb der unteren Schiene bricht und das Verkaufsvolumen des Tages größer ist als das Kaufvolumen und das durchschnittliche Handelsvolumen der letzten n Tage, gilt der Markt als bärisch.

Profit-Taking und Stop-Loss: Setzen Sie angemessene Profit-Taking- und Stop-Loss-Niveaus ein, um Gewinne zu erzielen oder Verluste zu reduzieren. Zum Beispiel, wenn der Preis 5% über dem Einstiegspreis steigt, machen Sie Profit; wenn der Verlust 10% erreicht, stoppen Sie den Verlust; oder wenn der Preis ein neues Hoch erreicht und dann in gewissem Maße zurückzieht, machen Sie Profit.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Die Kombination von zwei gleitenden Durchschnittslinien und Handelsvolumenindikatoren vermeidet die blinden Punkte bei der Beurteilung eines einzigen technischen Indikators.

  2. Die Verwendung von Bollinger Bands mit unterschiedlichen Parametern bestimmt genaue Einstiegspreise.

  3. Die Gewinn- und Stop-Loss-Strategie ist angemessen, was dazu beiträgt, Gewinne zu erzielen und Risiken zu kontrollieren.

  4. Gute Rückprüfungsergebnisse mit stabilen Renditen, die tatsächlich auf den quantitativen Handel angewendet werden können.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Bei den Strategien der doppelten gleitenden Durchschnittswerte treten in der Regel falsche Signale auf und müssen durch Volumenindikatoren gefiltert werden.

  2. Bei falschen Einstellungen der Bollinger Bands-Parameter kann es zu zu häufigen oder seltenen Einträgen kommen.

  3. Unangemessene feste Gewinnspiel- und Stop-Loss-Punkte können die Strategierenditen beeinträchtigen.

  4. Für Backtesting sind große Mengen historischer Daten erforderlich, und bei Live-Handel können immer noch unerwartete Verluste auftreten.

Optimierungsrichtung

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Optimieren Sie die Parameter des gleitenden Durchschnittssystems, um die optimale Kombination von gleitenden Durchschnitten zu finden.

  2. Optimieren Sie die Bollinger-Bänderparameter für eine genauere Eingabe.

  3. Dynamische Anpassung der Gewinn- und Stop-Loss-Punkte an die Marktbedingungen zur Festlegung angemessener Risikovergütungsquoten.

  4. Erhöhung der Bewertung anderer technischer Indikatoren wie MACD, KD usw. zur Verbesserung der Strategiegenauigkeit.

  5. Verwenden Sie maschinelle Lernmethoden, um automatisch optimale Parameter zu finden, um Strategien robuster zu machen.

Zusammenfassung

Insgesamt ist dies eine sehr praktische quantitative Handelsstrategie mit guter Backtesting-Leistung. Es ist einfach zu implementieren, mit kontrollierbaren Risiken und ist eine stabile Strategie, die für den Live-Handel geeignet ist, die es wert ist, für quantitative Trader gelernt zu werden. Natürlich gibt es noch viel Raum für die Optimierung der Strategie, und ich freue mich darauf, dass mehr quantitative Handelsexperten sie verbessern.


/*backtest
start: 2023-12-21 00:00:00
end: 2023-12-28 00:00:00
period: 1m
basePeriod: 1m
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/
// © KAIST291

//@version=4
strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true)
// SETTING //
length1=input(1)
length3=input(3)
length7=input(7)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=(close>Supper and BV>SV and BV>Davgvol)
bull2=(close>ma20  and BV>SV and BV>Davgvol)
bux =(close<Supper and close>Slower and volume<Wavgvol)
bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol)
hi=highest(exit,10)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>ma3 and ma20>ma60 and rsi<70)
    strategy.entry("Long",strategy.long,0.1)

if (strategy.position_avg_price*1.05<close)
    strategy.close("Long",0.1)

else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002)
    strategy.close("Long",0.1)
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long",0.1)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////


Mehr