question

Upvotes
Accepted
28 2 3 7

Datastream Data For BackTrader

Hello, is there someone that coud help to feed Datastream data into Backtrader using the following example ?

from datetime import datetime

import backtrader as bt



# Create a subclass of Strategy to define the indicators and logic



class SmaCross(bt.Strategy):

    # list of parameters which are configurable for the strategy

    params = dict(

        pfast=10,  # period for the fast moving average

        pslow=30   # period for the slow moving average

    )



    def __init__(self):

        sma1 = bt.ind.SMA(period=self.p.pfast)  # fast moving average

        sma2 = bt.ind.SMA(period=self.p.pslow)  # slow moving average

        self.crossover = bt.ind.CrossOver(sma1, sma2)  # crossover signal



    def next(self):

        if not self.position:  # not in the market

            if self.crossover > 0:  # if fast crosses slow to the upside

                self.buy()  # enter long



        elif self.crossover < 0:  # in the market & cross to the downside



            self.close()  # close long position



# create a "Cerebro" engine instance

cerebro = bt.Cerebro()  



# Create a data feed

data = ds.get_data(tickers='@MSFT', fields=['PO','PH','PL','P','RI','VO'], start='-5Y', end='0D', freq='D')

cerebro.adddata(data)  # Add the data feed



cerebro.addstrategy(SmaCross)  # Add the trading strategy

cerebro.run()  # run it all

cerebro.plot()  # and plot it with a single command


The cerebro.adddata(data) # Add the data feed gives an error.

Any help would be highly appreciated !

datastream-apidsws-apidatastreambacktesting
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
56k 145 45 65

@anilo

You need to use the bt.feeds.PandasData method instead.

The code looks like this.

datads = ds.get_data(tickers='@MSFT', fields=['PO','PH','PL','P','VO'], start='-5Y', end='0D', freq='D')
datads.columns = datads.columns.droplevel()
datads.index = pd.to_datetime(datads.index, format='%Y-%m-%d')
datads = datads.rename(columns={"PO": "Open", 
                       "PH":"High",
                       "PL":"Low",
                       "P":"Close",
                       "VO": "Volume"})


data = bt.feeds.PandasData(dataname=datads.dropna())

cerebro.adddata(data)


icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
28 2 3 7

Great!


Many thanks.


However there is now another error related to the plot, since I have the

Javascript Error: IPython is not defined


https://newbedev.com/javascript-error-ipython-is-not-defined-in-jupyterlab


Or maybe is due to the fact that Pandas needs to have a specific column format ? See https://www.backtrader.com/docu/pandas-datafeed/pandas-datafeed/

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@anilo

I have followed the steps mentioned in the stackoverflow.

Then, I ran the following code.

%matplotlib widget
cerebro.plot(iplot=False)

The plot is shown properly.

Upvotes
28 2 3 7

Cool! Now it works!

Many thanks!

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
1 0 0 0

How to you get dates properly displayed on x-axis of this cerebro plot()?

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.