question

Upvotes
Accepted
30 4 5 13

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.

Hello @Aleniles

Thank you for your participation in the forum. Is the reply below satisfactory in resolving your query?


If so please can you click the 'Accept' text next to the appropriate reply? This will guide all community members who have a similar question.

Thanks,


AHS

@Aleniles

Hi,

Please let us know if you have any updates on this question.

If it is still an issue, please post again to offer further insight into your question.

Regards,

AHS

Upvotes
Accepted
78.6k 248 52 74

@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
30 4 5 13

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
30 4 5 13

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.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

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