@anshul96go
To get the actual statistics you currently have to calculate them like so:
import qnt.stats as qns
data = qndata.cryptodaily_load_data(min_date="2014-01-01") # or whenever your backtest started
stats = qns.calc_stat(data, weights)
And if you really need them as xls file you can do:
stats.to_pandas().to_excel('stats.xls') # I got a ModuleNotFoundError the first time - pip install did the trick.
Allthough I can't recommend xls because at least LibreOffice becomes very slow / unresponsive when handling such a file.
Getting the statistics after a backtest could be a little simpler, which brings me to a feature request:
@support
Do you think you could add a parameter to the backtester which makes it return the statistics? They get calculated anyway by default, but we only see a truncated printout or the plots and can't use them for further analysis.
.
In my local environment I did it like this in qnt.backtester.py:
Add the parameter return_stats: bool = False to the parameters of the backtest function
From line 353 onward my backtester now looks like this:
	qnout.write(result)
        qnstate.write(state)
        if return_stats:
            analyze = True
        out = [result]
        if analyze:
            log_info("---")
            stats = analyze_results(result, data, competition_type, build_plots, start_date)
            if return_stats:
                out.append(stats)
        if args_count > 1:
            out.append(state)
        if len(out) == 1:
            out = out[0]
        return out
    finally:
        qndc.set_max_datetime(None)
And of course I made analyze_results return the statistics like so (line 458 in the original):
    if not build_plots:
        log_info(stat_global.to_pandas().tail())
        return stat_global # here
    log_info("---")
    log_info("Calc stats per asset...")
    stat_per_asset = qnstat.calc_stat(data, output, per_asset=True)
    stat_per_asset = stat_per_asset.loc[output.time.values[0]:]
    if is_notebook():
        build_plots_jupyter(output, stat_global, stat_per_asset)
    else:
        build_plots_dash(output, stat_global, stat_per_asset)
    return stat_global # and there
This might not be the most elegant solution but you get the idea.
Now I can get the statistics immediately after the backtest with
weights, stats = backtest(...return_stats=True)
and can do further analysis.
For instance, I started to calculate the correlations between my strategies to avoid uploading more of the same to the contest.
It would be nice to have this feature in a future version, so I don't have to mess with the backtester after each update 😉
Best regards