bug with resampling
-
Hi,
I have some 5m data I'm trying to resample to hourly using
cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes)
but I get the following error on runningcerebro.run()
Traceback (most recent call last): File "test.py", line 237, in <module> result = cerebro.run() File "/home/who/dev/py/trading/lib/python3.5/site-packages/backtrader/cerebro.py", line 1142, in run runstrat = self.runstrategies(iterstrat) File "/home/who/dev/py/trading/lib/python3.5/site-packages/backtrader/cerebro.py", line 1310, in runstrategies self._runnext(runstrats) File "/home/who/dev/py/trading/lib/python3.5/site-packages/backtrader/cerebro.py", line 1627, in _runnext self._check_timers(runstrats, dt0, cheat=True) UnboundLocalError: local variable 'dt0' referenced before assignment
Indeed you can see at https://github.com/mementum/backtrader/blob/master/backtrader/cerebro.py#L1627 that the variable
dt0
is not in scope, and again a few lines later. However, I'm not smart enough to know what the fix is -- when I changeddt0
todata0
I get a different error later....Thanks so much for this great software!
-
Hey @rsbowman
Maybe you can also post your code? The cause might be something else other than resampling.
Also are you up to date?
-
@rsbowman said in bug with resampling:
Indeed you can see at https://github.com/mementum/backtrader/blob/master/backtrader/cerebro.py#L1627 that the variable dt0 is not in scope
The error message only shows that you have triggered an error condition in which
dt0
won't be defined. See below for a 1st good reason for it.I have some 5m data I'm trying to resample to hourly
cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes)
That isolated (gives no real information about what's being done) already shows that:
-
5m
data is being resampled to1-minute
data, which in itself is impossible.In any case this diagnostic assumes that
data
has the right charateristics, which it may not due to the lack of context.
As pointed out by ThatBlokeDave, some code with the complete picture could really help.
-
-
Thank you both, and thank you for your patience. I think I have misunderstood the
Cerebro.resampledata
method. My example above was incorrect, here's the code I tried:import datetime # my backtrader __version__ = '1.9.58.122' import backtrader as bt if __name__ == '__main__': cerebro = bt.Cerebro() data = bt.feeds.GenericCSVData( dataname="some-5m-data.csv", fromdate=datetime.datetime(2015, 1, 1), todate=datetime.datetime(2015, 12, 31), openinterest=-1, timeframe=bt.TimeFrame.Ticks) cerebro.resampledata(d, timeframe=60*bt.TimeFrame.Minutes) #cerebro.resampledata(data, # timeframe=bt.TimeFrame.Ticks, # compression=12) cerebro.run()
I'd like to turn my 5m data into hourly data. Now I think that multiplying 60 times
TimeFrame.Minutes
is not meaningful and instead I should do the thing that's commented out above... Is this correct? Compress 12 5m bars into a single 60m bar?Thanks again!
-
@rsbowman said in bug with resampling:
data = bt.feeds.GenericCSVData( dataname="some-5m-data.csv", fromdate=datetime.datetime(2015, 1, 1), todate=datetime.datetime(2015, 12, 31), openinterest=-1, timeframe=bt.TimeFrame.Ticks)
That is not being tagged as
5-minutes
data. It is being tagged asTicks
See here Docs - Data Resampling
The parameters
timeframe
andcompression
are explained forresampledata
. They also apply to the data feed for the initial tagging.See also the [See: Community - FAQ] for
timeframe
andcompression
In any case:
@rsbowman said in bug with resampling:
Is this correct? Compress 12 5m bars into a single 60m bar?
You don't specify a transform, you specify your target
-
Ok, so in the case above the correct thing to do would be
# ... data = bt.feeds.GenericCSVData( dataname="some-5m-data.csv", fromdate=datetime.datetime(2015, 1, 1), todate=datetime.datetime(2015, 12, 31), timeframe=bt.TimeFrame.Minutes, compression=5) cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes, compression=60)
This looks correct when I run it, thanks for your help!