Coverage for src / monte_neo / core / portfolio / risk.py: 100%
19 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-28 16:27 +0200
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-28 16:27 +0200
1"""Risk management module for portfolio optimization."""
3from __future__ import annotations
6def calculate_kelly_fraction(win_rate: float, win_loss_ratio: float) -> float:
7 """
8 Calculate Kelly Criterion fraction.
10 Formula: K = W - (1 - W) / R
11 W = Win probability
12 R = Win/Loss ratio (Avg Win / Avg Loss)
13 """
14 if win_loss_ratio <= 0:
15 return 0.0
17 kelly = win_rate - (1.0 - win_rate) / win_loss_ratio
18 return max(0.0, kelly)
20def calculate_volatility_adjusted_size(
21 volatility: float,
22 target_volatility: float = 0.15,
23 equity: float = 10000.0
24) -> float:
25 """
26 Calculate position size based on target volatility (Volatility Targeting).
27 """
28 if volatility <= 0:
29 return 0.0
31 # Simple Volatility Targeting: Size = (Target Vol / Current Vol) * Equity
32 size = (target_volatility / volatility) * equity
33 return size
35def calculate_risk_parity_weights(volatilities: list[float]) -> list[float]:
36 """
37 Calculate weights such that each asset contributes equal risk (inverse of volatility).
38 """
39 if not volatilities:
40 return []
42 inv_vols = [1.0 / v if v > 0 else 0 for v in volatilities]
43 total_inv_vol = sum(inv_vols)
45 if total_inv_vol == 0:
46 return [1.0 / len(volatilities)] * len(volatilities)
48 return [iv / total_inv_vol for iv in inv_vols]