Adding data to cerebro with buy/sell signal
-
Dear Community,
I'm trying to add a merged list to cerebro for each day of the backtesting period that contains the (OHLCV data, stock name) pairs for the particular day.
Stocks to buy I store in a list (cerebrolistBUY) with their names, stocks to sell, contrarily, have a '-' sign before their names in another list (cerebrolistSELL). The two lists are merged and passed to cerebro:cerebrolist=cerebrolistBUY+cerebrolistSELL for i in range(len(cerebrolist)): cerebro = bt.Cerebro() cerebro.addstrategy(TestStrategy) data = bt.feeds.PandasData(dataname=cerebrolist[i][0]) cerebro.adddata(data, name=cerebrolist[i][1])
How could I create the buy and sell signal in the next() method? Indicators are already used for selecting the stocks for the particular day (i.e., creating the 2 lists), so only their names show whether they are to be bought or sold (have a minus sign before their names or not).
Thank you in advance for any help!
-
It would really help if you showed a snippet of your lists. Because it is unclear what you are actually adding to the system.
-
In any case you may want to check this: Blog - Evaluating External Historical Performance
-
The snippet loads all data feeds to
cerebro
from the listcerebrolist
. There are no designation what pair should be bought/sold on what day. So with the snippet above I don't think that it is possible to issue any signals.
-
@backtrader
For a given day: cerebrolistSELL=[( Open High Low Close Volume
Date
2018-10-31 1.65 1.7 1.62 1.7 507791.0, '-FLT.V'), ( Open High Low Close Volume
Date
2018-10-31 0.6 0.62 0.6 0.62 2644244.0, '-SY.V')]
-
@ab_trader
The designation is the presence or absence of the minus sign before the stock name (stored in cerebrolist[i][1]).
Actually I would like to refer to that in the next() method.
-
So in the
next()
you obtain the current data date, look up this date in your list and buy or sell corresponding tickets.
-
Given the data above
@vishamar said in Adding data to cerebro with buy/sell signal:
cerebrolistSELL=[( Open High Low Close Volume Date 2018-10-31 1.65 1.7 1.62 1.7 507791.0, '-FLT.V'), ( Open High Low Close Volume Date 2018-10-31 0.6 0.62 0.6 0.62 2644244.0, '-SY.V')]
and given the code
@vishamar said in Adding data to cerebro with buy/sell signal:
cerebrolist=cerebrolistBUY+cerebrolistSELL for i in range(len(cerebrolist)): cerebro = bt.Cerebro() cerebro.addstrategy(TestStrategy) data = bt.feeds.PandasData(dataname=cerebrolist[i][0]) cerebro.adddata(data, name=cerebrolist[i][1])
I don't really think this code is actually doing anything. It would seem you are attempting to pass individual days to
PandasData
withcerebrolist[i][0]
, and I say attempting because you seem to be passing the name of the fields and the fields all at once.Does the code even work?
In any case, such a data structure doesn't seem directly compatible as input to a data feed. You need a complete set of
OHLCV
for the given data and not the data of days in which you buy/sell that data.
-
@backtrader
Thank you for the clarification.
I modified the script to create a list of stocks for a given backtesting period that my indicators show to be worth buying or selling for each day and pass their OHLCV data for the given period to cerebro.
I have now these kinds of lists:cerebrolistBUY=[(datetime.datetime(2018, 10, 11, 0, 0), 'FLT.V'), (datetime.datetime(2018, 10, 31, 0, 0), 'SY.V')] cerebrolistSELL=[(datetime.datetime(2018, 10, 19, 0, 0), '-FLT.V')]
Can I use somehow in the next() method the date and the minus sign for buy/sell signal?
-
If you manage to get a meaningful data feed, you can always compare the datetime and if it's a match you sell if the name starts with
-
and otherwise buy.Your best bet is to transform the list to match the format in the blog post linked above (Evaluating External Historical Performance)