From e94ccece93cd71ece3245974192ec58e3a48e76c Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Thu, 13 Mar 2025 13:51:35 +0100 Subject: [PATCH 1/7] Add relevant metrics to backtest breakdowns --- freqtrade/optimize/optimize_reports/bt_output.py | 12 ++++++------ .../optimize/optimize_reports/optimize_reports.py | 12 ++++++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 36a2b3bbb..5105a958e 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -132,18 +132,18 @@ def text_table_periodic_breakdown( """ headers = [ period.capitalize(), + "Trades", f"Tot Profit {stake_currency}", - "Wins", - "Draws", - "Losses", + "Profit Factor", + "Win Draw Loss Win%", ] output = [ [ d["date"], + d["trades"], fmt_coin(d["profit_abs"], stake_currency, False), - d["wins"], - d["draws"], - d["loses"], + d["profit_factor"], + generate_wins_draws_losses(d["wins"], d["draws"], d["losses"]), ] for d in days_breakdown_stats ] diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index a798eaf7a..e97a9c59d 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -231,8 +231,11 @@ def generate_periodic_breakdown_stats( profit_abs = day["profit_abs"].sum().round(10) wins = sum(day["profit_abs"] > 0) draws = sum(day["profit_abs"] == 0) - loses = sum(day["profit_abs"] < 0) - trades = wins + draws + loses + losses = sum(day["profit_abs"] < 0) + trades = wins + draws + losses + winning_profit = day.loc[day["profit_abs"] > 0, "profit_abs"].sum() + losing_profit = day.loc[day["profit_abs"] < 0, "profit_abs"].sum() + profit_factor = winning_profit / abs(losing_profit) if losing_profit else 0.0 stats.append( { "date": name.strftime("%d/%m/%Y"), @@ -240,8 +243,9 @@ def generate_periodic_breakdown_stats( "profit_abs": profit_abs, "wins": wins, "draws": draws, - "loses": loses, - "winrate": wins / trades if trades else 0.0, + "losses": losses, + "trades" : trades, + 'profit_factor': round(profit_factor, 2), } ) return stats From 969b0570c2a03ffb0417fcd1534f1fb8cac5339a Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Thu, 13 Mar 2025 14:29:10 +0100 Subject: [PATCH 2/7] Add relevant metrics to backtest breakdowns (fix) --- freqtrade/optimize/optimize_reports/optimize_reports.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index e97a9c59d..d55769058 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -244,8 +244,8 @@ def generate_periodic_breakdown_stats( "wins": wins, "draws": draws, "losses": losses, - "trades" : trades, - 'profit_factor': round(profit_factor, 2), + "trades": trades, + "profit_factor": round(profit_factor, 2), } ) return stats From 51a99f2a660c54722c4123981b7e9caadfbdcab3 Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Thu, 13 Mar 2025 14:49:24 +0100 Subject: [PATCH 3/7] Add relevant metrics to backtest breakdowns (fix 2) --- tests/optimize/test_optimize_reports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index 5459f76f5..d0c970b33 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -587,7 +587,7 @@ def test_generate_periodic_breakdown_stats(testdatadir): day = res[0] assert "date" in day assert "draws" in day - assert "loses" in day + assert "losses" in day assert "wins" in day assert "profit_abs" in day From a47ed1dbdb3182385712781ba0226c53f9f798d3 Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Sun, 16 Mar 2025 14:17:40 +0100 Subject: [PATCH 4/7] Add relevant metrics to backtest breakdowns (fix 3) --- freqtrade/optimize/optimize_reports/bt_output.py | 6 +++--- freqtrade/optimize/optimize_reports/optimize_reports.py | 2 +- tests/optimize/test_optimize_reports.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 5105a958e..9bc35f1f9 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -140,10 +140,10 @@ def text_table_periodic_breakdown( output = [ [ d["date"], - d["trades"], + d.get('trades', 'N/A'), fmt_coin(d["profit_abs"], stake_currency, False), - d["profit_factor"], - generate_wins_draws_losses(d["wins"], d["draws"], d["losses"]), + d.get('profit_factor', 'N/A'), + generate_wins_draws_losses(d["wins"], d["draws"], d['loses']), ] for d in days_breakdown_stats ] diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index d55769058..de86d370b 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -243,7 +243,7 @@ def generate_periodic_breakdown_stats( "profit_abs": profit_abs, "wins": wins, "draws": draws, - "losses": losses, + "loses": losses, "trades": trades, "profit_factor": round(profit_factor, 2), } diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index d0c970b33..5459f76f5 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -587,7 +587,7 @@ def test_generate_periodic_breakdown_stats(testdatadir): day = res[0] assert "date" in day assert "draws" in day - assert "losses" in day + assert "loses" in day assert "wins" in day assert "profit_abs" in day From 55301b8d0c1afe4e2710210e8f117c636768f3b5 Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Sun, 16 Mar 2025 14:25:32 +0100 Subject: [PATCH 5/7] Add relevant metrics to backtest breakdowns (fix 4) --- freqtrade/optimize/optimize_reports/bt_output.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 9bc35f1f9..40be6bf92 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -140,10 +140,10 @@ def text_table_periodic_breakdown( output = [ [ d["date"], - d.get('trades', 'N/A'), + d.get("trades", "N/A"), fmt_coin(d["profit_abs"], stake_currency, False), - d.get('profit_factor', 'N/A'), - generate_wins_draws_losses(d["wins"], d["draws"], d['loses']), + d.get("profit_factor", "N/A"), + generate_wins_draws_losses(d["wins"], d["draws"], d["loses"]), ] for d in days_breakdown_stats ] From ddd2e2cc3bf074a324fbd43323da9d8b14a71c1b Mon Sep 17 00:00:00 2001 From: mrpabloyeah Date: Sun, 16 Mar 2025 18:20:38 +0100 Subject: [PATCH 6/7] Add relevant metrics to backtest breakdowns (fix 5) --- freqtrade/optimize/optimize_reports/bt_output.py | 2 +- freqtrade/optimize/optimize_reports/optimize_reports.py | 2 +- tests/optimize/test_optimize_reports.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 40be6bf92..6f5cb1aec 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -143,7 +143,7 @@ def text_table_periodic_breakdown( d.get("trades", "N/A"), fmt_coin(d["profit_abs"], stake_currency, False), d.get("profit_factor", "N/A"), - generate_wins_draws_losses(d["wins"], d["draws"], d["loses"]), + generate_wins_draws_losses(d["wins"], d["draws"], d.get("losses", d.get("loses", 0))), ] for d in days_breakdown_stats ] diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index de86d370b..d55769058 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -243,7 +243,7 @@ def generate_periodic_breakdown_stats( "profit_abs": profit_abs, "wins": wins, "draws": draws, - "loses": losses, + "losses": losses, "trades": trades, "profit_factor": round(profit_factor, 2), } diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index 5459f76f5..d0c970b33 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -587,7 +587,7 @@ def test_generate_periodic_breakdown_stats(testdatadir): day = res[0] assert "date" in day assert "draws" in day - assert "loses" in day + assert "losses" in day assert "wins" in day assert "profit_abs" in day From 7bc6a2279cfd172ba164ea297263af2c6edc650f Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 Mar 2025 07:02:30 +0100 Subject: [PATCH 7/7] chore: only round to 2 for output, not for the saved file --- freqtrade/optimize/optimize_reports/bt_output.py | 2 +- freqtrade/optimize/optimize_reports/optimize_reports.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/optimize/optimize_reports/bt_output.py b/freqtrade/optimize/optimize_reports/bt_output.py index 6f5cb1aec..7dea7224b 100644 --- a/freqtrade/optimize/optimize_reports/bt_output.py +++ b/freqtrade/optimize/optimize_reports/bt_output.py @@ -142,7 +142,7 @@ def text_table_periodic_breakdown( d["date"], d.get("trades", "N/A"), fmt_coin(d["profit_abs"], stake_currency, False), - d.get("profit_factor", "N/A"), + round(d["profit_factor"], 2) if "profit_factor" in d else "N/A", generate_wins_draws_losses(d["wins"], d["draws"], d.get("losses", d.get("loses", 0))), ] for d in days_breakdown_stats diff --git a/freqtrade/optimize/optimize_reports/optimize_reports.py b/freqtrade/optimize/optimize_reports/optimize_reports.py index d55769058..ff223c376 100644 --- a/freqtrade/optimize/optimize_reports/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports/optimize_reports.py @@ -245,7 +245,7 @@ def generate_periodic_breakdown_stats( "draws": draws, "losses": losses, "trades": trades, - "profit_factor": round(profit_factor, 2), + "profit_factor": round(profit_factor, 8), } ) return stats