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
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-05 07:23 +0000
1import dataclasses
3import polars as pl
6@dataclasses.dataclass(frozen=True)
7class Reports:
8 """A class for generating financial reports from Data objects.
10 This class provides methods for calculating and formatting various financial metrics
11 into report-ready formats such as DataFrames.
13 Attributes:
14 data (Data): The financial data object to generate reports from.
16 """
18 data: "Data" # type: ignore
20 def metrics(self, periods=None) -> pl.DataFrame:
21 """Calculate various financial metrics and return them as a DataFrame.
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.
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 }
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()])