Avoid recalculating statistics for comparison line

This commit is contained in:
Matthias 2022-01-05 19:21:24 +01:00
parent 8373a4e713
commit 6abd6bceb9

View File

@ -1,4 +1,5 @@
import logging import logging
from copy import deepcopy
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Union from typing import Any, Dict, List, Union
@ -194,29 +195,21 @@ def generate_sell_reason_stats(max_open_trades: int, results: DataFrame) -> List
return tabular_data return tabular_data
def generate_strategy_comparison(all_results: Dict) -> List[Dict]: def generate_strategy_comparison(bt_stats: Dict) -> List[Dict]:
""" """
Generate summary per strategy Generate summary per strategy
:param all_results: Dict of <Strategyname: DataFrame> containing results for all strategies :param result: Dict of <Strategyname: DataFrame> containing results for all strategies
:return: List of Dicts containing the metrics per Strategy :return: List of Dicts containing the metrics per Strategy
""" """
tabular_data = [] tabular_data = []
for strategy, results in all_results.items(): for strategy, result in bt_stats.items():
tabular_data.append(_generate_result_line( tabular_data.append(deepcopy(result['results_per_pair'][-1]))
results['results'], results['config']['dry_run_wallet'], strategy) # Update "key" to strategy (results_per_pair has it as "Total").
) tabular_data[-1]['key'] = strategy
try: tabular_data[-1]['max_drawdown_account'] = result['max_drawdown_account']
max_drawdown_per, _, _, _, _, _ = calculate_max_drawdown(results['results'], tabular_data[-1]['max_drawdown_abs'] = round_coin_value(
value_col='profit_ratio') result['max_drawdown_abs'], result['stake_currency'], False)
max_drawdown_abs, _, _, _, _, _ = calculate_max_drawdown(results['results'],
value_col='profit_abs')
except ValueError:
max_drawdown_per = 0
max_drawdown_abs = 0
tabular_data[-1]['max_drawdown_per'] = round(max_drawdown_per * 100, 2)
tabular_data[-1]['max_drawdown_abs'] = \
round_coin_value(max_drawdown_abs, results['config']['stake_currency'], False)
return tabular_data return tabular_data
@ -524,7 +517,7 @@ def generate_backtest_stats(btdata: Dict[str, DataFrame],
min_date, max_date, market_change=market_change) min_date, max_date, market_change=market_change)
result['strategy'][strategy] = strat_stats result['strategy'][strategy] = strat_stats
strategy_results = generate_strategy_comparison(all_results=all_results) strategy_results = generate_strategy_comparison(bt_stats=result['strategy'])
result['strategy_comparison'] = strategy_results result['strategy_comparison'] = strategy_results
@ -649,7 +642,7 @@ def text_table_strategy(strategy_results, stake_currency: str) -> str:
headers.append('Drawdown') headers.append('Drawdown')
# Align drawdown string on the center two space separator. # Align drawdown string on the center two space separator.
drawdown = [f'{t["max_drawdown_per"]:.2f}' for t in strategy_results] drawdown = [f'{t["max_drawdown_account"] * 100:.2f}' for t in strategy_results]
dd_pad_abs = max([len(t['max_drawdown_abs']) for t in strategy_results]) dd_pad_abs = max([len(t['max_drawdown_abs']) for t in strategy_results])
dd_pad_per = max([len(dd) for dd in drawdown]) dd_pad_per = max([len(dd) for dd in drawdown])
drawdown = [f'{t["max_drawdown_abs"]:>{dd_pad_abs}} {stake_currency} {dd:>{dd_pad_per}}%' drawdown = [f'{t["max_drawdown_abs"]:>{dd_pad_abs}} {stake_currency} {dd:>{dd_pad_per}}%'