Using sliding scale commissions

Sliding scale ceding commissions on an aggregate quota share with the DecL slide clause

reinsurance
variable feature
P&L
Author

Stephen J. Mildenhall

Published

2026-11-01

A sliding scale commission is a ceding commission on a proportional treaty, usually a quota share, that falls as the loss ratio of the treaty rises. The reinsurer pays a high commission in a good year and a low one in a bad year, so the cedant keeps part of the variability of the business it cedes. The scale is a set of anchors, a commission rate \(c_i\) at a ceded loss ratio \(\lambda_i\), with the rate decreasing in the loss ratio. With ceded loss \(A\) and a fixed ceded premium \(P_C\), the ceded loss ratio is \(\lambda = A/P_C\) and the commission is \[ K = c(\lambda)\,P_C, \] where \(c\) interpolates linearly between the anchors and is flat outside them, so the first and last anchors set the maximum and minimum commission.

In DecL the clause slide <c> at <λ> and ... decorates one layer of an aggregate net of program in place of the flat commission cede. The layer needs a deposit, rol, or rate premium to form the loss ratio. The sliding scale is one of the variable features of DecL, with profit commissions, loss corridors, swing rating, and retro rating. A program takes at most one of them. The reinsurance features decorate aggregate covers only, and all take effect in a pnl or xpnl (see Using pnl and xpnl). The commission is booked in the expense column of the cover, E in economic_ratios_df, as a random credit to the cedant.

aggregate net of 50% po inf xs 0 rate 100% cede 0.25 as QS          # flat
aggregate net of 50% po inf xs 0 rate 100% slide 0.35 at 0.6 and 0.25 at 0.7 and 0.15 at 0.8 as QS
aggregate net of 50% po inf xs 0 rate 100% slide 30% at 55% and 20% at 75% as QS

The variable feature pages share one base book: premium 10,000 at a 70% loss ratio, a policy limit of 2,000, lognormal severity with mean 150 and CV 2.5, gamma mixed claim counts with mixing CV 0.25, and expenses of 25% of premium. The setup cell wraps the book in an xpnl with a slot for each reinsurance program.

Code
import numpy as np
import pandas as pd
from aggregate import build, qd, __version__
from style import wprint, GT, refuse, figures, figure
figures()
print(__version__)
book = '''agg Book
  10000 premium at 0.7 lr
  2000 xs 0
  sev lognorm 150 cv 2.5 {occurrence}
  mixed gamma 0.25 {aggregate}'''
program = '''xpnl {name}
  inherit premium
  less
    ''' + book + '''
  less
    0.25 premium expenses'''
def quota_share(name, terms):
    """The base book under a 50% quota share at a 100% rate with the given terms."""
    return build(program.format(name=name, occurrence='',
                 aggregate=f'aggregate net of 50% po inf xs 0 rate 100% {terms} as QS'))
1.53.0

A sliding scale on a 50% quota share

The cover is a 50% quota share of the base book at 100% of the subject premium, so the ceded premium is 5,000 and the ceded loss ratio equals the gross loss ratio, with mean 70%. The scale pays 35% at a ceded loss ratio of 60%, 25% at the expected 70%, and 15% at 80%. The comparison is the same quota share with a flat 25% commission. The parsed terms of the cover are stored in the attribute variable_terms of the wrapped aggregate, engine.

Code
flat = quota_share('Flat', 'cede 0.25')
slide = quota_share('Slide', 'slide 0.35 at 0.6 and 0.25 at 0.7 and 0.15 at 0.8')
print(slide.engine.variable_terms)
qd(slide)
SlideTerms(anchors=((0.35, 0.6), (0.25, 0.7), (0.15, 0.8)))
PnL('Slide': 2 groups, 6 legs -> 'margin')

                         EX     SD       CV     Skew     P01  Median     P99
Step  Side                                                                  
Gross Consideration   10000      0        0            10000   10000   10000
      Obligation      -9500   2704 -0.28463 -0.67687  -17071   -9193   -4633
      Margin            500   2704    5.408 -0.67687   -7071     807    5367
QS    Consideration   -5000      0        0            -5000   -5000   -5000
      Obligation     4792.4 990.47  0.20667   1.1004  2816.5    4750  8035.5
      Margin         -207.6 990.47  -4.7711   1.1004 -2183.5    -250  3035.5
      Net             292.4 1753.7   5.9976 -0.47207 -4035.5     557  3183.5
All   Consideration    5000      0        0             5000    5000    5000
      Obligation    -4707.6 1753.7 -0.37253 -0.47207 -9035.5   -4443 -1816.5
      Margin          292.4 1753.7   5.9976 -0.47207 -4035.5     557  3183.5
      Impact         -207.6 990.47  -4.7711   1.1004 -2183.5    -250  3035.5

