Coverage for src / qsmile / data / meta.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-04 21:47 +0000

1"""Smile metadata for coordinate transforms.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass 

6 

7 

8@dataclass(frozen=True) 

9class SmileMetadata: 

10 """Parameters needed by coordinate transforms. 

11 

12 Parameters 

13 ---------- 

14 forward : float 

15 Forward price. Must be positive. 

16 discount_factor : float 

17 Discount factor. Must be positive. 

18 expiry : float 

19 Time to expiry in years. Must be positive. 

20 sigma_atm : float | None 

21 ATM implied volatility. Must be positive when provided. 

22 Required for StandardisedStrike transforms. 

23 """ 

24 

25 forward: float 

26 discount_factor: float 

27 expiry: float 

28 sigma_atm: float | None = None 

29 

30 def __post_init__(self) -> None: 

31 """Validate inputs.""" 

32 if self.forward <= 0: 

33 msg = f"forward must be positive, got {self.forward}" 

34 raise ValueError(msg) 

35 if self.discount_factor <= 0: 

36 msg = f"discount_factor must be positive, got {self.discount_factor}" 

37 raise ValueError(msg) 

38 if self.expiry <= 0: 

39 msg = f"expiry must be positive, got {self.expiry}" 

40 raise ValueError(msg) 

41 if self.sigma_atm is not None and self.sigma_atm <= 0: 

42 msg = f"sigma_atm must be positive, got {self.sigma_atm}" 

43 raise ValueError(msg)