finition mdd
This commit is contained in:
parent
beefbad160
commit
3e7ecf931b
@ -390,7 +390,7 @@ def calculate_max_drawdown(trades: pd.DataFrame, *, date_col: str = 'close_date'
|
|||||||
low_val = max_drawdown_df.loc[idxmin, 'cumulative']
|
low_val = max_drawdown_df.loc[idxmin, 'cumulative']
|
||||||
return abs(min(max_drawdown_df['drawdown'])), high_date, low_date, high_val, low_val
|
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'
|
value_col: str = 'profit_ratio'
|
||||||
) -> float:
|
) -> float:
|
||||||
"""
|
"""
|
||||||
@ -407,9 +407,7 @@ def calculate_mdd(data: dict, trades: pd.DataFrame, *, date_col: str = 'close_da
|
|||||||
if len(trades) == 0:
|
if len(trades) == 0:
|
||||||
raise ValueError("Trade dataframe empty")
|
raise ValueError("Trade dataframe empty")
|
||||||
|
|
||||||
mdd_df = pd.DataFrame()
|
trades_mdd_pair_list = []
|
||||||
|
|
||||||
mdd_pair_list = []
|
|
||||||
|
|
||||||
for pair, df in data.items():
|
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']
|
/ data_join['close_cummax']
|
||||||
|
|
||||||
mdd_pair = data_join['drawdown'].max()
|
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]:
|
def calculate_csum(trades: pd.DataFrame, starting_balance: float = 0) -> Tuple[float, float]:
|
||||||
"""
|
"""
|
||||||
|
@ -9,7 +9,7 @@ from tabulate import tabulate
|
|||||||
|
|
||||||
from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN, UNLIMITED_STAKE_AMOUNT
|
from freqtrade.constants import DATETIME_PRINT_FORMAT, LAST_BT_RESULT_FN, UNLIMITED_STAKE_AMOUNT
|
||||||
from freqtrade.data.btanalysis import (calculate_csum, calculate_market_change,
|
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
|
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:
|
try:
|
||||||
mdd = calculate_mdd(btdata, results)
|
trades_mdd = calculate_trades_mdd(btdata, results)
|
||||||
max_drawdown, _, _, _, _ = calculate_max_drawdown(
|
max_drawdown, _, _, _, _ = calculate_max_drawdown(
|
||||||
results, value_col='profit_ratio')
|
results, value_col='profit_ratio')
|
||||||
drawdown_abs, drawdown_start, drawdown_end, high_val, low_val = calculate_max_drawdown(
|
drawdown_abs, drawdown_start, drawdown_end, high_val, low_val = calculate_max_drawdown(
|
||||||
results, value_col='profit_abs')
|
results, value_col='profit_abs')
|
||||||
strat_stats.update({
|
strat_stats.update({
|
||||||
|
'trades_mdd' : trades_mdd,
|
||||||
'max_drawdown': max_drawdown,
|
'max_drawdown': max_drawdown,
|
||||||
'max_drawdown_abs': drawdown_abs,
|
'max_drawdown_abs': drawdown_abs,
|
||||||
'drawdown_start': drawdown_start.strftime(DATETIME_PRINT_FORMAT),
|
'drawdown_start': drawdown_start.strftime(DATETIME_PRINT_FORMAT),
|
||||||
@ -487,6 +488,7 @@ def generate_strategy_stats(btdata: Dict[str, DataFrame],
|
|||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
strat_stats.update({
|
strat_stats.update({
|
||||||
|
'trades_mdd': 0.0,
|
||||||
'max_drawdown': 0.0,
|
'max_drawdown': 0.0,
|
||||||
'max_drawdown_abs': 0.0,
|
'max_drawdown_abs': 0.0,
|
||||||
'max_drawdown_low': 0.0,
|
'max_drawdown_low': 0.0,
|
||||||
@ -716,9 +718,10 @@ def text_table_add_metrics(strat_results: Dict) -> str:
|
|||||||
strat_results['stake_currency'])),
|
strat_results['stake_currency'])),
|
||||||
('Max balance', round_coin_value(strat_results['csum_max'],
|
('Max balance', round_coin_value(strat_results['csum_max'],
|
||||||
strat_results['stake_currency'])),
|
strat_results['stake_currency'])),
|
||||||
|
('', ''), # Empty line to improve readability
|
||||||
('Drawdown', f"{strat_results['max_drawdown']:.2%}"),
|
('Max Drawdown (in trades)', f"{strat_results['trades_mdd']:.2%}"),
|
||||||
('Drawdown', round_coin_value(strat_results['max_drawdown_abs'],
|
('Max Drawdown Total', f"{strat_results['max_drawdown']:.2%}"),
|
||||||
|
('Max Drawdown Total', round_coin_value(strat_results['max_drawdown_abs'],
|
||||||
strat_results['stake_currency'])),
|
strat_results['stake_currency'])),
|
||||||
('Drawdown high', round_coin_value(strat_results['max_drawdown_high'],
|
('Drawdown high', round_coin_value(strat_results['max_drawdown_high'],
|
||||||
strat_results['stake_currency'])),
|
strat_results['stake_currency'])),
|
||||||
|
Loading…
Reference in New Issue
Block a user