From 97badd0d3b7b9763632441e5368acd468ba49235 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 11 Apr 2026 16:01:42 +0200 Subject: [PATCH] test: add tests for sharpe based on balance --- tests/data/test_metrics.py | 43 +++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tests/data/test_metrics.py b/tests/data/test_metrics.py index d19d9e328..38ce57aff 100644 --- a/tests/data/test_metrics.py +++ b/tests/data/test_metrics.py @@ -1,7 +1,8 @@ from datetime import UTC, datetime, timedelta +import numpy as np import pytest -from pandas import DataFrame, DateOffset, Timestamp +from pandas import DataFrame, DateOffset, Timestamp, to_datetime from freqtrade.configuration import TimeRange from freqtrade.data.btanalysis import ( @@ -16,6 +17,7 @@ from freqtrade.data.metrics import ( calculate_market_change, calculate_max_drawdown, calculate_sharpe, + calculate_sharpe_from_balance, calculate_sortino, calculate_sqn, calculate_underwater, @@ -217,6 +219,45 @@ def test_calculate_sharpe(testdatadir): assert pytest.approx(sharpe) == 44.5078669 +def test_calculate_sharpe_from_balance(): + balance_history = DataFrame( + { + "date": to_datetime( + [ + "2025-01-01 00:00:00+00:00", + "2025-01-02 00:00:00+00:00", + "2025-01-03 00:00:00+00:00", + "2025-01-04 00:00:00+00:00", + ], + utc=True, + ), + "total_quote": [100.0, 110.0, 104.5, 125.4], + } + ) + + sharpe = calculate_sharpe_from_balance(balance_history) + expected_returns = np.array([0.1, -0.05, 0.2]) + expected_sharpe = expected_returns.mean() / expected_returns.std() * np.sqrt(365) + + assert isinstance(sharpe, float) + assert pytest.approx(sharpe) == expected_sharpe + + +def test_calculate_sharpe_from_balance_empty_or_flat(): + assert calculate_sharpe_from_balance(DataFrame()) == 0.0 + + flat_balance_history = DataFrame( + { + "date": to_datetime( + ["2025-01-01 00:00:00+00:00", "2025-01-02 00:00:00+00:00"], + utc=True, + ), + "total_quote": [100.0, 100.0], + } + ) + assert calculate_sharpe_from_balance(flat_balance_history) == -100 + + def test_calculate_calmar(testdatadir): filename = testdatadir / "backtest_results/backtest-result.json" bt_data = load_backtest_data(filename)