Comment créer un indicateur personnalisé Backtrader

__ Comment puis-je créer l'indicateur moi-même? __

Création d'indicateurs -Créer une classe qui hérite de la classe bt.indicator -Définir l'objet Lignes à tracer ・ Définissez des paramètres tels que la période de la ligne moyenne mobile -Ajouter les paramètres d'affichage du tracé si nécessaire ・ Ecrire une expression Je vais le créer dans le flux.

À titre d'exemple, faisons une stocastique et jetons un œil à son contenu.

sto1.py



import backtrader as bt


class MyStochastic1(bt.Indicator):  #bt.Indicateur d'héritage
    
    lines = ('k', 'd', )  #Objet Lignes à afficher sur le tracé
    params = (
        ('k_period', 14), #Spécifiez les paramètres avec des tapples
        ('d_period', 3),  #Virgule à la fin du taple(、)Mettre en
    )
    plotinfo = dict(plot   =True,
                    subplot=True,
                    plotname='',
               )   

    def __init__(self):
        
        highest = bt.indicators.Highest(self.datas[0], period=self.params.k_period)
        lowest = bt.indicators.Lowest(self.datas[0], period=self.params.k_period)        
        self.lines.k = k = (self.datas[0] - lowest) / (highest - lowest)    
        self.lines.d = bt.ind.SimpleMovingAverage(k, period=self.params.d_period)

    def next(self):
        pass

Voici la vue d'ensemble de la classe d'indicateurs. Un prix haut / bas de 14 jours est nécessaire pour calculer les stocastiques. Combinez-les avec le cours de clôture pour calculer le montant de la variation et lissez-le avec une moyenne mobile simple sur 3 jours.

Déclaration de classe

class MyStochastic1(bt.Indicator): Commencez par déclarer la classe "MyStochastic1" qui hérite de la classe Backtrader Indicator.

Paramètres d'objet Lignes

lines=('k','d')

Il y a deux lignes dans Stocastics, K et D. Je mets donc en place deux objets Lignes à afficher dans le tracé. Cet objet Lines est comme "Index buffer" dans MQL4, et est un ** tableau itérable ** dans lequel les valeurs numériques et les axes de temps sont connectés. Cerebro trace cet objet Lines sur le graphique.

Index et tranche d'objet de lignes

Dans MQL4, la dernière barre est représentée par [0]. À partir de la dernière barre, le nombre augmente avec l'âge, 1, 2, 3, .... Même dans le backtrader, le dernier objet Bar / Lines est représenté par [0]. C'est la même chose que MQL4. Cependant, à mesure que la barre vieillit en fonction de 0, des symboles moins tels que -1, -2, -3 ... sont ajoutés.

À cet égard, les objets Lines ne peuvent pas effectuer les opérations de découpage Python d'origine. Si vous souhaitez utiliser des tranches, utilisez la méthode get ().

myslice = self.lines.my_sma.get (il y a = 0, taille = 1) [-1] Un seul tableau sauf [0] myslice = self.lines.my_sma.get (il y a = 0, taille = 10) 10 tableaux de [-1] à [-10] sauf [0] myslice = self.lines.my_sma.get (ago = -1, size = 5) Séquences de [-2] à [-6] sauf [-1]

** * L'opérateur [] peut être utilisé pour les objets Lignes uniquement dans la méthode suivante. Je résumerai la méthode suivante à une date ultérieure. ** **

Réglages des paramètres (params)

