4.4 Strategieimplementierung in der Python-Sprache

Schriftsteller:Gutes, Erstellt: 2019-04-28 16:51:22, aktualisiert:

Zusammenfassung

In dem vorherigen Artikel haben wir etwas über die Einführung in die Python-Sprache, die grundlegende Syntax, den Strategie-Framework und mehr gelernt. Obwohl der Inhalt langweilig war, ist er jedoch eine notwendige Fähigkeit für die Entwicklung Ihrer Handelsstrategie. In diesem Artikel werden wir den Weg von Python mit einer einfachen Strategie, Schritt für Schritt, fortsetzen, um Ihnen zu helfen, eine machbare quantitative Handelsstrategie zu erreichen.

Einführung in die Strategie

Unter vielen Handelsstrategien sollte die Donchian-Kanalstrategie eine der klassischsten Durchbruchsstrategien sein. Sie ist seit 1970 berühmt. Zu dieser Zeit spezialisierte sich ein Unternehmen auf Simulationstests und Forschung zu Mainstream-programmatischen Handelsstrategien.

Später, in den Vereinigten Staaten, passierten die berühmten Turtle Trader Training Events, die einen großen Erfolg in der Geschichte des Wertpapierhandels machten.

Die Durchbruchshandelsstrategie ist an den relativ reibungslosen Trend der Handelsvarianten angepasst. Der häufigste Weg für den Durchbruch besteht darin, die relative Positionsbeziehung zwischen Preisunterstützung und Widerstand zur Bestimmung der spezifischen Handelsposition zu verwenden.

Regeln für die Strategie des Kanals Donchian

Der Donchian-Kanal ist ein trendorientierter Indikator, dessen Aussehen und Signal dem Bollinger-Band-Indikator etwas ähnlich sind. Allerdings wird sein Preiskanal nach den höchsten und niedrigsten Preisen in einem bestimmten Zeitraum erstellt. Zum Beispiel: Die obere Schiene wird durch den jüngsten 50 k-Line höchsten Preis berechnet; die untere Schiene wird durch den jüngsten 50 k-Line niedrigsten Preis berechnet.

img

wie oben gezeigt: dieser Indikator mit der Kurve, die aus drei verschiedenen Farben besteht, ist die Standard-Einstellung der höchste und der niedrigste Preis im 20-Zyklus, um die Preisvolatilität anzuzeigen. Er zeigt weniger Volatilität, wenn der Preis in einem schmalen Kanal ist und umgekehrt.

Wenn die Preise über die obere Schiene steigen, erscheint das Kaufsignal; umgekehrt, wenn der Preis unter die untere Schiene fällt, erscheint das Verkaufssignal. Da die oberen und unteren Schienen, die mit dem niedrigsten und höchsten Preis berechnet werden, unter normalen Umständen nicht durchbrechen werden, bewegt sich der Preis mit den Schienen oder springt im Kanal herum.

Donchian-Kanalberechnungsmethode

Auf der FMZ Quant-Plattform ist die Donchian-Kanalberechnung einfach. kann nur auf den höchsten oder den niedrigsten Preis in einem bestimmten Zyklus zugreifen, wie unten gezeigt: die 5. Zeile ist, um den höchsten Preis von 50 Zyklen zu erhalten, die 6. Zeile ist, um den niedrigsten Preis von 50 Zyklen zu erhalten.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

Strategie Logik

Es gibt viele Möglichkeiten, den Donchian-Kanal zu verwenden, der allein oder in Kombination mit anderen Indikatoren verwendet werden kann. In diesem Abschnitt werden wir ihn auf die einfachste Weise verwenden. Das heißt: Wenn die Preise die obere Schiene durchbrechen, was bedeutet, dass sie oberhalb der Drucklinie durchbrechen, ist die Kaufkraft stark, sie hat eine Welle steigender Energie gebildet, ein Kaufsignal wird generiert; wenn der Preis unterhalb der unteren Schiene durchbrechen, was bedeutet, dass er unterhalb der Unterstützungslinie durchbrechen wird, wird das Verkaufssignal generiert.

img

Wenn der Preis nach der Eröffnung der Long-Position wieder auf die mittlere Schiene des Kanals zurückfällt, glauben wir, daß die Kaufkraft schwächer wird oder daß die Verkaufskraft stärker wird, und das Signal zur Eröffnung einer Short-Position erzeugt wird.

