import numpy as np import pandas as pd import pytest from multi_swarm.metrics.basic import max_drawdown, sharpe_ratio, total_return def test_sharpe_zero_returns(): r = pd.Series([0.0] * 100) assert sharpe_ratio(r, periods_per_year=8760) == 0.0 def test_sharpe_positive_returns(): np.random.seed(42) r = pd.Series(np.random.normal(0.001, 0.01, 1000)) s = sharpe_ratio(r, periods_per_year=8760) assert s > 0 def test_sharpe_negative_returns(): np.random.seed(42) r = pd.Series(np.random.normal(-0.001, 0.01, 1000)) s = sharpe_ratio(r, periods_per_year=8760) assert s < 0 def test_max_drawdown_monotonic_up(): eq = pd.Series([100.0, 105.0, 110.0, 115.0, 120.0]) assert max_drawdown(eq) == pytest.approx(0.0) def test_max_drawdown_known_curve(): eq = pd.Series([100.0, 110.0, 90.0, 95.0, 105.0]) # peak 110, trough 90, drawdown = (110-90)/110 ≈ 0.1818 assert max_drawdown(eq) == pytest.approx(20.0 / 110.0) def test_total_return(): eq = pd.Series([100.0, 110.0, 105.0, 120.0]) assert total_return(eq) == pytest.approx(0.20)