Algorithmic Trading Tips 17.

KAUF- UND VERKAUFS-SIGNALE, POSITIONS-GRÖSSE UND STOPPS.

TEIL 1: Die Toolbox für den Trader.

Die vorliegende Ausgabe enthält fünf Bausteine für die Entwicklung oder den Test einer Handelsstrategie in Tradesignal. Vom Entry über eine Positionsgrößensteuerung bis hin zu unterschiedlichen Stopp-Arten – Bausteine ermöglichen Quant Tradern einen schnellen und unkomplizierten Einstieg in die Entwicklung algorithmischer Handelsstrategien.

ARBEITSBEREICH LADEN. (Für Anwender mit Refinitiv Eikon.)
ARBEITSBEREICH LADEN. (Für Anwender mit Bloomberg.)

Mit dem Download erkennen Sie die unten aufrufbaren Nutzungsbedingungen an.

 

Einer der großen Vorteile des Tradesignal Softwarepakets ist die Möglichkeit, Handelssysteme schnell entwickeln und testen zu können – auch ohne Programmierkenntnisse und Statistikstudium. Die Software bietet dazu Hunderte vordefinierte Beispiele. Nahezu jeder Indikator ist in seiner Lehrbuchinterpretation enthalten. Suchen Sie in der Liste der Strategien z. B. nach dem Moving Average, dann werden Sie alle mit diesem Indikator verbundenen Handelsstrategien finden und können im Chart entsprechende Ein- und Ausstiegssignale anzeigen lassen. Vieles lässt sich also mit diesen vorgefertigten Strategien zu Wege bringen.

In dieser Ausgabe stelle ich Ihnen jedoch meine privaten Entwicklertools vor und Sie werden sehen, dass die Entwicklung von Handelsstrategien damit noch einfacher wird.

01. DAS ENTRY-MODUL.

Beginnen wir zunächst mit einer Test-Strategie, die für die Einstiegssignale zuständig ist. Sie basiert auf einem gleitenden Durchschnitt und dem Slow Stochastic Indikator.

Inputs:​​ PeriodSMA(21),​​ PeriodStoch(5);

Variables:​​ ma,​​ stoch;

 

ma=average(close,PeriodSMA);

stoch=slowk(PeriodStoch);

 

if​​ close>ma​​ // market above average

and​​ ma>ma[2]​​ // and average rises (bigger than 2 bars ago)

and​​ stoch​​ crosses above​​ 50​​ // and slowK crosses above 50

then buy this bar​​ on​​ close;​​ // --> buy!

if​​ close<​​ ma

and​​ ma<ma[2]

and​​ stoch​​ crosses below​​ 50

then short this bar​​ on​​ close;

drawline(ma);


Die Strategie ist beispielhaft zweiteilig aufgebaut: Zunächst wird die Trendrichtung bestimmt. Um einen Long Trade zu platzieren, muss der Markt über seinem steigenden gleitenden Durchschnitt (SMA) liegen. Schneidet anschließend auch noch die Slow Stochastic über 50, wird der eigentliche Einstieg zum Ende des Bars ausgelöst. Dieses zweiteilige Vorgehen sorgt dafür, dass viele Signale in Trendrichtung generiert werden. Dies wird von Vorteil sein, falls unsere Position irgendwann ausgestoppt, der Trend aber weiterhin intakt ist. Das nächste Entry-Signal in Trendrichtung ist dank des Oszillators nur ein paar Bars entfernt.Abbildung 1 zeigt die reinen Entry-Signale am Chart. Zu sehen ist auch die erste notwendige Verbesserung – die Bestimmung der Größe einer Position.

DER GRUND: Die Backtest-Ergebnisse wären stark verzerrt, wenn man einen Markt, der um mehr als 50% schwankt, immer nur mit einer festen Positionsgröße handeln würde. Allein durch das höhere absolute Kursniveau würde ein Kontrakt bei 10.000 Punkten einen höheren Einfluss haben als ein Kontrakt, der bei 5.000 gekauft wird.

ÜBRIGENS: Wenn Sie bei Tradesignal den Befehl drawline(slowk(5)) in die Kommandozeile eingeben, wird der Stochastic-Indikator unterhalb des Charts angezeigt. Anschließend können Sie bei 50 eine Linie hinzufügen und schon lassen sich die generierten Einstiegssignale visuell nachvollziehen.

 

ABB. 1: EINSTIEGSSIGNALE.

Das Entry-Modul generiert Long- und Short-Signale auf Basis der Steigung der SMA und der Slow Stochastic.

 

02. DAS POSITIONSGRÖSSENMODUL.

Die Positionsgröße lässt sich ganz einfach durch das nächste Script bestimmen. Es wird bei jedem Handelssignal dasselbe Geld angelegt. Damit gleicht sich der Einfluss der absoluten Kursstände wieder aus.

Meta:​​ Synopsis("Invests the same amount of money in every trade");

Inputs:​​ Invest(100000);

Variables:​​ con;

 

con=round(Invest/close,0);

 

SetDefaultQuantity(maxlist(1,con));

Auf dem nachfolgenden Chart sehen Sie das Ergebnis: Jetzt werden mit jedem Trade 100.000 Euro in den DAX investiert (zu sehen an den unterschiedlichen Zahlenangaben an jedem Kauf- bzw. Verkaufssignal). Dies verhindert die durch die hohe Volatilität des Marktes bedingten Verzerrungen im Backtest.

ABB. 2: EINSTIEGSSIGNALE MIT POSITIONSGRÖSSENMODUL.

Um Verzerrungen aufgrund unterschiedlich hoher Kursniveaus zu eliminieren, kommt das Kapital-Modul zum Einsatz (PositionSizing), das für jeden Trade jeweils einen festen Kapitalbetrag einsetzt (hier: 100.000 Euro).

 

03. DAS INITIAL STOP-MODUL.

Was am Chart auf den ersten Blick auffällt, ist der fehlende Stop Loss. Die Einstiegsstrategie selbst geht zwar irgendwann in Trendrichtung in Position, aber wie man auf Abbildung 2 erkennen kann, ist die Strategie seit langem in einem Short Trade
gefangen. Mit den nachfolgenden Equilla Codes können Sie einen Initial Stop in die Strategie einfügen. Die Weite des Stops können Sie in den Eigenschaften steuern – entweder als absoluten Geldbetrag oder als prozentuale Angabe. Zudem wird Ihnen am Chart (und das ist bei allen Scripten der Fall) auch gleich angezeigt, wo die Handelsstrategie den Stop platziert.

INITIAL STOP (ABSOLUT).

Meta:​​ Synopsis("Sets cash stop for total position");

Inputs:​​ StopCash(10000);

 

setstopposition;

setstoploss(StopCash);

 

drawsymbol(getactiveorderprice(1));

drawsymbol(getactiveorderprice(2));

INITIAL STOP (PROZENTUAL).

Meta:​​ Synopsis("Sets % Stop Loss");

Inputs:​​ StopPercent(10.0);

Variables:​​ price;

 

if isvalid(entryprice)​​ then​​ price=entryprice else​​ price=close;

 

setstopcontract;

setstoploss(price*StopPercent/100);

 

drawsymbol(getactiveorderprice(1));

drawsymbol(getactiveorderprice(2));

ABB. 3: ZUSÄTZLICHE IMPLEMENTIERUNG EINES INITIAL STOPS.

Im vorliegenden Beispiel wurde ein Stop-Modul implementiert. Hierbei kommt ein absoluter Stop in Höhe von 10.000 Euro zum Einsatz.

 

04. DAS PROFIT TARGET-MODUL.

Ist die Position mit einem Initial Stop abgesichert, können Sie im nächsten Schritt die nachfolgenden Scripte nutzen, um die aufgelaufenen Gewinne zu realisieren. Es handelt sich jeweils um ein einfaches Profit Target – entweder in absoluter oder in
prozentualer Höhe. Bitte beachten Sie, dass das absolute Gewinnziel für die Gesamtposition, und nicht für den Einzelkontrakt gilt.

PROFIT TARGET (ABSOLUT).

Meta:​​ Synopsis("Sets cash target for total position");

Inputs:​​ CashTargetTotalPosition(1000);

 

setstopposition;

setprofittarget(CashTargetTotalPosition);

 

drawsymbol(getactiveorderprice(1));

drawsymbol(getactiveorderprice(2));

PROFIT TARGET (PROZENTUAL).

Meta:​​ Synopsis("Sets Percent Target");

Inputs:​​ PercentTarget(10.0);

