From 896c9d34fdc5b4e13f158217ac6432184ace4c76 Mon Sep 17 00:00:00 2001 From: Gianluca Puglia Date: Tue, 22 Jan 2019 22:41:53 +0100 Subject: [PATCH] Added total profit column do backtest result --- freqtrade/optimize/backtesting.py | 23 +++++++++++++------- freqtrade/tests/optimize/test_backtesting.py | 22 ++++++++++--------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 38bbe13d4..05624d9bd 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -100,11 +100,13 @@ class Backtesting(object): :return: pretty printed table with tabulate as str """ stake_currency = str(self.config.get('stake_currency')) + max_open_trades = self.config.get('max_open_trades') - floatfmt = ('s', 'd', '.2f', '.2f', '.8f', 'd', '.1f', '.1f') + floatfmt = ('s', 'd', '.2f', '.2f', '.8f', '.2f', 'd', '.1f', '.1f') tabular_data = [] headers = ['pair', 'buy count', 'avg profit %', 'cum profit %', - 'total profit ' + stake_currency, 'avg duration', 'profit', 'loss'] + 'tot profit ' + stake_currency, 'tot profit %', 'avg duration', + 'profit', 'loss'] for pair in data: result = results[results.pair == pair] if skip_nan and result.profit_abs.isnull().all(): @@ -116,6 +118,7 @@ class Backtesting(object): result.profit_percent.mean() * 100.0, result.profit_percent.sum() * 100.0, result.profit_abs.sum(), + result.profit_percent.sum() * 100.0 / max_open_trades, str(timedelta( minutes=round(result.trade_duration.mean()))) if not result.empty else '0:00', len(result[result.profit_abs > 0]), @@ -129,6 +132,7 @@ class Backtesting(object): results.profit_percent.mean() * 100.0, results.profit_percent.sum() * 100.0, results.profit_abs.sum(), + results.profit_percent.sum() * 100.0 / max_open_trades, str(timedelta( minutes=round(results.trade_duration.mean()))) if not results.empty else '0:00', len(results[results.profit_abs > 0]), @@ -153,11 +157,13 @@ class Backtesting(object): Generate summary table per strategy """ stake_currency = str(self.config.get('stake_currency')) + max_open_trades = self.config.get('max_open_trades') - floatfmt = ('s', 'd', '.2f', '.2f', '.8f', 'd', '.1f', '.1f') + floatfmt = ('s', 'd', '.2f', '.2f', '.8f', '.2f', 'd', '.1f', '.1f') tabular_data = [] headers = ['Strategy', 'buy count', 'avg profit %', 'cum profit %', - 'total profit ' + stake_currency, 'avg duration', 'profit', 'loss'] + 'tot profit ' + stake_currency, 'tot profit %', 'avg duration', + 'profit', 'loss'] for strategy, results in all_results.items(): tabular_data.append([ strategy, @@ -165,6 +171,7 @@ class Backtesting(object): results.profit_percent.mean() * 100.0, results.profit_percent.sum() * 100.0, results.profit_abs.sum(), + results.profit_percent.sum() * 100.0 / max_open_trades, str(timedelta( minutes=round(results.trade_duration.mean()))) if not results.empty else '0:00', len(results[results.profit_abs > 0]), @@ -430,18 +437,18 @@ class Backtesting(object): strategy if len(self.strategylist) > 1 else None) print(f"Result for strategy {strategy}") - print(' BACKTESTING REPORT '.center(119, '=')) + print(' BACKTESTING REPORT '.center(133, '=')) print(self._generate_text_table(data, results)) - print(' SELL REASON STATS '.center(119, '=')) + print(' SELL REASON STATS '.center(133, '=')) print(self._generate_text_table_sell_reason(data, results)) - print(' LEFT OPEN TRADES REPORT '.center(119, '=')) + print(' LEFT OPEN TRADES REPORT '.center(133, '=')) print(self._generate_text_table(data, results.loc[results.open_at_end], True)) print() if len(all_results) > 1: # Print Strategy summary table - print(' Strategy Summary '.center(119, '=')) + print(' Strategy Summary '.center(133, '=')) print(self._generate_text_table_strategy(all_results)) print('\nFor more details, please look at the detail tables above') diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index 5ab44baad..fbcbe4c55 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -341,6 +341,7 @@ def test_tickerdata_to_dataframe_bt(default_conf, mocker) -> 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( @@ -356,13 +357,13 @@ def test_generate_text_table(default_conf, mocker): result_str = ( '| pair | buy count | avg profit % | cum profit % | ' - 'total profit BTC | avg duration | profit | loss |\n' + 'tot profit BTC | tot profit % | avg duration | profit | loss |\n' '|:--------|------------:|---------------:|---------------:|' - '-------------------:|:---------------|---------:|-------:|\n' - '| ETH/BTC | 2 | 15.00 | 30.00 | ' - '0.60000000 | 0:20:00 | 2 | 0 |\n' - '| TOTAL | 2 | 15.00 | 30.00 | ' - '0.60000000 | 0:20:00 | 2 | 0 |' + '-----------------:|---------------:|:---------------|---------:|-------:|\n' + '| ETH/BTC | 2 | 15.00 | 30.00 | ' + '0.60000000 | 15.00 | 0:20:00 | 2 | 0 |\n' + '| TOTAL | 2 | 15.00 | 30.00 | ' + '0.60000000 | 15.00 | 0:20:00 | 2 | 0 |' ) assert backtesting._generate_text_table(data={'ETH/BTC': {}}, results=results) == result_str @@ -398,6 +399,7 @@ def test_generate_text_table_strategyn(default_conf, mocker): Test Backtesting.generate_text_table_sell_reason() method """ patch_exchange(mocker) + default_conf['max_open_trades'] = 2 backtesting = Backtesting(default_conf) results = {} results['ETH/BTC'] = pd.DataFrame( @@ -425,13 +427,13 @@ def test_generate_text_table_strategyn(default_conf, mocker): result_str = ( '| Strategy | buy count | avg profit % | cum profit % ' - '| total profit BTC | avg duration | profit | loss |\n' + '| tot profit BTC | tot profit % | avg duration | profit | loss |\n' '|:-----------|------------:|---------------:|---------------:' - '|-------------------:|:---------------|---------:|-------:|\n' + '|-----------------:|---------------:|:---------------|---------:|-------:|\n' '| ETH/BTC | 3 | 20.00 | 60.00 ' - '| 1.10000000 | 0:17:00 | 3 | 0 |\n' + '| 1.10000000 | 30.00 | 0:17:00 | 3 | 0 |\n' '| LTC/BTC | 3 | 30.00 | 90.00 ' - '| 1.30000000 | 0:20:00 | 3 | 0 |' + '| 1.30000000 | 45.00 | 0:20:00 | 3 | 0 |' ) print(backtesting._generate_text_table_strategy(all_results=results)) assert backtesting._generate_text_table_strategy(all_results=results) == result_str