Handelsbedingungen

  • Offene Long-Position: Wenn keine Position gehalten wird und der Schlusskurs größer ist als die oberste Schiene

  • Offene Kurzposition: Wenn keine Position gehalten wird und der Schlusskurs unter dem unteren Rahmen liegt

  • Schließung einer Long-Position: Wenn die Long-Position derzeit gehalten wird und der Schließpreis unter dem Mittelschienenwert liegt

  • Schließung einer Shortposition: Wenn eine Shortposition derzeit gehalten wird und der Schließpreis größer ist als der mittlere Kurs

Umsetzung des Strategiecodes

Der erste Schritt bei der Implementierung der Strategie ist, zuerst die Daten zu erhalten, weil die Daten eine Voraussetzung für die Handelsstrategie sind.

Der nächste Schritt besteht darin, die Handelslogik auf der Grundlage dieser Daten zu berechnen; der letzte Schritt besteht darin, entsprechend der Logik zu handeln.

Schritt 1: Nutzung der Bibliothek für Handelsklassen

Sie können sich die Bibliothek der Handelsklasse als funktionelles Modul vorstellen. Der Vorteil der Verwendung einer Bibliothek der Handelsklasse besteht darin, dass Sie sich auf das Schreiben von Strategielogik konzentrieren können. Zum Beispiel, wenn wir die Bibliothek der Handelsklasse verwenden, um eine Position zu öffnen oder zu schließen, können wir direkt die API-Schnittstelle in der Bibliothek der Handelsklasse verwenden; aber wenn wir die Bibliothek der Handelsklasse nicht verwenden, müssen wir den Marktpreis beim Öffnen der Position erhalten.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

Der obige Codierungsteil ist das CTA-Strategie-Framework mit dem FMZ Quant-Tool. Dies ist ein festes Codierungsformat und alle Handelslogik-Code beginnen mit Zeile 4. An anderer Stelle sind keine Änderungen erforderlich.

Schritt 2: Erhalten Sie alle möglichen Daten

Wenn wir uns die Daten ansehen, die wir benötigen, dann müssen wir zunächst den aktuellen Positionsstatus ermitteln und dann den Schlusskurs mit den oberen, mittleren und unteren Schienen des Bollinger-Band-Indikators vergleichen.

  • Holen Sie sich die Daten der K-Linie.

Die erste ist, das K-Line-Datenarray und den aktuellen K-Line-Schlusskurs zu erhalten, mit dem K-Line-Array können wir die N-Zyklusperiode des höchsten und niedrigsten Preises über die API-Schnittstelle berechnen. Es kann so geschrieben werden:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

Wie oben gezeigt:

Zeile 4: Holen Sie sich das K-Zeil-Array, das ein festes Format ist.

Linie 5: Filtern Sie die Länge der K-Linie, denn der Parameter für die Berechnung des Donchian-Kanal-Indikators ist 50, wenn die Anzahl der K-Linien kleiner als 50 ist, ist es unmöglich, sie zu berechnen.

Zeile 6: Wir verwenden den Code " records[ len (records) - 1] " um die letzten Daten des K-Linienarrays zu erhalten, die die neuesten K-Liniendaten sind. Diese Daten sind ein Objekt, das enthält: den Eröffnungspreis, den höchsten, niedrigsten und den Schlusskurs, auch das Handelsvolumen, Zeit und andere Daten, da es ein Objekt ist, also verwenden wir einfach .Close um den neuesten Schlusskurs der K-Line zu erhalten.

  • Position Daten erhalten

Positionsinformationen sind eine sehr wichtige Bedingung in der quantitativen Handelsstrategie. Wenn die Handelsbedingungen festgelegt werden, ist es notwendig, zu beurteilen, ob eine Bestellung nach dem Positionsstatus und der Anzahl der Positionen platziert wird. Zum Beispiel, wenn die Bedingungen für die Eröffnung von Long-Positionen festgelegt werden, wenn es eine Holding-Position gibt, platzieren Sie keine Bestellung; wenn es keine Holding-Position gibt, platzieren Sie die Bestellung. Diesmal verkapseln wir die Positionsinformationen direkt in eine Funktion, wir können diese Funktion einfach anrufen, um sie zu verwenden. so:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

Wie oben gezeigt:

Dies ist eine Funktion, die die Positionsinformationen erhält. Wenn es lange Positionen gibt, ist der Wert 1; wenn es kurze Positionen gibt, ist der Wert -1; wenn es keine Positionen gibt, ist der Wert 0.

Zeile 2: Erstellen Sie eine Funktion mit dem Namen mp. Diese Funktion hat keine Parameter.

Zeile 3: Holen Sie sich das Positionsarray, das ein festes Format ist.

Zeile 4: Bestimmt die Länge des Positionsarray. Wenn seine Länge gleich 0 ist, bedeutet dies, dass es keine Position hält, gibt 0.

