[PYTHON] Bereiten Sie Backtrader-CSV-Daten vor und versuchen Sie, das Beispielskript auszuführen

Wie benutzt man Backtrader?

Wenn das Beispielskript unverändert verwendet wird, tritt ein Fehler auf.

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

Nach der Installation, als ich das Beispielskript auf dieser Seite ausführte, wurde die Fehlermeldung "Die CSV-Datei ist im angegebenen Pfad nicht vorhanden" angezeigt.

Ich habe versucht zu suchen, aber der entsprechende Ordner selbst wurde lokal nicht gefunden. Wenn Sie Backtrader mit PIP herunterladen, sind der Datenordner, in dem das Beispielskript ausgeführt wird, und der Beispielordner selbst offenbar nicht enthalten.

Bereiten Sie CSV-Daten vor

https://github.com/mementum/backtrader/blob/master/datas/orcl-1995-2014.txt Kopieren Sie daher den Inhalt des Oracle-Aktienkurses "orcl-1995-2014.txt" von dieser Git-Seite und machen Sie daraus eine Textdatei. Speichern Sie dies im selben Verzeichnis wie das Beispielskript und schreiben Sie den Dateipfadspezifikationsteil im Skript neu. (Für Jupyter-Notebook das Verzeichnis, in dem die ipynb-Datei gespeichert ist: C: \ Benutzer \ Benutzername standardmäßig)

datapath.py



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

#Schreiben Sie dies wie folgt um

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

Versuchen Sie es mit Jupyter Notebook

Starten Sie das Jupyter-Notizbuch in der virtuellen Umgebung von Anaconda und führen Sie das folgende Beispielskript mit neu geschriebenem Dateipfad aus.

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

Bei der Ausführung in Jupyter Notebook werden das Strategiehandelsergebnis (weggelassen) und das Indikatorplot angezeigt.

Wenn Sie im Fall eines Jupyter-Notizbuchs zu Beginn des Beispielskripts "% matplotlib notebook" schreiben, werden dem Plot-Bildschirm eine Zoom-Schaltfläche und eine Diagramm-Bildlaufschaltfläche hinzugefügt. Durch Drücken dieser Taste können Sie den Teil der Preisbewegung vergrößern, an dem Sie interessiert sind. Sie können den gewünschten Ort auch mit derselben Vergrößerung verschieben. Diesmal wird es nicht angezeigt, aber es ist praktisch, wenn Sie den Kerzenhalter im Detail analysieren möchten.

quickstart3.JPG

(Hinzugefügt 2020.0207) Es unterscheidet sich vom obigen Skript, aber wenn Sie den Kerzenhalter vergrößern, sieht es so aus. Wechseln Sie am Ende des Skripts zu "cerebro.plot (style =" candle "). index.png

Recommended Posts

Bereiten Sie Backtrader-CSV-Daten vor und versuchen Sie, das Beispielskript auszuführen
CSV-Daten extrahieren und berechnen
Installieren Sie OpenCV2.4 (+ Python) schnell unter OS X und probieren Sie das Beispiel aus
Versuchen Sie, das Python-Beispielproblem mit grundlegenden Informationen nur mit einem Browser auszuführen
Laden Sie Beispieldaten herunter, bevor Sie Bokeh ausführen
Ich habe versucht, die verkratzten Daten in CSV zu speichern!
Python-Skript, das SQL-Dateien liest, BigQuery ausführt und CSV speichert