diff --git a/docs/backtesting.md b/docs/backtesting.md index a5d8726b4..6a5109d06 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -274,8 +274,8 @@ A backtesting result will look like that: | XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 0 23 34.3 | | ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 0 15 31.8 | | TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 0 243 43.4 | -========================================================= SELL REASON STATS ========================================================== -| Sell Reason | Sells | Wins | Draws | Losses | +========================================================= EXIT REASON STATS ========================================================== +| Exit Reason | Sells | Wins | Draws | Losses | |:-------------------|--------:|------:|-------:|--------:| | trailing_stop_loss | 205 | 150 | 0 | 55 | | stop_loss | 166 | 0 | 0 | 166 | @@ -359,14 +359,14 @@ On the other hand, if you set a too high `minimal_roi` like `"0": 0.55` (55%), there is almost no chance that the bot will ever reach this profit. Hence, keep in mind that your performance is an integral mix of all different elements of the strategy, your configuration, and the crypto-currency pairs you have set up. -### Sell reasons table +### Exit reasons table -The 2nd table contains a recap of sell reasons. +The 2nd table contains a recap of exit reasons. This table can tell you which area needs some additional work (e.g. all or many of the `sell_signal` trades are losses, so you should work on improving the sell signal, or consider disabling it). ### Left open trades table -The 3rd table contains all trades the bot had to `forcesell` at the end of the backtesting period to present you the full picture. +The 3rd table contains all trades the bot had to `forceexit` at the end of the backtesting period to present you the full picture. This is necessary to simulate realistic behavior, since the backtest period has to end at some point, while realistically, you could leave the bot running forever. These trades are also included in the first table, but are also shown separately in this table for clarity. diff --git a/freqtrade/optimize/optimize_reports.py b/freqtrade/optimize/optimize_reports.py index 76c92b4b7..85b5e9e13 100644 --- a/freqtrade/optimize/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports.py @@ -382,7 +382,7 @@ def generate_strategy_stats(pairlist: List[str], enter_tag_results = generate_tag_metrics("enter_tag", starting_balance=start_balance, results=results, skip_nan=False) - sell_reason_stats = generate_sell_reason_stats(max_open_trades=max_open_trades, + exit_reason_stats = generate_sell_reason_stats(max_open_trades=max_open_trades, results=results) left_open_results = generate_pair_metrics(pairlist, stake_currency=stake_currency, starting_balance=start_balance, @@ -406,7 +406,7 @@ def generate_strategy_stats(pairlist: List[str], 'worst_pair': worst_pair, 'results_per_pair': pair_results, 'results_per_enter_tag': enter_tag_results, - 'sell_reason_summary': sell_reason_stats, + 'sell_reason_summary': exit_reason_stats, 'left_open_trades': left_open_results, # 'days_breakdown_stats': days_breakdown_stats, @@ -572,16 +572,16 @@ def text_table_bt_results(pair_results: List[Dict[str, Any]], stake_currency: st floatfmt=floatfmt, tablefmt="orgtbl", stralign="right") -def text_table_sell_reason(sell_reason_stats: List[Dict[str, Any]], stake_currency: str) -> str: +def text_table_exit_reason(sell_reason_stats: List[Dict[str, Any]], stake_currency: str) -> str: """ Generate small table outlining Backtest results - :param sell_reason_stats: Sell reason metrics + :param sell_reason_stats: Exit reason metrics :param stake_currency: Stakecurrency used :return: pretty printed table with tabulate as string """ headers = [ - 'Sell Reason', - 'Sells', + 'Exit Reason', + 'Exits', 'Win Draws Loss Win%', 'Avg Profit %', 'Cum Profit %', @@ -813,10 +813,10 @@ def show_backtest_result(strategy: str, results: Dict[str, Any], stake_currency: print(' BUY TAG STATS '.center(len(table.splitlines()[0]), '=')) print(table) - table = text_table_sell_reason(sell_reason_stats=results['sell_reason_summary'], + table = text_table_exit_reason(sell_reason_stats=results['sell_reason_summary'], stake_currency=stake_currency) if isinstance(table, str) and len(table) > 0: - print(' SELL REASON STATS '.center(len(table.splitlines()[0]), '=')) + print(' EXIT REASON STATS '.center(len(table.splitlines()[0]), '=')) print(table) table = text_table_bt_results(results['left_open_trades'], stake_currency=stake_currency) diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index 3c6e5df4b..7471e0875 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -1304,7 +1304,7 @@ def test_backtest_start_multi_strat_nomock(default_conf, mocker, caplog, testdat captured = capsys.readouterr() assert 'BACKTESTING REPORT' in captured.out - assert 'SELL REASON STATS' in captured.out + assert 'EXIT REASON STATS' in captured.out assert 'DAY BREAKDOWN' in captured.out assert 'LEFT OPEN TRADES REPORT' in captured.out assert '2017-11-14 21:17:00 -> 2017-11-14 22:58:00 | Max open trades : 1' in captured.out @@ -1413,7 +1413,7 @@ def test_backtest_start_nomock_futures(default_conf_usdt, mocker, captured = capsys.readouterr() assert 'BACKTESTING REPORT' in captured.out - assert 'SELL REASON STATS' in captured.out + assert 'EXIT REASON STATS' in captured.out assert 'LEFT OPEN TRADES REPORT' in captured.out @@ -1518,7 +1518,7 @@ def test_backtest_start_multi_strat_nomock_detail(default_conf, mocker, captured = capsys.readouterr() assert 'BACKTESTING REPORT' in captured.out - assert 'SELL REASON STATS' in captured.out + assert 'EXIT REASON STATS' in captured.out assert 'LEFT OPEN TRADES REPORT' in captured.out diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index a0f1f74b0..4a6155441 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -21,7 +21,7 @@ from freqtrade.optimize.optimize_reports import (_get_resample_from_period, gene generate_strategy_comparison, generate_trading_stats, show_sorted_pairlist, store_backtest_stats, text_table_bt_results, - text_table_sell_reason, text_table_strategy) + text_table_exit_reason, text_table_strategy) from freqtrade.resolvers.strategy_resolver import StrategyResolver from tests.conftest import CURRENT_TEST_STRATEGY from tests.data.test_history import _backup_file, _clean_test_file @@ -281,7 +281,7 @@ def test_text_table_sell_reason(): ) result_str = ( - '| Sell Reason | Sells | Win Draws Loss Win% | Avg Profit % | Cum Profit % |' + '| Exit Reason | Exits | Win Draws Loss Win% | Avg Profit % | Cum Profit % |' ' Tot Profit BTC | Tot Profit % |\n' '|---------------+---------+--------------------------+----------------+----------------+' '------------------+----------------|\n' @@ -293,7 +293,7 @@ def test_text_table_sell_reason(): sell_reason_stats = generate_sell_reason_stats(max_open_trades=2, results=results) - assert text_table_sell_reason(sell_reason_stats=sell_reason_stats, + assert text_table_exit_reason(sell_reason_stats=sell_reason_stats, stake_currency='BTC') == result_str