Skip to content

MetricsEngine

High-level facade for computing and accessing trade metrics. MetricsEngine is the primary entry point for consumers who want metrics without interacting with the calculator or series layers directly.

Call .compute() once, then access results through .metrics_df, .plots, or the convenience properties (estimated_risk, sharpe_overall, sortino_overall, win_rate_pct, max_drawdown, calendar_returns).

Metrics Engine - Façade for computing and accessing metrics.

Classes

MetricsEngine dataclass

MetricsEngine(iso_name: str, df_iso: DataFrame, _calculator: MetricsCalculator | None = None, result: MetricsResult | None = None)

High-level façade for computing metrics from ISO trade data.

This class provides a simple interface for users and tests to compute and access metrics without dealing with the underlying calculator details.

Usage: engine = MetricsEngine(iso_name="MISO", df_iso=trade_df) engine.compute()

# Access results
metrics_df = engine.metrics_df
risk = engine.estimated_risk

Attributes

metrics_df property
metrics_df: DataFrame

Get metrics as a DataFrame.

Returns: DataFrame with 'metric' and 'value' columns

plots property
plots: MetricsPlots

Get the MetricsPlots instance for visualization.

Returns: MetricsPlots configured with the canonical series

estimated_risk property
estimated_risk: float

Get the estimated risk value.

sharpe_overall property
sharpe_overall: float

Get the overall Sharpe ratio.

sortino_overall property
sortino_overall: float

Get the overall Sortino ratio.

win_rate_pct property
win_rate_pct: float

Get the win rate percentage.

max_drawdown property
max_drawdown: float

Get the maximum drawdown.

calendar_returns property
calendar_returns: dict[int, float]

Get the calendar returns by year.

Functions

compute
compute() -> MetricsResult

Compute all metrics.

Returns: MetricsResult containing all computed metrics

Source code in src/progridpy/metrics/engine.py
def compute(self) -> MetricsResult:
    """
    Compute all metrics.

    Returns:
        MetricsResult containing all computed metrics
    """
    if self.result is not None:
        return self.result
    self._calculator = MetricsCalculator.from_iso_frame(self.df_iso, self.iso_name)
    self.result = self._calculator.calculate_all()
    return self.result