b6539802e0
- mv src/multi_swarm → src/multi_swarm_core/multi_swarm_core (member layout) - sed-replace globale degli import: from/import multi_swarm.* → multi_swarm_core.* - 115 occorrenze aggiornate in src/ scripts/ tests/ - multi_swarm_coevolutive (nome repo) preservato dal word boundary Pre-condizione per il setup uv workspace della Fase 3. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
import numpy as np
|
|
import pandas as pd
|
|
import pytest
|
|
|
|
from multi_swarm_core.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)
|