For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Throwing an exception when run in multiple processes
-
I write a strategy in this Jupyter notebook: Clenow trend following strategy - Github
I try to run a grid search to find out the optimal parameters combination. If I run sequentially as the following, no problem at all:
stats = [] for params in tqdm(params_list): result = run_strategy(params) stats.append(result)
If I run in parallel as the following:
stats = db.from_sequence(params_list).map(run_strategy).compute()
It always throw out an exception:
~/anaconda3/lib/python3.7/site-packages/backtrader/lineiterator.py in dopostinit() 133 134 # my minperiod is as large as the minperiod of my lines --> 135 _obj._minperiod = max([x._minperiod for x in _obj.lines]) 136 137 # Recalc the period ValueError: max() arg is an empty sequence
Full stack trace is in the Jupyter notebook.
Any ideas? Thanks!
-
I guess the issue is in the Donchian channel indicator:
class DonchianChannelsIndicator(bt.Indicator): '''Donchian channel.''' alias = ('DCH', 'DonchianChannel',) lines = ('dcm', 'dch', 'dcl',) # dc middle, dc high, dc low params = ( ('period', 20), # lookback period ) plotinfo = dict(subplot=False) # plot along with data plotlines = dict( dcm=dict(ls='--'), # dashed line dch=dict(_samecolor=True), # use same color as prev line (dcm) dcl=dict(_samecolor=True), # use same color as prev line (dch) ) def __init__(self): super().__init__() self.addminperiod(self.params.period + 1) self.lines.dch = bt.indicators.Highest(self.data.high(-1), period=self.params.period) self.lines.dcl = bt.indicators.Lowest(self.data.low(-1), period=self.params.period) self.lines.dcm = (self.lines.dch + self.lines.dcl) / 2.0 # avg of the above
In sequential mode the indicator has 3 lines, while in parallel mode the indicator has 0 lines, why? This is so weird.
Probably Backtrader is not compatible with Dask?
-
It seems Backtrader is not compatible with Dask.
Dask version not working:
with ProgressBar(): # Backtrader is not compatible with Dask stats = db.from_sequence(params_list).map(run_strategy).compute()
Plain
multiprocessing
version works:with multiprocessing.Pool(os.cpu_count()) as p: stats = p.map(run_strategy, params_list)