""" Performance metrics. Sharpe ratio, Sortino ratio, max drawdown, win rate. Standard toolbox for evaluating a trading strategy. """ import numpy as np def sharpe(returns: list[float], rf: float = 0.0, periods: int = 365) -> float: if len(returns) < 2: return 0.0 excess = np.mean(returns) - rf std = np.std(returns, ddof=1) return (excess / std) * np.sqrt(periods) if std > 0 else 0.0 def sortino(returns: list[float], rf: float = 0.0, periods: int = 365) -> float: if len(returns) < 2: return 0.0 excess = np.mean(returns) - rf downside = [r for r in returns if r < 0] d_std = np.std(downside, ddof=1) if downside else 0.0 return (excess / d_std) * np.sqrt(periods) if d_std > 0 else 0.0 def max_drawdown(equity: list[float]) -> float: if not equity: return 0.0 peak = equity[0] worst = 0.0 for v in equity: if v > peak: peak = v dd = (peak - v) / peak if peak > 0 else 0.0 worst = max(worst, dd) return worst def win_rate(trades: list[dict]) -> float: if not trades: return 0.0 return sum(1 for t in trades if t.get("pnl", 0) > 0) / len(trades)