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
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-04 21:47 +0000
1"""Smile metadata for coordinate transforms."""
3from __future__ import annotations
5from dataclasses import dataclass
8@dataclass(frozen=True)
9class SmileMetadata:
10 """Parameters needed by coordinate transforms.
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 """
25 forward: float
26 discount_factor: float
27 expiry: float
28 sigma_atm: float | None = None
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)