diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index 7d97661c4..bbb25d204 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -390,6 +390,35 @@ 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: pd.DataFrame, trades: pd.DataFrame, *, date_col: str = 'close_date', + value_col: str = 'profit_ratio' + ) -> float: + """ + Calculate MDD (Max DrawDown) : + Give the max drawdown given each trades and the history candles data. + Args: + trades (pd.DataFrame): [description] + date_col (str, optional): [description]. Defaults to 'close_date'. + value_col (str, optional): [description]. Defaults to 'profit_ratio'. + + Returns: + float: [description] + """ + if len(trades) == 0: + raise ValueError("Trade dataframe empty") + + mdd_df = pd.DataFrame() + + for pair, df in data.items(): + print(pair) + print(df) + open_close_date = trades.loc[trades['pair']==pair] + # print(open_close_date) + # mdd_df = df[[df["date"].isin(open_close_date), open_close_date]] + # print(mdd_df) + return mdd_df + + 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 dcd6b4e1f..2d8750535 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_max_drawdown, calculate_mdd) from freqtrade.misc import decimals_per_coin, file_dump_json, round_coin_value @@ -462,6 +462,7 @@ def generate_strategy_stats(btdata: Dict[str, DataFrame], } try: + mdd = calculate_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(