> ## Documentation Index
> Fetch the complete documentation index at: https://systematica.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Arbitrage Index

> systematica.api.models.arbitrage_index

## Overview

Statistical arbitrage models in Systematica are designed to identify and exploit temporary price divergences between related financial instruments.
The framework provides several model categories, each implementing different statistical approaches to identify trading opportunities.

## Copula-Based Arbitrage Models

Copula-based models use dependency structures between asset pairs to identify arbitrage opportunities.
The `ArbitrageClipIndex` model implements various copula methods to model joint distributions and generate trading signals.

## `ArbitrageClipIndex`

```python theme={null}
ArbitrageClipIndex(
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
    lower: float = -1.0,
    upper: float = 1.0,
    center: float = 0.5,
    bound_reversion: bool = False,
    sequential: bool = False,
)
```

Arbitrage clip index: Marginal probability model.

This model computes the accumulated sum of log returns and applies a clipping
transformation to the accumulated index. It is useful for analyzing the
performance of two assets over time, particularly in the context of arbitrage
opportunities. The clipping transformation ensures that the accumulated index
remains within specified bounds, preventing extreme values that could skew the
analysis.

Method generated by attrs for class ArbitrageClipIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `is_valid`

```python theme={null}
is_valid(
    model_params: Dict[str, Any],
    signal_params: Dict[str, Any],
)
```

Validate model parameters.

**Parameters**:

| Name            | Type        | Default | Description        |
| --------------- | ----------- | ------- | ------------------ |
| `model_params`  | `tp.Kwargs` | `--`    | Model parameters.  |
| `signal_params` | `tp.Kwargs` | `--`    | Signal parameters. |

**Raises**:

| Type         | Description                                                               |
| ------------ | ------------------------------------------------------------------------- |
| `ValueError` | If `long_entries` or `short_entries` are not within the specified bounds. |

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

Apply clipping transformation to model output.

**Parameters**:

| Name           | Type         | Default | Description                                                                                                                |
| -------------- | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| `model_output` | `tp.Array2d` | `--`    | Model output array. \*args : tp.Args Additional positional arguments. \*\*kwargs : tp.Kwargs Additional keyword arguments. |

**Returns**:

| Type         | Description           |
| ------------ | --------------------- |
| `tp.Array2d` | Clipped model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `bound_reversion: bool`: if `bound_reversion` is set to `True`, it compute the cumulative sum of negative (positive) values toward the center, ignoring mask, uppon reaching the upper or lower bound respectively.  This technique increases the speed of reversion toward neutrality. Defaults to `False`.

* `center: float`: The center value to subtract from each prediction. Default is `0.5`.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If `None`, the model defaults to `Archimedeans`. Default is `None`.

* `lower: float`: The lower bound for resetting the accumulated sum. Default is `-1.0`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `sequential: bool`: Transformation is applied at every split if `True`. Otherwise, perform  the transformation after computation. It Defaults to `False`.

