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 !
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)
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/
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.