sf_quant.research.generate_quantile_ports#

sf_quant.research.generate_quantile_ports(signal: DataFrame, num_bins: int = 10, signal_col: str = 'signal') DataFrame#

Generate quantile portfolios from signal data with vol and beta scaling.

This function bins assets into quantiles based on signal values, calculates equal-weighted returns for each quantile, computes long-short spread, and applies volatility and beta scaling transformations.

Parameters#

signalpl.DataFrame

Signal data containing at least:

  • date (date): The observation date.

  • signal (float): The signal value used for quantile binning.

  • return (float): Forward returns for each asset.

num_binsint, optional

Number of quantile bins to create (default: 10). Assets are sorted into equal-sized bins based on signal values within each date.

Returns#

pl.DataFrame

A DataFrame with quantile portfolio returns (vol and beta scaled):

  • date (date): The observation date.

  • p_1, p_2, …, p_{num_bins} (float): Equal-weighted returns for each quantile portfolio, vol-scaled and beta-scaled.

  • spread (float): Long-short spread (highest - lowest quantile), vol-scaled and beta-scaled.

  • bmk_return (float): Benchmark market returns.

Notes#

  • Quantiles are computed within each date using qcut.

  • Benchmark returns are joined from load_benchmark_returns.

  • Volatility scaling uses a 22-day rolling window with 5% target vol.

  • Beta scaling uses a 60-day rolling window with target beta of 1.0.

Examples#

>>> import polars as pl
>>> import sf_quant.research as sfr
>>> import datetime as dt
>>> signal_df = pl.DataFrame({
...     'date': [dt.date(2024, 1, 2)] * 100,
...     'signal': list(range(100)),
...     'return': [0.01] * 100
... })
>>> quantile_ports = sfr.generate_quantile_ports(signal_df, num_bins=5)
>>> quantile_ports.head()
shape: (5, 8)
┌────────────┬────────┬────────┬────────┬────────┬────────┬────────┬──────────────┐
│ date       ┆ p_1    ┆ p_2    ┆ p_3    ┆ p_4    ┆ p_5    ┆ spread ┆ bmk_return   │
│ ---        ┆ ---    ┆ ---    ┆ ---    ┆ ---    ┆ ---    ┆ ---    ┆ ---          │
│ date       ┆ f64    ┆ f64    ┆ f64    ┆ f64    ┆ f64    ┆ f64    ┆ f64          │
╞════════════╪════════╪════════╪════════╪════════╪════════╪════════╪══════════════╡
│ 2024-01-02 ┆ 0.01   ┆ 0.01   ┆ 0.01   ┆ 0.01   ┆ 0.01   ┆ 0.0    ┆ 0.005        │
│ 2024-01-02 ┆ 0.0095 ┆ 0.0105 ┆ 0.0102 ┆ 0.0098 ┆ 0.0103 ┆ 0.0008 ┆ 0.005        │
│ 2024-01-02 ┆ 0.0092 ┆ 0.0108 ┆ 0.01   ┆ 0.0099 ┆ 0.0107 ┆ 0.0015 ┆ 0.005        │
│ 2024-01-02 ┆ 0.0088 ┆ 0.0112 ┆ 0.0098 ┆ 0.0101 ┆ 0.0112 ┆ 0.0024 ┆ 0.005        │
│ 2024-01-02 ┆ 0.0085 ┆ 0.0115 ┆ 0.0096 ┆ 0.0102 ┆ 0.0118 ┆ 0.0033 ┆ 0.005        │
└────────────┴────────┴────────┴────────┴────────┴────────┴────────┴──────────────┘