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.
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
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.
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
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.
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
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.
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.
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
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.
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.
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.
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
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
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
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
# 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
Zeile 20: Funktion
Zeile 21: Berechnen des Durchschnittswerts der oberen und unteren Schiene nach dem höchsten und niedrigsten Preis von 50 Zyklen
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
# 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
Zeilen 25, 26 : Dies ist eine Aussage zur Schließung einer Short-Position, die die
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.
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.
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.
Beginnen Sie mit den Grundlagen und setzen Sie die Strategie dieses Abschnitts um.
Versuchen Sie, der Strategie in diesem Abschnitt einen gleitenden Durchschnittsindikator hinzuzufügen, um die Handelsfrequenz zu reduzieren.