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

1"""Risk management module for portfolio optimization.""" 

2 

3from __future__ import annotations 

4 

5 

6def calculate_kelly_fraction(win_rate: float, win_loss_ratio: float) -> float: 

7 """ 

8 Calculate Kelly Criterion fraction. 

9  

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 

16 

17 kelly = win_rate - (1.0 - win_rate) / win_loss_ratio 

18 return max(0.0, kelly) 

19 

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 

30 

31 # Simple Volatility Targeting: Size = (Target Vol / Current Vol) * Equity 

32 size = (target_volatility / volatility) * equity 

33 return size 

34 

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 [] 

41 

42 inv_vols = [1.0 / v if v > 0 else 0 for v in volatilities] 

43 total_inv_vol = sum(inv_vols) 

44 

45 if total_inv_vol == 0: 

46 return [1.0 / len(volatilities)] * len(volatilities) 

47 

48 return [iv / total_inv_vol for iv in inv_vols]