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

8 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2025-07-05 07:23 +0000

1import dataclasses 

2 

3import polars as pl 

4 

5 

6@dataclasses.dataclass(frozen=True) 

7class Reports: 

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

9 

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

11 into report-ready formats such as DataFrames. 

12 

13 Attributes: 

14 data (Data): The financial data object to generate reports from. 

15 

16 """ 

17 

18 data: "Data" # type: ignore 

19 

20 def metrics(self, periods=None) -> pl.DataFrame: 

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

22 

23 Returns: 

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

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

26 

27 """ 

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

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

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

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

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

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

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

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

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

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

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

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

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

41 } 

42 

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

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