Merge pull request #2714 from freqtrade/sell_reason_counts
backtesting - Sell reason counts
This commit is contained in:
		| @@ -137,12 +137,12 @@ A backtesting result will look like that: | |||||||
| | ZEC/BTC  |          22 |          -0.46 |         -10.18 |      -0.00050971 |          -5.09 | 2:22:00        |        7 |     15 | | | ZEC/BTC  |          22 |          -0.46 |         -10.18 |      -0.00050971 |          -5.09 | 2:22:00        |        7 |     15 | | ||||||
| | TOTAL    |         429 |           0.36 |         152.41 |       0.00762792 |          76.20 | 4:12:00        |      186 |    243 | | | TOTAL    |         429 |           0.36 |         152.41 |       0.00762792 |          76.20 | 4:12:00        |      186 |    243 | | ||||||
| ========================================================= SELL REASON STATS ========================================================= | ========================================================= SELL REASON STATS ========================================================= | ||||||
| | Sell Reason        |   Count | | | Sell Reason        |   Count |   Profit |   Loss | | ||||||
| |:-------------------|--------:| | |:-------------------|--------:|---------:|-------:| | ||||||
| | trailing_stop_loss |     205 | | | trailing_stop_loss |     205 |      150 |     55 | | ||||||
| | stop_loss          |     166 | | | stop_loss          |     166 |        0 |    166 | | ||||||
| | sell_signal        |      56 | | | sell_signal        |      56 |       36 |     20 | | ||||||
| | force_sell         |       2 | | | force_sell         |       2 |        0 |      2 | | ||||||
| ====================================================== LEFT OPEN TRADES REPORT ====================================================== | ====================================================== LEFT OPEN TRADES REPORT ====================================================== | ||||||
| | pair     |   buy count |   avg profit % |   cum profit % |   tot profit BTC |   tot profit % | avg duration   |   profit |   loss | | | pair     |   buy count |   avg profit % |   cum profit % |   tot profit BTC |   tot profit % | avg duration   |   profit |   loss | | ||||||
| |:---------|------------:|---------------:|---------------:|-----------------:|---------------:|:---------------|---------:|-------:| | |:---------|------------:|---------------:|---------------:|-----------------:|---------------:|:---------------|---------:|-------:| | ||||||
| @@ -154,6 +154,7 @@ A backtesting result will look like that: | |||||||
| The 1st table contains all trades the bot made, including "left open trades". | The 1st table contains all trades the bot made, including "left open trades". | ||||||
|  |  | ||||||
| The 2nd table contains a recap of sell reasons. | The 2nd table contains a recap of sell reasons. | ||||||
|  | This table can tell you which area needs some additional work (i.e. all `sell_signal` trades are losses, so we should disable the sell-signal or work on improving that). | ||||||
|  |  | ||||||
| The 3rd table contains all trades the bot had to `forcesell` at the end of the backtest period to present a full picture. | The 3rd table contains all trades the bot had to `forcesell` at the end of the backtest period to present a full picture. | ||||||
| This is necessary to simulate realistic behaviour, since the backtest period has to end at some point, while realistically, you could leave the bot running forever. | This is necessary to simulate realistic behaviour, since the backtest period has to end at some point, while realistically, you could leave the bot running forever. | ||||||
|   | |||||||
| @@ -183,9 +183,11 @@ class Backtesting: | |||||||
|         Generate small table outlining Backtest results |         Generate small table outlining Backtest results | ||||||
|         """ |         """ | ||||||
|         tabular_data = [] |         tabular_data = [] | ||||||
|         headers = ['Sell Reason', 'Count'] |         headers = ['Sell Reason', 'Count', 'Profit', 'Loss'] | ||||||
|         for reason, count in results['sell_reason'].value_counts().iteritems(): |         for reason, count in results['sell_reason'].value_counts().iteritems(): | ||||||
|             tabular_data.append([reason.value,  count]) |             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") |         return tabulate(tabular_data, headers=headers, tablefmt="pipe") | ||||||
|  |  | ||||||
|     def _generate_text_table_strategy(self, all_results: dict) -> str: |     def _generate_text_table_strategy(self, all_results: dict) -> str: | ||||||
|   | |||||||
| @@ -394,8 +394,8 @@ def test_generate_text_table_sell_reason(default_conf, mocker): | |||||||
|     results = pd.DataFrame( |     results = pd.DataFrame( | ||||||
|         { |         { | ||||||
|             'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'], |             'pair': ['ETH/BTC', 'ETH/BTC', 'ETH/BTC'], | ||||||
|             'profit_percent': [0.1, 0.2, 0.3], |             'profit_percent': [0.1, 0.2, -0.3], | ||||||
|             'profit_abs': [0.2, 0.4, 0.5], |             'profit_abs': [0.2, 0.4, -0.5], | ||||||
|             'trade_duration': [10, 30, 10], |             'trade_duration': [10, 30, 10], | ||||||
|             'profit': [2, 0, 0], |             'profit': [2, 0, 0], | ||||||
|             'loss': [0, 0, 1], |             'loss': [0, 0, 1], | ||||||
| @@ -404,10 +404,10 @@ def test_generate_text_table_sell_reason(default_conf, mocker): | |||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     result_str = ( |     result_str = ( | ||||||
|         '| Sell Reason   |   Count |\n' |         '| Sell Reason   |   Count |   Profit |   Loss |\n' | ||||||
|         '|:--------------|--------:|\n' |         '|:--------------|--------:|---------:|-------:|\n' | ||||||
|         '| roi           |       2 |\n' |         '| roi           |       2 |        2 |      0 |\n' | ||||||
|         '| stop_loss     |       1 |' |         '| stop_loss     |       1 |        0 |      1 |' | ||||||
|     ) |     ) | ||||||
|     assert backtesting._generate_text_table_sell_reason( |     assert backtesting._generate_text_table_sell_reason( | ||||||
|         data={'ETH/BTC': {}}, results=results) == result_str |         data={'ETH/BTC': {}}, results=results) == result_str | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user