params = ( ('k_period', 14), ('d_period', 3), * # Ajouter une virgule à la fin * ) Stocastics calcule sur une période de 14 jours et adoucit les résultats avec une moyenne mobile simple de 3 jours. (K_period, d_period) C'est ce paramètre qui le définit. Spécifiez par taple de taple ou dict (). (Référence 1) Il est exprimé en écrivant "self.params.name" comme self.params.k_period. Pour les taples, veillez à ne pas oublier de mettre la dernière virgule.

Paramètres de tracé (plotinfo)

plotinfo = dict(plot =True, subplot=True, plotname='', ) Vous pouvez modifier les paramètres lors du traçage.

plot: affichage du tracé activé / désactivé subplot: changer l'affichage de la sous-fenêtre plotname: nom d'affichage de la note de bas de page (le nom de la classe est affiché s'il est vide)

Il existe d'autres éléments de réglage.

Ecrire une expression dans la méthode Init

Création de formule # 1 Appel d'un indicateur intégré pour le calcul

highest = bt.indicators.Highest(self.datas[0],period=self.params.k_period) lowest = bt.indicators.Lowest(self.datas[0],period=self.params.k_period) Décrivez le calcul de stockatics dans la méthode init. Tout d'abord, calculez les prix hauts et bas pour 14 jours. Heureusement, backtrader a un indicateur qui calcule les prix hauts et bas pour une période spécifique. Les indicateurs intégrés peuvent être appelés avec bt.indicators.XXXX (). (Notez s à la fin!) Ici, nous appelons le plus haut et le plus bas pour trouver les valeurs les plus élevées et les plus basses pendant la période k_period. Je mets le résultat dans les objets Lines le plus haut et le plus bas.

Création d'une expression Partie 2 Mettre une valeur dans l'objet Lines

self.lines.k = k = (self.datas[0] - lowest) / (highest - lowest) self.lines.d = bt.ind.SimpleMovingAverage(k,period=self.params.d_period)

L'objet Lines à tracer est représenté par "self.lines.name". k est «self.lines.k» et d est «self.lines.d». L'objet Lines résultant peut également être utilisé pour les calculs. Ici, afin de simplifier la notation du calcul sur la ligne suivante, il est affecté à "k" et passé à l'indicateur de moyenne mobile simple.

Flux de données (données)

self.datas[0] Self.datas [0] dans la formule représente "les premières données CSV". Sauf indication contraire, le cours de clôture est utilisé. Étant donné que plusieurs données peuvent être transmises, par exemple, lors de la transmission de deux données CSV telles que quotidienne et hebdomadaire, la période la plus petite doit être spécifiée en premier et la période la plus longue doit être spécifiée ultérieurement. En d'autres termes, les données [0] doivent être des données quotidiennes et les données [1] doivent être des données hebdomadaires. Cette fois, seules les données quotidiennes sont transmises.

Abréviation

--- Officiel réduction
lines self.lines.XXX self.l.XXX
params self.params.XXX self.p.XXX
datas self.datas[0].close self.data.fermer ou soi.data
indicators bt.indicators.XXX bt.ind.XXX
Alias SimpleMovingAverage SMA

Backtrader peut être abrégé. C'est pratique, mais cela peut être déroutant jusqu'à ce que vous vous y habituiez. Et en fait, vous pouvez omettre toutes les informations de parcelle cette fois. Si plot, subplot, plotname sont omis, les paramètres par défaut seront utilisés.

méthode suivante

Je ne l'ai pas utilisé cette fois, mais si vous voulez juger des conditions ou effectuer un traitement pour chaque barre, décrivez le contenu dans la méthode suivante.

Achèvement Appel en classe de stratégie

__ Comment afficher l'indicateur? __

Tous les réglages sont terminés. Si vous instanciez cette classe d'indicateur dans la méthode init de la classe de stratégie, Cerebro la tracera sur le graphique. Vous pouvez nommer librement l'instance.

self.myind1 = MyStochastic1(self.data)

(Des commentaires explicatifs ont été ajoutés à divers endroits et sont abrégés autant que possible.)

sto12.py


%matplotlib notebook
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import datetime  
import os.path  
import sys  


import backtrader as bt


class MyStochastic1(bt.Indicator):
    
    lines = ('k', 'd', )  #Objet Lignes à afficher sur le tracé
    params = (
        ('k_period', 14), #Spécifiez les paramètres avec des tapples
        ('d_period', 3),  #Virgule à la fin du taple(、)Mettre en
    )
    
    #réduction
    #plotinfo = dict()

    def __init__(self):
        #Pour être exact, moi.datas[0]Peut être omis
        # self.params.k_omettre période et soi.p.k_period 
        highest = bt.ind.Highest(self.data, period=self.p.k_period)
        lowest = bt.ind.Lowest(self.data, period=self.p.k_period)        
       
        self.lines.k = k = (self.data - lowest) / (highest - lowest)    
        self.lines.d = bt.ind.SMA(k, period=self.p.d_period)

        

class TestStrategy(bt.Strategy):
    def __init__(self):
        #La partie du nom d'instance myind1 peut être n'importe quel nom
        self.myind1 = MyStochastic1(self.data)    
        
        
if __name__ == '__main__':
    cerebro = bt.Cerebro()
    cerebro.addstrategy(TestStrategy)

    datapath = 'C:\\Users\\XXXX\\orcl-1995-2014.txt'

    # Create a Data Feed
    data = bt.feeds.YahooFinanceCSVData(
        dataname=datapath,        
        fromdate=datetime.datetime(2000, 1, 1),
        todate=datetime.datetime(2000, 12, 31),
        reverse=False)

    cerebro.adddata(data)
    cerebro.run(stdstats=False)
    cerebro.plot(style='candle')

1sto.png

Les stocastiques sont affichés en toute sécurité.

Flux irrégulier jusqu'à ce que Cerebro commence

__ Qu'est-ce que Cerebro? __

C'est la fonction principale de Backtrader. Si vous démarrez ce Cerebro après avoir défini divers paramètres, il achètera et vendra automatiquement, analysera et optimisera et tracera automatiquement les résultats. Je vais passer en revue le flux jusqu'au début de Cerebro dans le script précédent.

  1. Décrivez le contenu du trading automatique et l'indicateur à appeler pour cela dans la classe de stratégie (TestStrategy).
  2. Instancier Cerebro cerebro = bt. Cerebro ()
  3. Transmettez les données CSV à cerebro cerebro.adddata (data)
  4. Chargez la stratégie dans cerebro cerebro.addstrategy (TestStrategy)
  5. Démarrez cerebro cerebro.run ()
  6. Affichez le graphique cerebro.plot ()

Si vous créez une classe de stratégie "TestStrategy" que vous pensez à vous-même, spécifiez des données CSV, puis exécutez Cerebro, le contenu de cette classe "TestStrategy" sera exécuté automatiquement. Je n'ai pas fait de trading automatique cette fois, mais Cerebro le tracera car Stocastics est utilisé dans "Test Strategy".

Résumé

Qu'as-tu pensé? Pour utiliser des indicateurs personnalisés avec Backtrader, créez votre propre classe d'indicateurs personnalisés et instanciez-la dans la classe de stratégie.

Les références

Référence 1

Référence 2 2.Gold vs SP500 https://www.backtrader.com/blog/posts/2016-12-13-gold-vs-sp500/gold-vs-sp500/

Recommended Posts

Comment créer un indicateur personnalisé Backtrader
Comment faire une traduction japonais-anglais
Comment créer un robot - Avancé
Comment créer une fonction récursive
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
[Python] Comment rendre une classe itérable
Comment créer un plan de site Pelican
Comment créer un système de dialogue dédié aux débutants
Comment créer un dictionnaire avec une structure hiérarchique.
Comment créer un plug-in QGIS (génération de package)
J'ai lu "Comment créer un laboratoire de piratage"
Comment appeler une fonction
[Go] Comment créer une erreur personnalisée pour Sentry
Comment pirater un terminal
Comment créer un package Python à l'aide de VS Code
Comment créer un BOT Cisco Webex Teams à l'aide de Flask
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment créer un jeu d'action multijoueur en ligne avec Slack
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64 bits Partie 2-
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64-bit edition -
Comment créer un package Python (écrit pour un stagiaire)
Comment faire un simple jeu Flappy Bird avec Pygame
Comment mettre un lien symbolique
Comment créer un package Conda
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
[Blender] Comment rendre les scripts Blender multilingues
Comment supprimer un conteneur Docker
Comment créer un fichier de configuration
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Comment personnaliser U-Boot avec une carte personnalisée pour OSD335X (Remarque)
[Langage C] Comment créer, éviter et créer un processus zombie
Spigot (Paper) Introduction à la création d'un plug-in pour 2020 # 01 (Construction de l'environnement)
Comment faire un test unitaire Part.1 Modèle de conception pour l'introduction
[Python] Comment créer une matrice de motifs répétitifs (repmat / tile)
Comment rendre les caractères de Word Cloud monochromatiques
Comment diviser et enregistrer un DataFrame
Comment créer un environnement de traduction sphinx
Comment créer un dossier git clone
Comment ajouter un package avec PyCharm
Comment dessiner un graphique avec Matplotlib
Faisons un noyau jupyter
[Colab] Comment copier un vaste ensemble de données
[Python] Comment inverser une chaîne de caractères
Comment installer un package à l'aide d'un référentiel
[Ubuntu] Comment exécuter un script shell
[Cocos2d-x] Comment créer une liaison de script (partie 2)
Comment créer une clé USB à démarrage multiple (compatible Windows 10)
Comment créer un référentiel à partir d'un média
J'ai créé une API Web
Pour rendre une propriété de type dict en lecture seule
Comment choisir une palette de couleurs Seaborn
Comment tester sur une page authentifiée par Django
[Cocos2d-x] Comment créer une liaison de script (partie 1)
Comment exécuter des scripts Maya Python