From caec345c0b77364412ae0ec2c524ff2eab9ef316 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 2 Jan 2020 07:28:30 +0100 Subject: [PATCH] Extract generate_text_table_sell_reason from backtesting class --- freqtrade/optimize/backtest_reports.py | 13 +++++++++++++ freqtrade/optimize/backtesting.py | 17 ++++------------- tests/optimize/test_backtesting.py | 8 +++----- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/freqtrade/optimize/backtest_reports.py b/freqtrade/optimize/backtest_reports.py index 501d22228..8912af22a 100644 --- a/freqtrade/optimize/backtest_reports.py +++ b/freqtrade/optimize/backtest_reports.py @@ -51,3 +51,16 @@ def generate_text_table(data: Dict[str, Dict], stake_currency: str, max_open_tra # Ignore type as floatfmt does allow tuples but mypy does not know that return tabulate(tabular_data, headers=headers, floatfmt=floatfmt, tablefmt="pipe") # type: ignore + + +def generate_text_table_sell_reason(data: Dict[str, Dict], results: DataFrame) -> str: + """ + Generate small table outlining Backtest results + """ + tabular_data = [] + headers = ['Sell Reason', 'Count', 'Profit', 'Loss'] + for reason, count in results['sell_reason'].value_counts().iteritems(): + profit = len(results[(results['sell_reason'] == reason) & (results['profit_abs'] >= 0)]) + loss = len(results[(results['sell_reason'] == reason) & (results['profit_abs'] < 0)]) + tabular_data.append([reason.value, count, profit, loss]) + return tabulate(tabular_data, headers=headers, tablefmt="pipe") diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index e90a4c7ea..1c92860a8 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -14,12 +14,13 @@ from tabulate import tabulate from freqtrade.configuration import (TimeRange, remove_credentials, validate_config_consistency) -from freqtrade.optimize.backtest_reports import generate_text_table from freqtrade.data import history from freqtrade.data.dataprovider import DataProvider from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_minutes, timeframe_to_seconds from freqtrade.misc import file_dump_json +from freqtrade.optimize.backtest_reports import ( + generate_text_table, generate_text_table_sell_reason) from freqtrade.persistence import Trade from freqtrade.resolvers import ExchangeResolver, StrategyResolver from freqtrade.state import RunMode @@ -130,17 +131,7 @@ class Backtesting: return data, timerange - def _generate_text_table_sell_reason(self, data: Dict[str, Dict], results: DataFrame) -> str: - """ - Generate small table outlining Backtest results - """ - tabular_data = [] - headers = ['Sell Reason', 'Count', 'Profit', 'Loss'] - for reason, count in results['sell_reason'].value_counts().iteritems(): - profit = len(results[(results['sell_reason'] == reason) & (results['profit_abs'] >= 0)]) - loss = len(results[(results['sell_reason'] == reason) & (results['profit_abs'] < 0)]) - tabular_data.append([reason.value, count, profit, loss]) - return tabulate(tabular_data, headers=headers, tablefmt="pipe") + def _generate_text_table_strategy(self, all_results: dict) -> str: """ @@ -467,7 +458,7 @@ class Backtesting: results=results)) print(' SELL REASON STATS '.center(133, '=')) - print(self._generate_text_table_sell_reason(data, results)) + print(generate_text_table_sell_reason(data, results)) print(' LEFT OPEN TRADES REPORT '.center(133, '=')) print(generate_text_table(data, diff --git a/tests/optimize/test_backtesting.py b/tests/optimize/test_backtesting.py index 67332c10a..554d8974b 100644 --- a/tests/optimize/test_backtesting.py +++ b/tests/optimize/test_backtesting.py @@ -19,7 +19,8 @@ from freqtrade.data.dataprovider import DataProvider from freqtrade.data.history import get_timerange from freqtrade.exceptions import DependencyException, OperationalException from freqtrade.optimize import setup_configuration, start_backtesting -from freqtrade.optimize.backtest_reports import generate_text_table +from freqtrade.optimize.backtest_reports import ( + generate_text_table, generate_text_table_sell_reason) from freqtrade.optimize.backtesting import Backtesting from freqtrade.state import RunMode from freqtrade.strategy.default_strategy import DefaultStrategy @@ -361,8 +362,6 @@ def test_tickerdata_to_dataframe_bt(default_conf, mocker, testdatadir) -> None: def test_generate_text_table(default_conf, mocker): patch_exchange(mocker) - # default_conf['max_open_trades'] = 2 - # backtesting = Backtesting(default_conf) results = pd.DataFrame( { @@ -392,7 +391,6 @@ def test_generate_text_table(default_conf, mocker): def test_generate_text_table_sell_reason(default_conf, mocker): patch_exchange(mocker) - backtesting = Backtesting(default_conf) results = pd.DataFrame( { @@ -412,7 +410,7 @@ def test_generate_text_table_sell_reason(default_conf, mocker): '| roi | 2 | 2 | 0 |\n' '| stop_loss | 1 | 0 | 1 |' ) - assert backtesting._generate_text_table_sell_reason( + assert generate_text_table_sell_reason( data={'ETH/BTC': {}}, results=results) == result_str