Variables:​​ price;

 

if marketposition=0​​ then​​ price=close​​ else​​ price=entryprice;

 

setstopcontract;

setprofittarget(price*PercentTarget/100);

 

drawsymbol(getactiveorderprice(1));

drawsymbol(getactiveorderprice(2));

Wie Sie sehen, kommt der eingangs beschriebene Einsatz des schnellen Einstiegsoszillators hier zugute: Im Jahr 2013 wurde das Gewinnziel zweimal erreicht, jedoch konnte die Einstiegslogik das System schnell wieder in Position bringen.

ABB. 4: EINSATZ EINES PROFIT TARGETS.

Im vorliegenden Beispiel wurde zu den bereits enthaltenen Modulen nun ein Profit Target hinzugefügt, das bei Erreichen einer frei definierbaren absoluten Gewinnhöhe eine Gewinnmitnahme durchführt.

 

05. DAS TRAILING STOP-MODUL.

Neben der Verwendung eines reinen Gewinnziels kann auch der Schutz aufgelaufener Gewinne, ohne diese jedoch bei einer fixen Schranke gleich zu realisieren, eine lohnende Exit-Strategie sein. Der nachfolgende Equilla Code ermöglicht Ihnen den Einsatz eines solchen nachgezogenen Stops (Trailing Stop).

Meta:​​ Synopsis("Protects Profits. Stop is set % below last trade equity high");

Inputs:​​ PercentTrailingStop(10.0);

Variables:​​ hh,​​ ll;

 

If barssinceentry>=0​​ then begin

hh=highest(high,maxlist(1,barssinceentry+1));

ll=lowest(low,maxlist(1,barssinceentry+1));

if marketposition=1​​ then sell next bar​​ at​​ hh-PercentTrailingStop*hh/100​​ stop;

if marketposition=-1​​ then cover next bar​​ at​​ ll+PercentTrailingStop*ll/100​​ stop;

end;

 

setstopcontract;

setstoploss(close/100*PercentTrailingStop);​​ // close used, as entryprice is not available at first bar

 

drawsymbol(getactiveorderprice(1));

drawsymbol(getactiveorderprice(2));

HINWEIS:
Bitte beachten Sie bei der Anwendung der Exits, dass Tradesignal immer automatisch den Exit nimmt, der näher am Marktniveau dran ist. Fügt man bei dem obigen Chart z.B. noch einen fünfprozentigen Stop Loss hinzu, bleibt der Stop solange fünf Prozent unter dem Einstiegspreis liegen, bis ein Gewinn von mehr als fünf Prozent erreicht ist. Dann nämlich läge der 10-Prozent-Trailing Stop näher am Markt als der Initial Stop und würde nach und nach in den absoluten Gewinnbereich gezogen werden.

ABB. 5: EINSATZ EINES TRAILING STOPS.

Um eine fortlaufende Absicherung aufgelaufener Gewinne zu erreichen, kommt in diesem Beispiel ein Trailing Stop zum Einsatz. Damit lassen sich Trends optimal ausnutzen.

 

ENTWICKELN UND TESTEN SIE IHRE EINSTIEGSSTRATEGIE NACH DEM BAUKASTENPRINZIP.

Mit den hier vorgestellten Modulen können Sie auf einfache Weise die Güte jeder beliebigen Einstiegsidee testen. Ohne großes „number crunching“ können Sie so grafisch auch die richtigen Parameter einstellen. Achten Sie in dieser Phase der Enwicklung noch nicht so sehr auf die Ergebnisse der Strategie, sondern vielmehr darauf, ob die Signale plausibel sind.
Wie Sie auf Abbildung 4 sehen, ist ein Trailing Stop von 10% bei diesem Markt und Einstieg angebracht. Ein wesentlich kleinerer Trailing Stop würde die Trends dagegen nicht ausreizen können, während ein wesentlich weiterer Stop die Gewinne nicht genügend absichern würde.
Diesen ersten Parameter für eine mögliche weitere Optimierung des Systems finde ich gerne auf grafischem Weg heraus, und nicht gleich durch stures Optimieren. Deshalb zeigen die hier vorgestellten Exits auch immer an, wo sie die Order platzieren.

Alle Strategie-Module stehen auch zum bequemen Download als Arbeitsbereich zur Verfügung.