* `splitter: str`: The type of data splitter. Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to "from\_custom\_rolling".

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper: float`: The upper bound for resetting the accumulated sum. Default is `1.0`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

## `ArbitrageCumulativeIndex`

```python theme={null}
ArbitrageCumulativeIndex(
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
    center: float = 0.5,
    sequential: bool = False,
)
```

Arbitrage cumulative index: Marginal probability model.

This model computes the cumulative sum of log returns and applies a transformation
to the cumulative index. It is useful for analyzing the cumulative performance of
two assets over time, particularly in the context of arbitrage opportunities.

Method generated by attrs for class ArbitrageCumulativeIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

Apply cumulative index transformation to model output.

**Parameters**:

| Name           | Type         | Default | Description                                                                                                                |
| -------------- | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| `model_output` | `tp.Array2d` | `--`    | Model output array. \*args : tp.Args Additional positional arguments. \*\*kwargs : tp.Kwargs Additional keyword arguments. |

**Returns**:

| Type         | Description               |
| ------------ | ------------------------- |
| `tp.Array2d` | Transformed model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `center: float`: The center value to subtract from each prediction. Default is `0.5`.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If `None`, the model defaults to `Archimedeans`. Default is `None`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `sequential: bool`: Transformation is applied at every split if `True`. Otherwise, perform  the transformation after computation. It Defaults to `False`.

* `splitter: str`: The type of data splitter.  Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to `from_custom_rolling`.

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

## `ArbitrageBaseIndex`

```python theme={null}
ArbitrageBaseIndex(
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
)
```

Arbitrage basis index: Marginal probability model.

This model computes the cumulative log returns of two assets and applies a
transformation to the cumulative index. It is useful for analyzing the
performance of two assets over time, particularly in the context of arbitrage
opportunities. The transformation ensures that the cumulative index reflects
the relative performance of the two assets, allowing for a more nuanced analysis
of their relationship.

Method generated by attrs for class ArbitrageBaseIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

Apply base index transformation to model output.

**Parameters**:

| Name           | Type         | Default | Description                                                                                                                |
| -------------- | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| `model_output` | `tp.Array2d` | `--`    | Model output array. \*args : tp.Args Additional positional arguments. \*\*kwargs : tp.Kwargs Additional keyword arguments. |

**Returns**:

| Type         | Description               |
| ------------ | ------------------------- |
| `tp.Array2d` | Transformed model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If None, the model defaults to `Archimedeans`. Default is `None`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `splitter: str`: The type of data splitter. Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to `from_custom_rolling`.

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

## `ArbitrageResetIndex`

```python theme={null}
ArbitrageResetIndex(
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
    lower: float = -1.0,
    upper: float = 1.0,
    center: float = 0.5,
    sequential: bool = False,
)
```

Arbitrage reset index: Marginal probability model.

This model computes the accumulated sum of log returns and applies a reset
transformation to the accumulated index. It is useful for analyzing the
performance of two assets over time, particularly in the context of arbitrage
opportunities. The reset transformation ensures that the accumulated index
remains within specified bounds, preventing extreme values that could skew the
analysis. The transformation resets the accumulated sum if it exceeds the
specified upper or lower bounds, allowing for a more stable analysis of the
relationship between the two assets.

Method generated by attrs for class ArbitrageResetIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `is_valid`

```python theme={null}
is_valid(
    model_params: Dict[str, Any],
    signal_params: Dict[str, Any],
)
```

Validate model parameters.

**Parameters**:

| Name            | Type        | Default | Description        |
| --------------- | ----------- | ------- | ------------------ |
| `model_params`  | `tp.Kwargs` | `--`    | Model parameters.  |
| `signal_params` | `tp.Kwargs` | `--`    | Signal parameters. |

**Raises**:

| Type         | Description                                                               |
| ------------ | ------------------------------------------------------------------------- |
| `ValueError` | If `long_entries` or `short_entries` are not within the specified bounds. |

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

Apply reset index transformation to model output.
**Parameters**:

| Name           | Type         | Default | Description                                                                                                                |
| -------------- | ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| `model_output` | `tp.Array2d` | `--`    | Model output array. \*args : tp.Args Additional positional arguments. \*\*kwargs : tp.Kwargs Additional keyword arguments. |

**Returns**:

| Type         | Description               |
| ------------ | ------------------------- |
| `tp.Array2d` | Transformed model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `center: float`: The center value to subtract from each prediction. Default is `0.5`.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If None, the model defaults to `Archimedeans`. Default is `None`.

* `lower: float`: The lower bound for resetting the accumulated sum. Default is `-1.0`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `sequential: bool`: Transformation is applied at every split if `True`. Otherwise, perform  the transformation after computation. It Defaults to `False`.

* `splitter: str`: The type of data splitter. Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to `from_custom_rolling`.

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper: float`: The upper bound for resetting the accumulated sum. Default is `1.0`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

## `ArbitrageRollingZscoreIndex`

```python theme={null}
ArbitrageRollingZscoreIndex(
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
    window: int = None,
    ddof: int = 1,
    center: float = 0.5,
    sequential: bool = False,
)
```

Arbitrage rolling z-score index: Marginal probability model.

This model computes the rolling z-scores of log returns and applies a
transformation to the z-scores. It is useful for analyzing the performance of
two assets over time, particularly in the context of arbitrage opportunities. The
rolling z-scores transformation ensures that the index reflects the relative
performance of the two assets, allowing for a more nuanced analysis of their
relationship. The z-scores are computed over a specified rolling window, which
allows for a dynamic analysis of the relationship between the two assets.

Method generated by attrs for class ArbitrageRollingZscoreIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    window: int,
    ddof: int,
    center: float,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

Apply rolling z-score index transformation to model output.

**Parameters**:

| Name           | Type         | Default | Description                                                  |
| -------------- | ------------ | ------- | ------------------------------------------------------------ |
| `model_output` | `tp.Array2d` | `--`    | Model output array.                                          |
| `window`       | `int`        | `--`    | Rolling window size.                                         |
| `ddof`         | `int`        | `--`    | Delta degrees of freedom for standard deviation calculation. |
| `center`       | `float`      | `--`    | Center value to subtract from each prediction.               |

**Returns**:

| Type         | Description               |
| ------------ | ------------------------- |
| `tp.Array2d` | Transformed model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `center: float`: The center value to subtract from each prediction. Default is `0.`5.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `ddof: int`: Delta degrees of freedom for standard deviation calculation. Default is `1`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If None, the model defaults to `Archimedeans`. Default is `None`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `sequential: bool`: Transformation is applied at every split if `True`. Otherwise, perform  the transformation after computation. It Defaults to `False`.

