From 3e7ecf931b196c2083c1d1f292ff9233e7e53d1d Mon Sep 17 00:00:00 2001 From: Guitheg Date: Thu, 9 Dec 2021 16:21:02 +0100 Subject: [PATCH] finition mdd --- freqtrade/data/btanalysis.py | 12 +++++------- freqtrade/optimize/optimize_reports.py | 13 ++++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index bc0003843..3a79f4bc2 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -390,7 +390,7 @@ def calculate_max_drawdown(trades: pd.DataFrame, *, date_col: str = 'close_date' low_val = max_drawdown_df.loc[idxmin, 'cumulative'] return abs(min(max_drawdown_df['drawdown'])), high_date, low_date, high_val, low_val -def calculate_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_date', +def calculate_trades_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_date', value_col: str = 'profit_ratio' ) -> float: """ @@ -407,9 +407,7 @@ def calculate_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_da if len(trades) == 0: raise ValueError("Trade dataframe empty") - mdd_df = pd.DataFrame() - - mdd_pair_list = [] + trades_mdd_pair_list = [] for pair, df in data.items(): @@ -448,12 +446,12 @@ def calculate_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_da / data_join['close_cummax'] mdd_pair = data_join['drawdown'].max() - mdd_pair_list.append(mdd_pair) + trades_mdd_pair_list.append(mdd_pair) - mdd_pair_list = np.array(mdd_pair_list) + trades_mdd_pair_list = np.array(trades_mdd_pair_list) - return mdd_pair_list.max() + return trades_mdd_pair_list.max() def calculate_csum(trades: pd.DataFrame, starting_balance: float = 0) -> Tuple[float, float]: """ diff --git a/freqtrade/optimize/optimize_reports.py b/freqtrade/optimize/optimize_reports.py index 2d8750535..d920c035c 100644 --- a/freqtrade/optimize/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports.py @@ -9,7 +9,7 @@ from tabulate import tabulate from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN, UNLIMITED_STAKE_AMOUNT from freqtrade.data.btanalysis import (calculate_csum, calculate_market_change, - calculate_max_drawdown, calculate_mdd) + calculate_max_drawdown, calculate_trades_mdd) from freqtrade.misc import decimals_per_coin, file_dump_json, round_coin_value @@ -462,12 +462,13 @@ def generate_strategy_stats(btdata: Dict[str, DataFrame], } try: - mdd = calculate_mdd(btdata, results) + trades_mdd = calculate_trades_mdd(btdata, results) max_drawdown, _, _, _, _ = calculate_max_drawdown( results, value_col='profit_ratio') drawdown_abs, drawdown_start, drawdown_end, high_val, low_val = calculate_max_drawdown( results, value_col='profit_abs') strat_stats.update({ + 'trades_mdd' : trades_mdd, 'max_drawdown': max_drawdown, 'max_drawdown_abs': drawdown_abs, 'drawdown_start': drawdown_start.strftime(DATETIME_PRINT_FORMAT), @@ -487,6 +488,7 @@ def generate_strategy_stats(btdata: Dict[str, DataFrame], except ValueError: strat_stats.update({ + 'trades_mdd': 0.0, 'max_drawdown': 0.0, 'max_drawdown_abs': 0.0, 'max_drawdown_low': 0.0, @@ -716,9 +718,10 @@ def text_table_add_metrics(strat_results: Dict) -> str: strat_results['stake_currency'])), ('Max balance', round_coin_value(strat_results['csum_max'], strat_results['stake_currency'])), - - ('Drawdown', f"{strat_results['max_drawdown']:.2%}"), - ('Drawdown', round_coin_value(strat_results['max_drawdown_abs'], + ('', ''), # Empty line to improve readability + ('Max Drawdown (in trades)', f"{strat_results['trades_mdd']:.2%}"), + ('Max Drawdown Total', f"{strat_results['max_drawdown']:.2%}"), + ('Max Drawdown Total', round_coin_value(strat_results['max_drawdown_abs'], strat_results['stake_currency'])), ('Drawdown high', round_coin_value(strat_results['max_drawdown_high'], strat_results['stake_currency'])),