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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-26 18:44 +0000
1"""Financial report generation from returns data."""
3from __future__ import annotations
5import dataclasses
6from typing import TYPE_CHECKING
8import polars as pl
10if TYPE_CHECKING:
11 from ._protocol import DataLike
14@dataclasses.dataclass(frozen=True)
15class Reports:
16 """A class for generating financial reports from Data objects.
18 This class provides methods for calculating and formatting various financial metrics
19 into report-ready formats such as DataFrames.
21 Attributes:
22 data (DataLike): The financial data object to generate reports from.
24 """
26 data: DataLike
28 def metrics(self, periods: int | float | None = None) -> pl.DataFrame:
29 """Calculate various financial metrics and return them as a DataFrame.
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.
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 }
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()])