<a id="skfolio-model-selection-covarianceforecastcomparison"></a>

# skfolio.model_selection.CovarianceForecastComparison

<a id="skfolio.model_selection.CovarianceForecastComparison"></a>

### *class* skfolio.model_selection.CovarianceForecastComparison(evaluations, names=None)

Side-by-side comparison of covariance forecast evaluations.

Aggregates multiple [`CovarianceForecastEvaluation`](https://skfolio.org/generated/skfolio.model_selection.CovarianceForecastEvaluation.html.md#skfolio.model_selection.CovarianceForecastEvaluation) instances and provides
combined summary tables and overlay plots for comparing estimator performance.

* **Parameters:**
  **evaluations** *list of CovarianceForecastEvaluation*
  : Evaluation results to compare.

  **names** *list of str, optional*
  : Override display names. When provided, must have the same length as
    `evaluations`. When `None`, defaults to each evaluation’s
    `name` (falling back to
    `"Estimator 0"`, `"Estimator 1"`, etc. when the name is unset).
* **Attributes:**
  **names**

### Methods

| [`bias_statistic_summary`](#skfolio.model_selection.CovarianceForecastComparison.bias_statistic_summary)()                         | Cross-portfolio bias statistic distribution for all estimators.   |
|---------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|
| [`exceedance_summary`](#skfolio.model_selection.CovarianceForecastComparison.exceedance_summary)([confidence_levels])          | Exceedance rate summary for all estimators.                       |
| [`plot_calibration`](#skfolio.model_selection.CovarianceForecastComparison.plot_calibration)([diagnostics, window, title])   | Rolling calibration diagnostics comparison.                       |
| [`plot_exceedance`](#skfolio.model_selection.CovarianceForecastComparison.plot_exceedance)([confidence_level, window, ...]) | Rolling exceedance rate comparison at a fixed confidence level.   |
| [`plot_qlike_loss`](#skfolio.model_selection.CovarianceForecastComparison.plot_qlike_loss)([window, title])                 | Rolling portfolio QLIKE loss comparison.                          |
| [`summary`](#skfolio.model_selection.CovarianceForecastComparison.summary)()                                        | Consolidated summary statistics for all estimators.               |

### Examples

```pycon
>>> from skfolio.datasets import load_sp500_dataset
>>> from skfolio.model_selection import (
...     CovarianceForecastComparison,
...     online_covariance_forecast_evaluation,
... )
>>> from skfolio.moments import EWCovariance
>>> from skfolio.preprocessing import prices_to_returns
>>>
>>> prices = load_sp500_dataset()
>>> X = prices_to_returns(prices).tail(504)
>>> evaluation_30 = online_covariance_forecast_evaluation(
...     EWCovariance(half_life=30), X, warmup_size=252,
... )
>>> evaluation_60 = online_covariance_forecast_evaluation(
...     EWCovariance(half_life=60), X, warmup_size=252,
... )
>>> comparison = CovarianceForecastComparison(
...     [evaluation_30, evaluation_60],
...     names=["EWCov(30)", "EWCov(60)"],
... )
>>> comparison.summary()
estimator                      EWCov(30)  ...        EWCov(60)
                                    mean  ...           target
Mahalanobis ratio               1.405...  ...              1.0
Diagonal ratio                  1.090...  ...              1.0
Portfolio standardized returns  0.010...  ...    mean=0, std=1
Portfolio QLIKE                -7.923...  ...  lower is better

[4 rows x 14 columns]
>>> comparison.plot_calibration()
Figure(...)
```

<a id="skfolio.model_selection.CovarianceForecastComparison.bias_statistic_summary"></a>

#### bias_statistic_summary()

Cross-portfolio bias statistic distribution for all estimators.

Returns a DataFrame indexed by estimator name with percentile
columns and portfolio count.

* **Returns:**
  **summary** *DataFrame*

<a id="skfolio.model_selection.CovarianceForecastComparison.exceedance_summary"></a>

#### exceedance_summary(confidence_levels=(0.95, 0.99))

Exceedance rate summary for all estimators.

Returns a DataFrame with confidence levels as rows and a column-level
MultiIndex `(estimator, stat)` where stat is `observed_rate` or
`deviation`.

* **Parameters:**
  **confidence_levels** *tuple of float, default=(0.95, 0.99)*
  : Confidence levels used to define the upper chi-squared thresholds.
* **Returns:**
  **summary** *DataFrame*

<a id="skfolio.model_selection.CovarianceForecastComparison.plot_calibration"></a>

#### plot_calibration(diagnostics=('mahalanobis', 'diagonal', 'bias'), window=50, title=None)

Rolling calibration diagnostics comparison.

Overlays calibration diagnostics from all estimators on one figure.
Each `(estimator, diagnostic)` pair gets a distinct auto-assigned
color.

* **Parameters:**
  **diagnostics** *tuple of str, default=(“mahalanobis”, “diagonal”, “bias”)*
  : Which diagnostics to include. Valid values are `"mahalanobis"`,
    `"diagonal"`, and `"bias"`.

  **window** *int, default=50*
  : Rolling window length.

  **title** *str, optional*
  : Custom figure title.
* **Returns:**
  **fig** *go.Figure*

<a id="skfolio.model_selection.CovarianceForecastComparison.plot_exceedance"></a>

#### plot_exceedance(confidence_level=0.95, window=50, title=None)

Rolling exceedance rate comparison at a fixed confidence level.

Overlays exceedance rates from all estimators at a single
confidence level on one figure.

* **Parameters:**
  **confidence_level** *float, default=0.95*
  : Confidence level used to define the upper chi-squared threshold.

  **window** *int, default=50*
  : Rolling window length.

  **title** *str, optional*
  : Custom figure title.
* **Returns:**
  **fig** *go.Figure*

<a id="skfolio.model_selection.CovarianceForecastComparison.plot_qlike_loss"></a>

#### plot_qlike_loss(window=50, title=None)

Rolling portfolio QLIKE loss comparison.

Overlays QLIKE loss from all estimators on one figure. For
evaluations with multiple portfolios, the median across portfolios
is shown with a P5-P95 band.

* **Parameters:**
  **window** *int, default=50*
  : Rolling window length.

  **title** *str, optional*
  : Custom figure title.
* **Returns:**
  **fig** *go.Figure*

<a id="skfolio.model_selection.CovarianceForecastComparison.summary"></a>

#### summary()

Consolidated summary statistics for all estimators.

Returns a DataFrame with metrics as rows and a column-level
MultiIndex `(estimator, stat)` where stat is one of `mean`,
`median`, `std`, `p5`, `p95`, `mad_from_target`, `target`.

* **Returns:**
  **summary** *DataFrame*

