[PYTHON] Préparez les données CSV Backtrader et essayez d'exécuter l'exemple de script

Comment utiliser Backtrader

Si l'exemple de script est utilisé tel quel, une erreur se produit.

backtrader Document_Quickstart https://www.backtrader.com/docu/quickstart/quickstart/

Après l'installation, lorsque j'exécutais l'exemple de script sur cette page, j'ai reçu une erreur disant "Le fichier CSV n'existe pas dans le chemin spécifié".

J'ai essayé de rechercher, mais le dossier correspondant lui-même n'a pas été trouvé localement. Apparemment, si vous téléchargez backtrader avec PIP, le dossier de données utilisé pour exécuter l'exemple de script et le dossier d'exemple lui-même ne sont pas inclus.

Préparer les données CSV

https://github.com/mementum/backtrader/blob/master/datas/orcl-1995-2014.txt Par conséquent, copiez le contenu du cours de l'action d'Oracle "orcl-1995-2014.txt" à partir de cette page Git et créez-en un fichier texte. Enregistrez-le dans le même répertoire que l'exemple de script et réécrivez la partie spécification du chemin de fichier dans le script. (Pour le notebook Jupyter, le répertoire dans lequel le fichier ipynb est enregistré: C: \ Users \ user name par défaut)

datapath.py



datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')

#Réécrivez ceci comme suit

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

Essayez de l'exécuter avec le notebook Jupyter

Démarrez le notebook Jupyter à partir de l'environnement virtuel d'Anaconda et exécutez l'exemple de script suivant avec le chemin du fichier réécrit.

quickstart.py



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

import datetime  # For datetime objects
import os.path  # To manage paths
import sys  # To find out the script name (in argv[0])

# Import the backtrader platform
import backtrader as bt


# Create a Stratey
class TestStrategy(bt.Strategy):
    params = (
        ('maperiod', 15),
    )

    def log(self, txt, dt=None):
        ''' Logging function fot this strategy'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):
        # Keep a reference to the "close" line in the data[0] dataseries
        self.dataclose = self.datas[0].close

        # To keep track of pending orders and buy price/commission
        self.order = None
        self.buyprice = None
        self.buycomm = None

        # Add a MovingAverageSimple indicator
        self.sma = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=self.params.maperiod)

        # Indicators for the plotting show
        bt.indicators.ExponentialMovingAverage(self.datas[0], period=25)
        bt.indicators.WeightedMovingAverage(self.datas[0], period=25,
                                            subplot=True)
        bt.indicators.StochasticSlow(self.datas[0])
        bt.indicators.MACDHisto(self.datas[0])
        rsi = bt.indicators.RSI(self.datas[0])
        bt.indicators.SmoothedMovingAverage(rsi, period=10)
        bt.indicators.ATR(self.datas[0], plot=False)

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            # Buy/Sell order submitted/accepted to/by broker - Nothing to do
            return

        # Check if an order has been completed
        # Attention: broker could reject order if not enough cash
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(
                    'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                    (order.executed.price,
                     order.executed.value,
                     order.executed.comm))

                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:  # Sell
                self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.comm))

            self.bar_executed = len(self)

        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('Order Canceled/Margin/Rejected')

        # Write down: no pending order
        self.order = None

    def notify_trade(self, trade):
        if not trade.isclosed:
            return

        self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
                 (trade.pnl, trade.pnlcomm))

    def next(self):
        # Simply log the closing price of the series from the reference
        self.log('Close, %.2f' % self.dataclose[0])

        # Check if an order is pending ... if yes, we cannot send a 2nd one
        if self.order:
            return

        # Check if we are in the market
        if not self.position:

            # Not yet ... we MIGHT BUY if ...
            if self.dataclose[0] > self.sma[0]:

                # BUY, BUY, BUY!!! (with all possible default parameters)
                self.log('BUY CREATE, %.2f' % self.dataclose[0])

                # Keep track of the created order to avoid a 2nd order
                self.order = self.buy()

        else:

            if self.dataclose[0] < self.sma[0]:
                # SELL, SELL, SELL!!! (with all possible default parameters)
                self.log('SELL CREATE, %.2f' % self.dataclose[0])

                # Keep track of the created order to avoid a 2nd order
                self.order = self.sell()


if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(TestStrategy)

    # Datas are in a subfolder of the samples. Need to find where the script is
    # because it could have been called from anywhere
    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    #datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')
    datapath = 'C:\\Users\\xxxx\\orcl-1995-2014.txt'

    # Create a Data Feed
    data = bt.feeds.YahooFinanceCSVData(
        dataname=datapath,
        # Do not pass values before this date
        fromdate=datetime.datetime(2000, 1, 1),
        # Do not pass values before this date
        todate=datetime.datetime(2000, 12, 31),
        # Do not pass values after this date
        reverse=False)

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # Set our desired cash start
    cerebro.broker.setcash(1000.0)

    # Add a FixedSize sizer according to the stake
    cerebro.addsizer(bt.sizers.FixedSize, stake=10)

    # Set the commission
    cerebro.broker.setcommission(commission=0.0)

    # Print out the starting conditions
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

    # Run over everything
    cerebro.run()

    # Print out the final result
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

    # Plot the result
    cerebro.plot()

quickstart2.JPG

Lorsqu'il est exécuté dans le notebook Jupyter, le résultat commercial de la stratégie (omis) et le tracé de l'indicateur sont affichés.

Dans le cas du notebook Jupyter, si vous écrivez % matplotlib notebook au début de l'exemple de script, un bouton de zoom et un bouton de défilement du graphique seront ajoutés à l'écran de tracé. En appuyant dessus, vous pouvez agrandir la partie du mouvement des prix qui vous intéresse. Vous pouvez également déplacer l'endroit que vous souhaitez voir avec le même grossissement. Il n'est pas affiché cette fois, mais c'est pratique lorsque vous souhaitez analyser le chandelier en détail.

quickstart3.JPG

(Ajouté 2020.0207) C'est différent du script ci-dessus, mais lorsque vous zoomez sur le chandelier, cela ressemble à ceci. Basculez vers cerebro.plot (style = 'candle') à la fin du script. index.png

Recommended Posts

Préparez les données CSV Backtrader et essayez d'exécuter l'exemple de script
Extraire les données csv et calculer
Installez rapidement OpenCV2.4 (+ python) sur OS X et essayez l'exemple
Essayez d'exécuter l'exemple de problème Python d'informations de base uniquement avec un navigateur
Téléchargez des exemples de données avant d'exécuter Bokeh
J'ai essayé de sauvegarder les données récupérées au format CSV!
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv