4.4 Comment mettre en œuvre des stratégies en Python

Auteur:La bonté, Créé: 2019-04-28 16:51:22, mis à jour:

Résumé

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.

Introduction à la stratégie

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 turtle ont eu lieu, ce qui a été un grand succès dans l'histoire du trading de titres.

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.

Règles de stratégie du canal de Donchian

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 le plus récent; le rail inférieur est calculé par le prix le plus bas de 50 k-line le plus récent.

img

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.

Méthode de calcul du canal de Donchian

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

La logique de la stratégie

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é.

img

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

Conditions de négociation

  • 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

Mise en œuvre du code de stratégie

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:

Étape 1: Utilisation de la bibliothèque des classes de négociation

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.

Étape 2: obtenir toutes sortes de données

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.

  • Obtenez les données de la ligne K.

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 .Close pour obtenir le dernier prix de clôture de la ligne K.

  • Obtenez les données de position

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 mp. Cette fonction n'a pas de paramètres.

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 mp.

  • Acquérir le prix le plus élevé et le plus bas des 50 lignes K les plus récentes

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 TA.Highest et TA.Lowest fonction renvoie un résultat des valeurs spécifiques au lieu d'un tableau. C'est très pratique.

# 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 TA.Highest pour obtenir le prix le plus élevé de 50 cycles

Ligne 20 : appeler la fonction TA.Lowest pour obtenir le prix le plus bas de 50 cycles

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

Étape 3: Commande et échange

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 if, qui peut être décrite comme suit: si les conditions 1 et 2 sont vraies, placez l'ordre; si la condition 3 ou la condition 4 est vraie, placez l'ordre.

# 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.

Pour résumer

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.

Communiqué de la section suivante

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.

Exercices après l'école

  1. Commencez par les bases et mettez en œuvre la stratégie de cette section.

  2. Essayez d'ajouter un indicateur de moyenne mobile à la stratégie de cette section pour réduire la fréquence des transactions.


Plus de