* `splitter: str`: The type of data splitter. Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to `from_custom_rolling`.

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `window: int`: The rolling window size. It should be lower than testing\_window. If `None`, it automatically fits to half of the testing window. Default is `None`.

## `ArbitrageProbabilityIndex`

```python theme={null}
ArbitrageProbabilityIndex(
    preprocess_func: Callable = CPUDispatcher(<function get_returns_nb>),
    training_window: int = 365,
    testing_window: int = 60,
    splitter: str = 'from_custom_rolling',
    custom_splitter: str | None = None,
    custom_splitter_kwargs: Dict[str, Any] = None,
    marginal_dependence: bool = False,
    copula: str | type = 'auto',
    rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation = BaseCopulaRotation.R0,
    cross_tail_method: str = None,
    lower_triangle: float = 0.5,
    upper_triangle: float = 0.5,
    alpha: float = 0.9,
    truncate: float = 0.5,
    list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None = None,
    model_validation_method: str = 'aic',
)
```

Arbitrage marginal index: Marginal probability model.

Compute arbitrage index cross validation using marginals.

No transformation is performed.

Method generated by attrs for class ArbitrageProbabilityIndex.

### Ancestors

* `systematica.models.base.BaseStatArb`
* `abc.ABC`
* `systematica.api.models.arbitrage_index.ArbitrageIndexMixin`

### Static methods

#### `transform_func`

```python theme={null}
transform_func(
    model_output: numpy.ndarray,
    *args,
    **kwargs,
) ‑> numpy.ndarray
```

No transformation is applied to model output.

**Parameters**:

| Name           | Type         | Default | Description                                                              |
| -------------- | ------------ | ------- | ------------------------------------------------------------------------ |
| `model_output` | `tp.Array2d` | `--`    | Model output array. \*\*kwargs : tp.Kwargs Additional keyword arguments. |

**Returns**:

| Type         | Description   |
| ------------ | ------------- |
| `tp.Array2d` | Model output. |

### Instance variables

* `transform_params: Dict[str, Any]`: Returns the transformation parameters.

* `alpha: float`: Lower quantile is found with `lower_quantile = np.quantile(pdfs, 1.0 - alpha)`, then removed from matrix. Used when `cross_tail_method='quantile'`. Defaults to `0.9`.

* `copula: str | type`: The copula model to use. Default is `auto`, which selects the best copula model based on `method` criterion.

* `cross_tail_method: str`: Mask method used to filter cross-tail concentration in the marginals. Specifies the type of mask applied to the marginal distributions.  Available options are `quantile` (applies a quantile-based tail mask) and `triangle` (applies a triangular mask).  If None, the mask is ignored. Defaults to `None`.

* `custom_splitter: str | None`: Custom splitter to use for data partitioning. Default is `None`.

* `custom_splitter_kwargs: Dict[str, Any]`: Additional keyword arguments for the custom splitter. Default is `None`.

* `list_copulas: list[systematica.models.arbitrage_index.base.BaseCopula] | None`: A list of copulas to consider. If `None`, the model defaults to `Archimedeans`. Default is `None`.

* `lower_triangle: float`: Lower triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.

* `marginal_dependence: bool`: If `True`, it calculates correlation coefficient on marginals. Otherwise, on `rets` features. Defaults to `False`.

* `model_validation_method: str`: The method used for model selection. Default is `aic`. Choices are `aic`, `bic` and `aicc`.

* `preprocess_func: Callable`: Preprocess data before calling the model. Should take `prices` as input. Defaults to `get_returns_nb`.

* `rotation: str | systematica.models.arbitrage_index.utils.BaseCopulaRotation`: Rotations allow the copula to be adapted for different types of tail dependence.   - A `180` rotation captures extreme co-movements in the lower tail (i.e. simultaneous extreme losses). - A `90` rotation captures scenarios where one variable exhibits extreme losses while the other shows extreme gains. - A `270` rotation captures the opposite scenario, where one variable experiences extreme gains while the other suffers extreme losses.  See `BaseCopulaRotation`. If set to `auto`, applies best fitted rotation. Defaults to `BaseCopulaRotation.R0`.

* `splitter: str`: The type of data splitter. Choices are `from_rolling`, `from_custom_rolling`, `from_expanding`, `from_custom_expanding`. Defaults to "from\_custom\_rolling".

* `testing_window: int`: The size of the testing window. Default is `60`.

* `training_window: int`: The size of the training window. Default is `365`.

* `truncate: float`: Truncate cross tail filter at specific point. Used when `cross_tail_method='quantile'`. Ignored if `None`. Defaults to `0.5`.

* `upper_triangle: float`: Upper triangle coordinate point. Used when `cross_tail_method='triangle'`. Defaults to `0.5`.
