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 !

Best Answer

  • Jirapongse
    Jirapongse admin
    Answer ✓

    @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)


Answers