From 4b0578623002912023815665cbc459a8e5ef6f78 Mon Sep 17 00:00:00 2001 From: EmbraysiteReal <46327982+EmbraysiteReal@users.noreply.github.com> Date: Thu, 9 Dec 2021 12:17:51 +0100 Subject: [PATCH] Mdd almost final push Correction bug close mark & compute mdd for each pair --- freqtrade/data/btanalysis.py | 38 +++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/freqtrade/data/btanalysis.py b/freqtrade/data/btanalysis.py index 2c1995165..7d32ab0f1 100644 --- a/freqtrade/data/btanalysis.py +++ b/freqtrade/data/btanalysis.py @@ -409,25 +409,45 @@ def calculate_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_da mdd_df = pd.DataFrame() + mdd_pair_list = [] for pair, df in data.items(): - trades_aux = trades.loc[trades['pair']==pair][["open_date","close_date"]] - trades_aux = pd.concat([trades_aux.rename(columns={'open_date':'date'})[['date']], - trades_aux.rename(columns={'close_date':'date'})[['date']]] - ).sort_values(by='date') - trades_aux['open_close_mark'] = np.ones(len(trades_aux), dtype=int) - data_join = df.set_index('date').join(trades_aux.set_index('date')) - data_join["open_close_mark"] = data_join["open_close_mark"].fillna(0).astype(int) + open_close_trades = trades.loc[trades['pair']==pair][["open_date","close_date"]] + open_close_trades = pd.concat([open_close_trades.rename(columns={'open_date':'date'})[['date']], + open_close_trades.rename(columns={'close_date':'date'})[['date']]] + ).sort_values(by='date') + open_close_trades['open_close_mark'] = np.ones(len(open_close_trades), dtype=int) + data_join = df.set_index('date').join(open_close_trades.set_index('date')) + del open_close_trades + + close_trades = trades.loc[trades['pair']==pair][["close_date"]] + close_trades = close_trades.rename(columns={'close_date':'date'}) + close_trades['close_mark'] = np.ones(len(close_trades), dtype=int) + data_join = data_join.join(close_trades.set_index('date')) + del close_trades + + data_join[["open_close_mark",'close_mark']] = data_join[["open_close_mark",'close_mark']].fillna(0).astype(int) data_join['is_in_trade'] = data_join.open_close_mark.cumsum()&1 # &1 <=> %2 data_join.loc[data_join['open_close_mark'] == 1, 'is_in_trade'] = 1 data_join['close_cummax'] = 0 + data_join["open_close_mark"] = data_join["open_close_mark"] - data_join["close_mark"] + data_join['close_cummax'] = data_join.groupby(data_join.open_close_mark.cumsum()).close.cummax() data_join.loc[data_join['is_in_trade'] == 0, 'close_cummax'] = 0 - + + data_join = data_join.rename(columns={'close_mark':'drawdown'}) + data_join['drawdown'] = data_join['close_cummax'] - data_join['close'] + + mdd_pair = data_join['drawdown'].max() + mdd_pair_list.append(mdd_pair) # print(mdd_df) - return mdd_df + + mdd_pair_list = np.ndarray(mdd_pair_list) + + + return mdd_pair_list.max() def calculate_csum(trades: pd.DataFrame, starting_balance: float = 0) -> Tuple[float, float]: """