Coverage for src / jquantstats / _reports / _data.py: 100%

10 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-26 18:44 +0000

1"""Financial report generation from returns data.""" 

2 

3from __future__ import annotations 

4 

5import dataclasses 

6from typing import TYPE_CHECKING 

7 

8import polars as pl 

9 

10if TYPE_CHECKING: 

11 from ._protocol import DataLike 

12 

13 

14@dataclasses.dataclass(frozen=True) 

15class Reports: 

16 """A class for generating financial reports from Data objects. 

17 

18 This class provides methods for calculating and formatting various financial metrics 

19 into report-ready formats such as DataFrames. 

20 

21 Attributes: 

22 data (DataLike): The financial data object to generate reports from. 

23 

24 """ 

25 

26 data: DataLike 

27 

28 def metrics(self, periods: int | float | None = None) -> pl.DataFrame: 

29 """Calculate various financial metrics and return them as a DataFrame. 

30 

31 Returns: 

32 pl.DataFrame: A DataFrame containing financial metrics as rows and assets as columns. 

33 The first column is 'Metric' containing the name of each metric. 

34 

35 """ 

36 metrics: dict[str, dict[str, float]] = { 

37 "Sharpe Ratio": self.data.stats.sharpe(periods=periods), 

38 "Sortino Ratio": self.data.stats.sortino(periods=periods), 

39 # "Calmar Ratio": self.data.stats.calmar(), 

40 "Max Drawdown": self.data.stats.max_drawdown(), 

41 "Volatility": self.data.stats.volatility(periods=periods), 

42 # "CAGR": self.data.stats.cagr(), 

43 "Value at Risk (5%)": self.data.stats.value_at_risk(alpha=0.05), 

44 "Win/Loss Ratio": self.data.stats.win_loss_ratio(), 

45 # "Mean Daily Return": self.data.returns.mean(), 

46 # "Std Dev": self.data.returns.std().to_dict(), 

47 "Skew": self.data.stats.skew(), 

48 "Kurtosis": self.data.stats.kurtosis(), 

49 } 

50 

51 # convert to Polars DataFrame with metrics as rows, assets as columns 

52 return pl.DataFrame([{"Metric": name, **vals} for name, vals in metrics.items()])