Zeile 6 : Mit der For-Schleife beginnt man, dieses Array zu durchqueren, die folgende Logik ist sehr einfach, wenn es eine lange Position hält, gibt es 1 zurück; wenn es eine kurze Position hält, gibt es -1 zurück.

Zeile 18: Die Positionsinformationsfunktion mp aufrufen.

  • Erwerben Sie den höchsten und niedrigsten Preis der letzten 50 K-Linien

In dem quantitativen Handelstool von FMZ Quant können Sie die Funktionen "TA.Highest" und "TA.Lowest" direkt verwenden, ohne Ihre eigenen logischen Berechnungen schreiben zu müssen. Und die Funktion TA.Highest und TA.Lowest gibt ein Ergebnis der spezifischen Werte anstelle eines Arrays zurück. Dies ist sehr praktisch. Nicht nur das, die FMZ Quant-Plattform hat offiziell hunderte andere Indikatorfunktionen integriert.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

Wie oben gezeigt:

Zeile 19: Funktion TA.Höchste anrufen, um den höchsten Preis von 50 Zyklen zu erhalten

Zeile 20: Funktion TA.Lowest anrufen, um den niedrigsten Preis von 50 Zyklen zu erhalten

Zeile 21: Berechnen des Durchschnittswerts der oberen und unteren Schiene nach dem höchsten und niedrigsten Preis von 50 Zyklen

Schritt 3: Bestellung und Handel

Mit den oben genannten Daten können wir jetzt die Handelslogik und den Bestellteil schreiben. Es ist auch sehr einfach, die am häufigsten verwendete ist die if-Anweisung, die so beschrieben werden kann: wenn Bedingung 1 und Bedingung 2 wahr sind, platzieren Sie die Bestellung; wenn Bedingung 3 oder Bedingung 4 wahr sind, platzieren Sie die Bestellung. Wie unten gezeigt:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

Wie oben gezeigt:

Zeile 22: Mit Hilfe der Handelsklasse Bibliothek ist dies ein festes Format

Zeilen 23, 24 : Dies ist eine Schließung Long-Positions-Anweisung, die die Vergleichsoperatoren und logischen Operatoren verwendet, die wir zuvor gelernt haben, was bedeutet, dass, wenn die aktuelle Holding ist eine Long-Position, und der Schlusskurs ist niedriger als die mittlere Schiene, schließen Sie alle Positionen.

Zeilen 25, 26 : Dies ist eine Aussage zur Schließung einer Short-Position, die die Vergleichsoperatoren und logischen Operatoren verwendet, die wir zuvor gelernt haben, was bedeutet, dass, wenn die aktuelle Order eine Short-Position ist und der Schließpreis größer ist als die mittlere Schiene, alle Positionen geschlossen werden.

Zeile 27: Ermitteln Sie den Status der aktuellen Position. Falls keine Position gehalten wird, gehen Sie zum nächsten Schritt.

Zeilen 28, 29: Feststellen, ob der Schlusskurs über der oberen Schiene liegt.

Zeilen 30, 31: Feststellen, ob der Schlusskurs unterhalb der unteren Schiene liegt.

Zusammenfassend

Wir haben oben jeden Schritt der Entwicklung einer vollständigen quantitativen Handelsstrategie mit Python gelernt, einschließlich: Strategieeinführung, Donchian-Kanalberechnungsmethode, Strategielogik, Handelsbedingungen, Strategiecode-Implementierung usw. Dieser Abschnitt ist nur eine einfache Strategie. Als eine Methode zur Inspiration gibt es mehr als eine Möglichkeit, dies zu erreichen.

Ankündigung zum nächsten Abschnitt

Bei der Entwicklung von quantitativen Handelsstrategien, aus der Perspektive der Geschwindigkeit der Ausführung von Programmiersprachen, welches ist das schnellste? Es muss das C ++ sein. Besonders im Bereich der Finanzderivate und Hochfrequenzhandel. C ++ ist einzigartig in der Sprachspezifität und hat Vorteile in numerischen Berechnungen. Im Vergleich zu JavaScript und Python kann seine Geschwindigkeit um mehrere Größenordnungen erhöht werden. Wenn Sie in Zukunft in den Bereich der Finanzderivate oder des Hochfrequenzhandels gehen möchten. Dies wird der Kurs sein, den Sie nicht verpassen sollten.

Nachschulübungen

  1. Beginnen Sie mit den Grundlagen und setzen Sie die Strategie dieses Abschnitts um.

  2. Versuchen Sie, der Strategie in diesem Abschnitt einen gleitenden Durchschnittsindikator hinzuzufügen, um die Handelsfrequenz zu reduzieren.


Mehr