Dans l'article précédent, nous avons appris l'introduction au langage Python, la syntaxe de base, le cadre de stratégie et plus encore. Bien que le contenu soit ennuyeux, mais c'est une compétence indispensable dans le développement de votre stratégie de trading. Dans cet article, nous allons continuer le chemin de Python avec une stratégie simple, étape par étape pour vous aider à atteindre une stratégie de trading quantitative réalisable.
Parmi de nombreuses stratégies de trading, la stratégie de canal Donchian devrait être l'une des stratégies de percée les plus classiques. Elle est célèbre depuis 1970.
Plus tard, aux États-Unis, les célèbres événements de formation des traders
La stratégie de trading de rupture est adaptée à la tendance relativement fluide des variétés de trading. La façon la plus courante de rupture est d'utiliser la relation de position relative entre le support et la résistance des prix pour déterminer la position de trading spécifique.
Le canal de Donchian est un indicateur orienté tendance, et son apparence et son signal sont quelque peu similaires à l'indicateur de la bande de Bollinger. Cependant, son canal de prix est construit en fonction des prix les plus élevés et les plus bas d'une certaine période. Par exemple: le rail supérieur est calculé par le prix le plus élevé de 50 k-line
comme indiqué ci-dessus: cet indicateur avec la courbe composée de trois couleurs différentes, le paramètre par défaut est le prix le plus élevé et le prix le plus bas dans le cycle 20 pour afficher la volatilité des prix. Il montrera moins de volatilité lorsque le prix est dans un canal étroit, et vice versa.
Si les prix augmentent au-dessus du rail supérieur, le signal d'achat apparaîtra; à l'inverse, si le prix tombe en dessous du rail inférieur, le signal de vente apparaîtra.
Sur la plateforme FMZ Quant, le calcul du canal Donchian est simple, vous peut simplement accéder au prix le plus élevé ou le plus bas dans le cycle donné, comme indiqué ci-dessous: la 5ème ligne est d'obtenir le prix le plus élevé de 50 cycles, la 6ème ligne est d'obtenir le prix le plus bas de 50 cycles.
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
Il existe de nombreuses façons d'utiliser le canal de Donchian, qui peut être utilisé seul ou en combinaison avec d'autres indicateurs. Dans cette section, nous l'utiliserons de la manière la plus simple. C'est-à-dire: lorsque les prix franchissent le rail supérieur, ce qui signifie qu'il dépasse la ligne de pression, le pouvoir d'achat est fort, il a formé une vague d'énergie croissante, un signal d'achat est généré; lorsque le prix dépasse le rail inférieur, ce qui signifie qu'il dépasse la ligne de support, le signal de vente est généré.
Si le prix retombe à nouveau sur le rail du milieu du canal après l'ouverture de la position longue, nous pensons que la force du pouvoir d'achat s'affaiblit, ou que la force du pouvoir de vente se renforce, et le signal d'ouverture de la position courte est généré; le même principe s'applique à l'ouverture de la position courte
Position longue ouverte: si aucune position n'est maintenue et que le prix de clôture est supérieur à la barre supérieure
Position ouverte à court terme: si aucune position n'est maintenue et que le prix de clôture est inférieur à la barre inférieure
Fermeture d'une position longue: si la position longue est actuellement détenue et que le prix de clôture est inférieur au niveau moyen
Position courte de clôture: si la position courte est actuellement détenue et que le prix de clôture est supérieur au niveau moyen
La première étape dans la mise en œuvre de la stratégie est d'obtenir les données d'abord, parce que les données sont une condition préalable de la stratégie de trading.
La prochaine étape consiste à calculer la logique de négociation sur la base de ces données; la dernière étape consiste à négocier selon la logique. étapes comme suit:
Vous pouvez considérer la bibliothèque de classe de trading comme un module fonctionnel. L'avantage de l'utilisation d'une bibliothèque de classe de trading est qu'elle vous permet de vous concentrer sur l'écriture de la logique de stratégie. Par exemple, lorsque nous utilisons la bibliothèque de classe de trading, afin d'ouvrir ou de fermer une position, nous pouvons directement utiliser l'interface API dans la bibliothèque de classe de trading; mais si nous n'utilisons pas la bibliothèque de classe de trading, nous devons obtenir le prix du marché lors de l'ouverture de la position.
def main();
wile true:
obj = ext.NewPositionManager() # using the trading class library
# followed by strategy logic and placing order part
La partie de codage ci-dessus est le cadre de stratégie CTA utilisant l'outil FMZ Quant. Il s'agit d'un format de codage fixe et tout le code de logique de trading commencera à la ligne 4.
Pensez-y, quels types de données avons-nous besoin? de notre stratégie de trading logique, nous devons d'abord obtenir l'état de la position actuelle, et puis comparer le prix de clôture avec l'indicateur Bollinger Band rails supérieur, moyen et inférieur.
La première est d'obtenir la matrice de données de ligne K et le prix de clôture de ligne K actuel, avec la matrice de ligne K, nous pouvons calculer la période de cycle N du prix le plus élevé et le plus bas à travers l'interface API. il peut être écrit comme ceci:
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
Comme indiqué ci-dessus:
Ligne 4: Obtenez le tableau de lignes K, qui est un format fixe.
Ligne 5: Filtrer la longueur de la ligne K, parce que le paramètre pour calculer l'indicateur de canal de Donchian est 50, quand le nombre de lignes K est inférieur à 50, il est impossible de le calculer.
Ligne 6: Nous utilisons le code " records[ len (records) - 1] " pour obtenir les dernières données du tableau de la ligne K, qui est la dernière ligne de données K. Ces données sont un objet, qui contient: le prix d'ouverture, le prix le plus élevé, le prix le plus bas et de clôture, aussi le volume de négociation, le temps et d'autres données, puisque c'est un objet, nous utilisons juste
L'information de position est une condition très importante dans la stratégie de trading quantitative. Lorsque les conditions de trading sont établies, il est nécessaire de juger si une commande doit être passée en fonction de l'état de la position et du nombre de positions. Par exemple, lorsque les conditions d'ouverture de positions longues sont établies, s'il y a une position de détention, ne passez pas l'ordre; s'il n'y a pas de position de détention, passez l'ordre. Cette fois, nous encapsulons directement l'information de position dans une fonction, nous pouvons simplement appeler cette fonction pour l'utiliser. comme ceci:
# 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
Comme indiqué ci-dessus:
C'est une fonction qui obtient les informations de position. s'il y a une position longue, la valeur est 1; s'il y a une position courte, la valeur est -1; s'il n'y a pas de position, la valeur est 0.
Ligne 2: Créer une fonction avec le nom
Ligne 3: Obtenez le tableau de position, qui est un format fixe.
Ligne 4: Déterminez la longueur du tableau de position. Si sa longueur est égale à 0, cela signifie qu'il n'a pas de position tenue, renvoie 0.
Ligne 6 : En utilisant la boucle for, en commençant à traverser ce tableau, la logique suivante est très simple, si elle maintient une position longue, renvoie 1 ; si elle maintient une position courte, renvoie -1.
Ligne 18 : appeler la fonction d'information de position
Dans l'outil de trading quantitatif FMZ Quant, vous pouvez utiliser directement les fonctions " TA.Highest " et " TA.Lowest " sans avoir à écrire vos propres calculs logiques. Et
# 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
Comme indiqué ci-dessus:
Ligne 19: appeler la fonction
Ligne 20 : appeler la fonction
Ligne 21: calculer la valeur moyenne des rails supérieur et inférieur selon le prix le plus élevé et le prix le plus bas de 50 cycles
Avec les données ci-dessus, nous pouvons écrire la logique de trading et la partie de placement des ordres maintenant. C'est également très simple, le plus couramment utilisé est l'instruction
# 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
Comme indiqué ci-dessus:
Ligne 22 : En utilisant la bibliothèque de classes de négociation, il s'agit d'un
Les lignes 23, 24 : Il s'agit d'une déclaration de position longue de clôture qui utilise les opérateurs de comparaison et les opérateurs logiques que nous avons appris auparavant, ce qui signifie que si la détention actuelle est une position longue et que le prix de clôture est inférieur au niveau moyen, toutes les positions sont clôturées.
Lines 25, 26 : Il s'agit d'une déclaration de position courte de clôture qui utilise les opérateurs de comparaison et les opérateurs logiques que nous avons appris auparavant, ce qui signifie que si l'ordre actuel est une position courte et que le prix de clôture est supérieur au niveau moyen, toutes les positions sont clôturées.
Ligne 27: déterminer l'état de la position actuelle.
Lines 28, 29 : Déterminez si le prix de clôture est supérieur à la barre supérieure.
Les lignes 30, 31 : Déterminer si le prix de clôture est inférieur à la ligne inférieure.
Ci-dessus, nous avons appris chaque étape du développement d'une stratégie de trading quantitative complète en utilisant Python, y compris: introduction de la stratégie, méthode de calcul du canal de Donchian, logique de stratégie, conditions de trading, mise en œuvre du code de stratégie, etc. Cette section est juste une stratégie simple.
Dans le développement de stratégies de trading quantitatives, du point de vue de la vitesse d'exécution du langage de programmation, lequel est le plus rapide? il doit être le C++. Surtout dans le domaine des dérivés financiers et du trading à haute fréquence. Le C++ est unique en termes de spécificité du langage et présente des avantages dans les calculs numériques. Par rapport à JavaScript et Python, sa vitesse peut être augmentée de plusieurs ordres de grandeur. Si vous voulez aller dans le domaine des dérivés financiers ou du trading à haute fréquence à l'avenir. Ce sera le cours que vous ne devriez pas manquer.
Commencez par les bases et mettez en œuvre la stratégie de cette section.
Essayez d'ajouter un indicateur de moyenne mobile à la stratégie de cette section pour réduire la fréquence des transactions.