The QS step is the cover from the cedant’s side: the ceded premium of 5,000 against the recovery and the commission, which together make the obligation row, with mean 4,792. Its Net row is the running net result, here the same as All. The ledger economic_df lists the commission as its own leg, with mean 1,292 and standard deviation 448. In the 1 in 100 bad year, column κ01, the commission is at its minimum, 750, and in the 1 in 100 good year, κ99, at its maximum, 1,750.

Code
GT(slide.economic_df.loc['QS', ['EX', 'SD', 'κ01', 'κ50', 'κ99']], float_format=',.0f')
SideLabelEXSDκ01κ50κ99
ConsiderationQS premium-5,0000-5,000-5,000-5,000
ObligationQS recovery3,5001,3527,2863,3461,066
sliding commission1,2924487501,4031,750
Total4,7929908,0364,7502,816
MarginTotal-2089903,036-250-2,184
Net2921,754-4,0365573,184

The mean commission, 1,292, is 25.85% of the ceded premium, more than the 25% paid at the expected loss ratio. Between the end anchors the rate falls one point per point of loss ratio, so \(c(\lambda) = 0.95 - \lambda + (\lambda - 0.8)^+ - (0.6 - \lambda)^+\) and, since \(\mathsf{P}\lambda = 0.7\), the mean rate is \(\mathsf{P}c(\lambda) = 0.25 + \mathsf{P}(\lambda - 0.8)^+ - \mathsf{P}(0.6 - \lambda)^+\). The loss ratio is skewed to the right, so the floor at 15% cuts off a longer tail than the cap at 35%, and the last two terms add 0.85 points.

Commission and net result against the flat commission

The commission rate and the cedant’s net result are both functions of the ceded loss ratio. The gross loss is \(10{,}000\lambda\) and the recovery \(5{,}000\lambda\), so the net result, premium less expense and ceded premium, plus commission and recovery, less gross loss, is \(2{,}500 + 5{,}000(c(\lambda) + \lambda) - 10{,}000\lambda\). The left panel shows the two commission rates and the right panel the two net results.

Code
lr = np.linspace(0.2, 1.4, 241)
rates = {'sliding scale': slide.engine.variable_terms.phi(lr), 'flat 25%': np.full_like(lr, 0.25)}
fig, (ax0, ax1) = figure('full', cols=2)
for (k, c), ls in zip(rates.items(), ['-', '--']):
    ax0.plot(lr, c, ls=ls, label=k)
    ax1.plot(lr, 10000 - 2500 - 5000 + 5000 * (c + lr) - 10000 * lr, ls=ls, label=k)
ax0.set(xlabel='ceded loss ratio', ylabel='commission rate', title='commission')
ax1.set(xlabel='ceded loss ratio', ylabel='net result', title='net result')
ax0.legend();

Between 60% and 80% the scale takes back one point of commission per point of loss ratio, so the net result falls at twice the slope of the flat cover: the cedant bears the whole movement of the ceded loss ratio in the band, on top of its retained half. Outside the band the two lines are parallel, the sliding scale 500 above the flat cover in good years and 500 below it in bad ones. The table compares the two covers over the whole distribution, with P01 the 1 in 100 bad result.

Code
df = pd.DataFrame({k: [-x.economic_ratios_df.loc['QS', 'E'], x.est_m, x.est_sd, x.q(0.01), x.cdf(0)]
                   for k, x in {'flat 25%': flat, 'sliding scale': slide}.items()},
                  index=['commission', 'mean', 'SD', 'P01', 'Pr(loss)']).T
df.index.name = 'cover'
GT(df, float_format=',.0f', ratio_cols=['Pr(loss)'])
covercommissionmeanSDP01Pr(loss)
flat 25%1,2502501,352-3,53638.5%
sliding scale1,2922921,754-4,03641.9%

The sliding scale adds 42 to the mean result, from the 0.85 points of extra expected commission, and costs 500 in the 1 in 100 year, where P01 falls from \(-3{,}536\) to \(-4{,}036\). The standard deviation (SD) of the net result rises from 1,352, half the gross 2,704, to 1,754, and the probability of a loss, a result of zero or less, from 38.5% to 41.9%.

Refused programs

A sliding scale replaces the flat commission across its aggregate program, so a cede on the same layer or on another aggregate layer is refused. A scale whose commission rises with the loss ratio is not a sliding scale and is refused too.

Code
refuse(lambda: quota_share('R1', 'cede 0.25 slide 0.35 at 0.6 and 0.15 at 0.8'),
       lambda: quota_share('R2', 'slide 0.35 at 0.6 and 0.15 at 0.8 and 2000 xs 8000 rate 6% cede 0.2'),
       lambda: quota_share('R3', 'slide 0.15 at 0.6 and 0.35 at 0.8'))
DecL: 'slide' replaces the fixed 'cede' commission; give one or the other.
DecL: 'slide' replaces the fixed 'cede' commission across its aggregate program,
so a 'cede' on another layer would not be booked; give one or the other.
SlideTerms: commission must be nonincreasing in loss ratio (a sliding scale),
got ((0.15, 0.6), (0.35, 0.8)).