How to convert strategy results to a dictionary without knowing parameter names
-
After passing a dictionary of param values into the strategy (using **params in the call to optstrategy), and calling cerebro.run, the result includes a list of strategy objects that contain an object called backtrader.metabase.AutoInfoClass_LineRoot_LineMultiple_LineSeries_LineIterator_DataAccessor_StrategyBase_Strategy_MyStrategy. The per-instance parameter values are there, but that object doesn't support dict(), items(), or enumerate(). Is there some way the caller of cerebro.run can convert that to a dictionary without hard-coding parameter names so it can track which parameter set had the best performance?
-
You can iterate through your strategies and extract analyzers for information. There are a number of built in analyzers as well you can custom make your own for your personal information needs.
In the following example I have used variable parameters on 'fast' and 'slow'.
I have used the transactions analyzer as follows:
cerebro.addanalyzer(bt.analyzers.Transactions, _name="transactions")
To go through the results and create a dictionary of the 'Transactions' analyzyer just loop through the strategies, extract your personal parameters for each strategy, make that a tuple which will be the key for the dictionary, then extract the analyzer data and make that the value.
# Optimizing on 'fast' and 'slow' dct_transactions = {} for strat in results: param_id = (strat[0].params.fast, strat[0].params.slow) dct_transactions[param_id] = strat[0].analyzers.getbyname("transactions")
The result will be a dictionary for each optimization as key and with an analyzer object as value. To view the contents of any analyzer object use .get_analysis. You could loop though the dictionary or just call a specific optimization level as below, fast: 11, slow: 20:
dct_transactions[(11,20)].get_analysis()
I used this method in Jupyter extensively to do further analysis. In particular I like to obtain: All transactions, Position each day, Total cash and market values.
-
Thanks for posting, but that misses my question. I have a generic walkforward class that needs to get a dictionary of parameter names and values from the result of cerebro run. Because it's generic for any strategy, it can't hard-code parameter names like strat[0].params.slow.
-
I was retrieving parameters from the strategy output after optimization run with the following code:
optreturn = cerebro.run() for optsingle in optreturn: optresults = dict() for strat in optsingle: optresults.update(dict(strat.params._getkwargs()))
optresults
variable is a dictionary of parameters for single optimization run. -
Thank you! _getkwargs looks like exactly what I need.