# Quota share

> The simplest contract structure (a fixed cession percentage applied to every covered loss) and its event-limit and annual-limit variants.

Source: https://reinsurance.dev/financial-modelling/contracts/quota-share/

## The composition

A **[quota share](https://reinsurance.dev/glossary/#quota-share)** is the simplest contract structure: a fixed [cession percentage](https://reinsurance.dev/glossary/#cession-percentage) $q$ applied to every covered loss. As a composition, it is a [scaling](https://reinsurance.dev/financial-modelling/terms/scaling/) applied after a [filter](https://reinsurance.dev/financial-modelling/terms/filter/) and a [contract period](https://reinsurance.dev/financial-modelling/terms/contract-period/):

$$
\text{QS}(q) = \text{scale}(q) \circ \text{period}(t_0, t_1) \circ \text{filter}(P)
$$

The formula follows the reading order of every [composition](https://reinsurance.dev/financial-modelling/composition/#composing-contracts-from-the-blocks). The gross loss is the scaled subject loss:

$$
L_j^{\text{gross}} = q \cdot L_j^{\text{subject}}
$$

The cession $q$ stays inside the composition even though every contract is [defined at 100%](https://reinsurance.dev/financial-modelling/composition/#composing-contracts-from-the-blocks): it is a term of the contract, fixing what the cedent transfers, while [participation](https://reinsurance.dev/glossary/#participation) records how the placement is split among reinsurers and enters at [portfolio roll-up](https://reinsurance.dev/financial-modelling/portfolios/#the-roll-up-participation-then-sum). The same multiplication, two different objects.

Caldera Re Contract 5 is the Baltica European Windstorm Quota Share at $q = 0.25$: Baltica cedes a quarter of its book to the contract as a whole; Caldera Re's own 30% participation in that contract enters only at roll-up. Baltica writes only EU windstorm, so the filter ($\text{peril} = \text{WS}$) selects its whole book and the full-year period passes every event. Both terms are identities here, but they are still part of the composition and would change the result for a multi-peril cedent or a mid-year inception.

[Baltica's Trial 9](https://reinsurance.dev/financial-modelling/contracts/quota-share/#contract-5-on-trial-9) shows the cession on its own: a quarter of every windstorm loss, with nothing filtered out.

## Contract 5 on Trial 9

Baltica's Trial 9 is a windstorm season clustered in October–December (the European winter-storm season, where SunCoast's trials peak in the summer hurricane months), and the quota share cedes a quarter of every loss in it:

*Figure (interactive on the web page): Baltica Trial 9 ceded at 25%: every windstorm loss becomes a quarter of its subject value. Subject \$103.1M → gross \$25.8M.*

| Baltica Trial 9 | Subject | Gross (×0.25) |
| --- | ---: | ---: |
| Nov 19 windstorm (DE/FR/UK), the largest | \$23.7M | \$5.9M |
| Nov 21 windstorm (FR/UK), the second largest | \$15.6M | \$3.9M |
| 9 other windstorms | \$63.8M | \$16.0M |
| **Trial 9 total** (11 occurrences) | **\$103.1M** | **\$25.8M** |

Python (`python/caldera_re/quota_share.py`, runnable on the web page):

```python
import pandas as pd

from caldera_re.data import cedents
from caldera_re.loss_filter import loss_filter
from caldera_re.contract_period import contract_period
from caldera_re.report import table

def quota_share(
    loss: pd.DataFrame,
    cession_percentage: float,
    period_start: str = '2024-01-01',
    period_end: str = '2024-12-31',
    **criteria,
) -> pd.DataFrame:
    """Apply a quota share contract to a YELT.

    Composition: scale(q) . period(t0, t1) . filter(criteria)

    Filters to the covered rows, restricts to the contract period, then
    multiplies every loss by the cession percentage to produce the
    reinsurer's gross loss.

    Parameters
    ----------
    loss : pd.DataFrame
        YELT with a 'loss' column (subject losses).
    cession_percentage : float
        The proportion ceded, e.g. 0.25 for 25%.
    period_start, period_end : str
        Contract period, inclusive. Defaults to full-year 2024.
    **criteria
        Filter column = value pairs, e.g. peril='WS'. Omit for no filter.

    Returns a copy with an added 'gross_loss' column.
    """
    covered = loss_filter(loss, **criteria)
    covered = contract_period(covered, period_start, period_end)
    result = covered.copy()
    result['gross_loss'] = result['loss'] * cession_percentage
    return result

if __name__ == '__main__':
    # Contract 5: Baltica EU Windstorm Quota Share, 25%, full-year 2024.
    result = quota_share(cedents.baltica, cession_percentage=0.25, peril='WS')

    print("Contract 5: Baltica EU Windstorm Quota Share (25%)")

    lines = []
    for tid in sorted(result['trial_id'].unique()):
        rows = result[result['trial_id'] == tid]
        subj = rows['loss'].sum()
        gross = rows['gross_loss'].sum()
        lines.append((tid, subj, gross, subj - gross))
    table(['Trial', 'Subject', 'Gross', 'Retained'], lines,
          fmt=['{:.0f}', '{:.1f}M', '{:.1f}M', '{:.1f}M'])

    total_subject = result['loss'].sum() / 20  # EL across all 20 trials
    total_gross = result['gross_loss'].sum() / 20
    print(f"\nSubject EL: {total_subject:.2f}M")
    print(f"Gross EL:   {total_gross:.2f}M")
    print(f"Ratio:      gross/subject = {total_gross/total_subject:.0%} (exactly q)")
```

The two windstorms named in the table, \$23.7M and \$15.6M, are the pair the [event limit](https://reinsurance.dev/financial-modelling/contracts/quota-share/#with-event-limit) caps.

## Across the demo tier

Across all 20 trials of the [demo tier](https://reinsurance.dev/toolkit/trials/#demo-scale), the gross curve is an exact vertical scaling of the subject curve, and the cedent's retained curve is the remaining 75%. Because the scaling preserves every trial's rank, the three curves add at each return period, an identity the limited variants below lose, as the [perspectives](https://reinsurance.dev/financial-modelling/perspectives/) page explains:

*Figure (interactive on the web page): Contract 5 EP curves: Baltica EU Windstorm Quota Share (25%). The gross curve is exactly 25% of the subject curve at every return period.*

:::tip[Key Insight]
A quota share's value is not analytical complexity but business utility: quota shares are used for capital management,[^qs-capital] for accessing different capital sources,[^qs-sidecar] and for risk sharing within large enterprise groups (an operating subsidiary ceding to its group's captive reinsurer or parent, so that the group's risk pools on one balance sheet).[^qs-group]
:::

A quota share's economics run on the premium side, and the composition on this page transforms losses only. The reinsurer returns a [ceding commission](https://reinsurance.dev/glossary/#ceding-commission) for the cedent's acquisition costs (Contract 5 carries a 30% [sliding scale](https://reinsurance.dev/glossary/#sliding-scale-commission)) and the commission, the [profit commission](https://reinsurance.dev/glossary/#profit-commission), and the sliding-scale provisions that go with them are where a real quota share is negotiated. None of that is covered here; the glossary entries state what each is.

## With event limit

Quota share contracts can cap the reinsurer's exposure per occurrence, and per year as well.[^sec-qs] Both variants insert their cap before the cession scaling, so that $\text{scale}(q)$ stays the last term on every variant of this page:

```mermaid
graph LR
    F["filter(P)"]:::Contract --> T["period(t₀, t₁)"]:::Contract
    T --> E["occ_excess(0, ℓₑ)<br/>event limit · optional"]:::Process
    E --> A["agg_excess(0, ℓₐ)<br/>annual limit · optional"]:::Process
    A --> S["scale(q)<br/>cession · always last"]:::Metric

    classDef Contract fill:#BFDBF8,stroke:#4F84BA,stroke-width:1.5px,color:#2B2620
    classDef Process fill:#F7CBCB,stroke:#B46669,stroke-width:1.5px,color:#2B2620
    classDef Metric fill:#BDE2CB,stroke:#459269,stroke-width:1.5px,color:#2B2620
```

An **[event limit](https://reinsurance.dev/glossary/#event-limit)** is an [occurrence excess](https://reinsurance.dev/financial-modelling/terms/occurrence-excess/) with zero attachment, placed before the cession scaling:

$$
\text{QS}_{\text{event limit}}(q, \ell_e) = \text{scale}(q) \circ \text{occ}_{\text{excess}}(0, \ell_e) \circ \text{period}(t_0, t_1) \circ \text{filter}(P)
$$

The order matters: each occurrence is capped at $\ell_e$, then the capped amount is shared at ratio $q$. Which side of the cession the cap is written on is the convention [stated below](https://reinsurance.dev/financial-modelling/contracts/quota-share/#which-side-the-limit-caps).

With a \$15M event limit, Baltica's Trial 9 has two windstorms above the cap (the \$23.7M November storm and the \$15.6M one just after), both clipped to \$15M before cession:

*Figure (interactive on the web page): QS \$15M event limit on Baltica Trial 9 (subject losses, before the 25% cession). Each windstorm is capped at \$15M; the Nov 19 (\$23.7M) and Nov 21 (\$15.6M) storms are clipped, the rest pass through unchanged.*

The cap acts on the subject occurrence, the cession on the capped amount:

| Baltica Trial 9 | Subject | Capped at \$15M | Gross (×0.25) |
| --- | ---: | ---: | ---: |
| Nov 19 windstorm | \$23.74M | \$15.00M | \$3.75M |
| Nov 21 windstorm | \$15.60M | \$15.00M | \$3.75M |
| 9 other windstorms (all below \$15M) | \$63.81M | \$63.81M | \$15.95M |
| **Trial 9 total** | **\$103.15M** | **\$93.81M** | **\$23.45M** |

Python (`python/caldera_re/quota_share_event_limit.py`, runnable on the web page):

```python
"""Quota share with a per-occurrence event limit, composed from building blocks.

Composition: scale(q) . occ_excess(0, event_limit) . period(t0, t1) . filter(P)

Contract 5 variant: Baltica EU Windstorm, 25% cession, $15M event limit. The
event limit is an occurrence excess with zero attachment — it caps each
windstorm at $15M before the cession percentage is applied (site convention:
the cap sits on the subject occurrence; a treaty's ceded-side limit L is the
subject-side limit L / q).
"""

from caldera_re.data import cedents
from caldera_re.loss_filter import loss_filter
from caldera_re.occurrence_excess import occurrence_excess
from caldera_re.scale import scale
from caldera_re.contract_period import contract_period

if __name__ == '__main__':
    q, EVENT_LIMIT = 0.25, 15.0
    N = 20

    # filter -> contract period
    covered = contract_period(loss_filter(cedents.baltica, peril='WS'),
                            '2024-01-01', '2024-12-31')
    # event limit: cap each occurrence at EVENT_LIMIT (attachment 0)
    capped = occurrence_excess(covered, attachment=0, limit=EVENT_LIMIT)
    # cession: scale the capped occurrence losses by q
    capped = scale(capped, q, input_column='gross_loss', output_column='ceded')

    subject = covered.groupby('trial_id')['loss'].sum()
    ev = capped.groupby('trial_id')['ceded'].sum()

    print(f"QS with event limit: 25% cession, {EVENT_LIMIT:.0f}M event limit (Baltica EU WS)")
    print(f"{'Trial':>8} | {'Subject':>8} | {'Basic QS':>9} | {'With Limit':>10}")
    print("-" * 46)
    for s in range(1, N + 1):
        subj = float(subject.get(s, 0))
        basic = subj * q
        with_limit = float(ev.get(s, 0))
        marker = " *" if abs(basic - with_limit) > 0.01 else ""
        print(f"{s:8d} | {subj:7.1f}M | {basic:8.2f}M | {with_limit:9.2f}M{marker}")

    print("\n* Event limit binds: at least one windstorm exceeds 15M and is "
          "capped before cession.")
```

Across all 20 trials, the gross falls below a plain 25% cession wherever an individual windstorm exceeds the \$15M limit (thirteen of the twenty trials):

*Figure (interactive on the web page): QS with \$15M event limit (Baltica EU WS, 25% cession): subject vs ceded gross. The gross sits below a flat 25% of subject in the trials where a windstorm exceeds the event limit.*

### Which side the limit caps

**This site's convention:** the event limit caps the subject occurrence, the cedent's loss before the cession. The filed wordings cited above cap the other side, after the cession: the reinsurer's liability, which is the ceded amount at 100% of the contract. Same cap, either side of one multiplication. A \$10M limit on the ceded amount is a \$40M limit on the subject occurrence at a 25% cession, and $\ell_e = \ell / q$ turns a contract's figure into this composition's. Participation comes after both and changes nothing: Caldera Re's 30% is 30% of whatever the treaty cedes. The contract's side is the authoritative one: the limit a treaty states is the reinsurer's liability, and that is the figure to carry in the contract's metadata; the composition stores its subject-side equivalent. This site caps the subject side for one reason: the cession then stays the last term on every variant of this page, so the plain, event-limited, and annual-limited forms share one composition and differ only in the terms inserted before $\text{scale}(q)$. Under $\ell_e = \ell / q$ the two describe the same contract, so converting at ingest loses nothing. When you take an event limit from a contract, check which side it is written on and convert.

The same question arises for the [annual limit](https://reinsurance.dev/financial-modelling/contracts/quota-share/#with-annual-limit), which this composition also writes on the subject side.

## With annual limit

Adding an [aggregate excess](https://reinsurance.dev/financial-modelling/terms/aggregate-excess/) on top gives the contract an **[annual limit](https://reinsurance.dev/glossary/#aggregate-limit)**. **This site's convention:** the annual limit caps the same side as the event limit: the subject aggregate, \$80M here, of which \$20M is ceded. Filed wordings cap the ceded amount, and a limit written that way converts as the event limit does, $\ell_a = \ell / q$. It is the second optional term, between the occurrence excess and the cession:

$$
\text{QS}_{\text{capped}}(q, \ell_e, \ell_a) = \text{scale}(q) \circ \text{agg}_{\text{excess}}(0, \ell_a) \circ \text{occ}_{\text{excess}}(0, \ell_e) \circ \text{period}(t_0, t_1) \circ \text{filter}(P)
$$

The aggregate excess stays [YELT in, YELT out](https://reinsurance.dev/toolkit/trials/#the-yelt) (year event loss table in, year event loss table out) by [erosion](https://reinsurance.dev/glossary/#erosion) attribution, the mechanism the [aggregate excess page](https://reinsurance.dev/financial-modelling/terms/aggregate-excess/) works through, so the cession downstream still scales YELT rows: per trial, the same \$20M is ceded either way, and the occurrence detail survives. On Trial 9, the event-limited windstorms accumulate to \$93.8M, and an \$80M annual limit clips the total before cession:

*Figure (interactive on the web page): QS \$80M annual limit on Baltica Trial 9 (after the \$15M event limit, before cession). The capped windstorms accumulate to \$93.8M; the cumulative line is clipped at the \$80M annual limit, so \$80M × 25% = \$20.0M is ceded.*

The erosion audit trail in claims order: the nine windstorms through 4 December accumulate to \$79.97M and are booked in full, the 5 December storm crosses the \$80M limit and books the \$0.03M that remains, and the 15 December storm books nothing.

| Occurrences (claims order, after the event limit) | Capped loss | Running aggregate | Layered at \$80M | Booked | Gross (×0.25) |
| --- | ---: | ---: | ---: | ---: | ---: |
| 9 windstorms, Feb 7 – Dec 4 | \$79.97M | \$79.97M | \$79.97M | \$79.97M | \$19.99M |
| Dec 5, event 10520 | \$2.22M | \$82.19M | \$80.00M | \$0.03M | \$0.01M |
| Dec 15, event 10637 | \$11.62M | \$93.81M | \$80.00M | \$0.00M | \$0.00M |
| **Trial 9 total** | **\$93.81M** | | | **\$80.00M** | **\$20.00M** |

Python (`python/caldera_re/quota_share_annual_limit.py`, runnable on the web page):

```python
"""Quota share with an event limit and an annual aggregate limit.

Composition:
    scale(q) . agg_excess(0, annual_limit) . occ_excess(0, event_limit)
             . period(t0, t1) . filter(P)

Contract 5 variant: Baltica EU Windstorm, 25% cession, $15M event limit, $80M
annual limit. Each occurrence is capped at the event limit; the annual limit
then erodes per occurrence against the running total of those capped losses
(YELT in, YELT out), so the cession downstream still scales YELT rows.
"""

from caldera_re.aggregate_excess import aggregate_excess
from caldera_re.data import cedents
from caldera_re.loss_filter import loss_filter
from caldera_re.occurrence_excess import occurrence_excess
from caldera_re.scale import scale
from caldera_re.contract_period import contract_period

if __name__ == '__main__':
    q, EVENT_LIMIT, ANNUAL_LIMIT = 0.25, 15.0, 80.0
    N = 20

    # filter -> contract period
    covered = contract_period(loss_filter(cedents.baltica, peril='WS'),
                            '2024-01-01', '2024-12-31')
    # event limit (per occurrence), then annual aggregate limit -- the annual
    # limit's gross is erosion-attributed, so `agg` is still per occurrence
    capped = occurrence_excess(covered, attachment=0, limit=EVENT_LIMIT)
    agg = aggregate_excess(capped, attachment=0, limit=ANNUAL_LIMIT,
                           loss_column='gross_loss')
    # cession -- applied to YELT rows, not a trial total
    agg = scale(agg, q, input_column='gross_loss', output_column='ceded')

    subject = covered.groupby('trial_id')['loss'].sum()
    capped_by_trial = capped.groupby('trial_id')['gross_loss'].sum()
    by_trial = agg.groupby('trial_id')[['gross_loss', 'ceded']].sum()

    print(f"QS with event + annual limit: 25% cession, {EVENT_LIMIT:.0f}M event, "
          f"{ANNUAL_LIMIT:.0f}M annual (Baltica EU WS)")
    print(f"{'Trial':>8} | {'Subject':>8} | {'Capped agg':>10} | {'Ceded':>8}")
    print("-" * 44)
    for s in range(1, N + 1):
        subj = float(subject.get(s, 0))
        capped_agg = float(capped_by_trial.get(s, 0))
        after = float(by_trial['gross_loss'].get(s, 0))
        ceded = float(by_trial['ceded'].get(s, 0))
        marker = " *" if after < capped_agg - 0.01 else ""
        print(f"{s:8d} | {subj:7.1f}M | {capped_agg:9.1f}M | {ceded:7.2f}M{marker}")

    print(f"\n* Annual limit binds: the erosion stops crediting occurrences "
          f"once the running")
    print(f"  aggregate reaches {ANNUAL_LIMIT:.0f}M, clipping the trial's "
          "total before cession.")
```

Across all 20 trials, the annual limit flattens the gross at \$20M (= \$80M × 25%) in the heaviest windstorm trials (Trials 5, 9, and 10):

*Figure (interactive on the web page): QS with \$15M event limit + \$80M annual limit (Baltica EU WS, 25% cession): subject vs ceded gross. The annual limit caps the ceded loss at \$20M in the worst trials.*

An event limit is one extra term and an annual limit two: the same terms that build a catastrophe excess of loss ([CatXoL](https://reinsurance.dev/financial-modelling/contracts/catxol/)), with zero attachments and the cession scaling on the end, as the composition diagram above shows. The cession is picked up again at [portfolio roll-up](https://reinsurance.dev/financial-modelling/portfolios/#the-roll-up-participation-then-sum), and the retained side on the [perspectives](https://reinsurance.dev/financial-modelling/perspectives/) page.

[^sec-qs]: Lemonade Insurance Company et al., ["Whole Account Quota Share Reinsurance Contract"](https://www.sec.gov/Archives/edgar/data/1691421/000169142123000095/exhibit104-wholeaccountquo.htm), SEC EDGAR exhibit 10.4, 2023. Places both caps on the reinsurer's side: "the Reinsurer's liability for losses … will not exceed … \$5,000,000 any one Loss Occurrence as respects business covered hereunder, and further, shall not exceed \$60,000,000 as respects all Loss Occurrences for the term of this Contract". Homeowners of America Insurance Company, ["Residential Quota Share Reinsurance Contract"](https://www.sec.gov/Archives/edgar/data/1346922/000134692214000013/ex_10-4.htm), SEC EDGAR exhibit 10.4, 2014, writes the event limit the same way on a property book: "the liability of the Reinsurer hereunder as respects losses arising out of any one loss occurrence … shall not exceed the lesser of (1) \$110,000,000, or (2) 175% of the premiums earned during the contract year".

[^qs-capital]: Reinsurance Association of America, [*Fundamentals of Reinsurance and Glossary of Reinsurance Terms*](https://www.reinsurance.org/Common/Uploaded%20files/Fundamentals/FundamentalsofReinsuranceandGlossaryofReinsuranceTerms.pdf): "by reinsuring a portion of its insurance policies, an insurance company reduces the problem of decreased surplus", and and "when added directly to the ceding company's surplus, the ceding commission further increases its capacity". Swiss Re, [*Proportional and non-proportional reinsurance*](https://newdoc.nccu.edu.tw/teasyllabus/308002308018/Swiss%20Re%20Prop.%26Non-Prop..pdf) (UM3), Christoph Bugmann, 1997, on quota share specifically: "the effect achieved is an improved ratio between the direct insurer's potential or actual loss and its guarantee funds, in short, improved solvency."

[^qs-sidecar]: Steve Evans, ["Reinsurance sidecar market estimated at record \$10bn in 2024: Aon Securities"](https://www.artemis.bm/news/reinsurance-sidecar-market-estimated-at-record-10bn-in-2024-aon-securities/), *Artemis*, September 2024. Sidecars route third-party capital into a reinsurer's book through quota share: "these quota share structures are seen as an aligned way to support a reinsurer, sharing in its underwriting profits and losses", with backers from private investors to "pensions, endowments and family offices".

[^qs-group]: Directive 2009/138/EC (Solvency II), [Article 13(5)](https://eur-lex.europa.eu/eli/dir/2009/138/oj/eng), defines a captive reinsurance undertaking as one "the purpose of which is to provide reinsurance cover exclusively for the risks of the undertaking or undertakings to which it belongs or of an undertaking or undertakings of the group of which it is a member". Donegal Group Inc., [Form 10-K for 2024](https://www.sec.gov/Archives/edgar/data/800457/000114036125007891/ef20038953_10k.htm), *SEC EDGAR*, shows the form in use: Donegal Mutual "has a 100% quota-share reinsurance agreement with Mountain States Indemnity Company".
