Pricing scopes and formulas

Two pieces of code turn a submission into numbers:

We work through both with one shipped deal first, then list the rules in general.

The worked example: Alpina MTPL XL 2027

Alpina MTPL XL 2027 is a two-layer motor liability excess-of-loss tower in EUR. Its live calculation is on the Formulae page, its figures on the Economics page.

The inputs, straight from the node's content:

Layer attachment limit rateOnLine offeredShare
Layer 1 3,000,000 7,000,000 0.078 0.5
Layer 2 10,000,000 15,000,000 0.034 0.5
Stated economics Value
statedLossRatio 0.72
brokerage 0.10
cedingCommission 0
expenseRatio 0.06
statedCombinedRatio / …Basis not stated
pricedLossRatio not priced

The layers stack (Layer 2 attaches at 10m, exactly where 7m xs 3m ends), so this is one tower and nothing is split into options (SubmissionOptions.AreAlternatives).

Step 1 — the tower: SubmissionMetrics

Premium100        = Σ (rateOnLine × limit)
                  = 0.078 × 7,000,000 + 0.034 × 15,000,000
                  = 546,000 + 510,000                      = 1,056,000
TotalLimit        = Σ limit
                  = 7,000,000 + 15,000,000                 = 22,000,000
GrossLineOffered  = Σ (offeredShare × limit)
                  = 0.5 × 7,000,000 + 0.5 × 15,000,000
                  = 3,500,000 + 7,500,000                  = 11,000,000
OurPremium        = Σ (offeredShare × rateOnLine × limit)
                  = 0.5 × 546,000 + 0.5 × 510,000
                  = 273,000 + 255,000                      = 528,000
BlendedRateOnLine = Premium100 ÷ TotalLimit
                  = 1,056,000 ÷ 22,000,000                 = 0.048   (4.8 %)
MinRateOnLine     = min(0.078, 0.034)                      = 0.034   (3.4 %)

These four amounts are pinned by the Submission tests: DealViewsTests.TowerLayers_StillAddUp checks Premium100 = 546,000 + 510,000 and GrossLineOffered = 11,000,000 on exactly these layers, and DealViewsTests.Economics_NumbersAndLabels checks our premium of 528,000.

Step 2 — the combined ratio, on the ceded-treaty basis

The pack states no combined ratio, so the scope derives it — and it may, because all four components are on file:

TreatyCombinedRatio = statedLossRatio + brokerage + cedingCommission + expenseRatio
                    = 0.72 + 0.10 + 0 + 0.06               = 0.88   (88 %)
SubjectCombinedRatio    = null   (no subject-book figure stated)
UndeclaredCombinedRatio = null   (no figure stated at all)

Step 3 — the waterfall: DeskEconomicsCalc.Assess

Assess picks the loss ratio in this order: our priced ratio, else the pack's components, else the pack's stated treaty ratio, else the plan. MTPL2027 is not priced and has all components, so the figures are the pack's own (OwnRatio = true, OwnComponents = true, basis stated):

LossRatio         = 0.72
ExternalCostRatio = brokerage + cedingCommission = 0.10 + 0 = 0.10
InternalCostRatio = expenseRatio                            = 0.06
CombinedRatio     = 0.72 + 0.10 + 0.06                      = 0.88
Margin            = 1 − 0.88                                = 0.12

OurPremium        (from step 1)                             =   528,000
− ExpectedLoss    = 528,000 × 0.72                          = − 380,160
− ExternalCost    = 528,000 × 0.10                          = −  52,800
− InternalCost    = 528,000 × 0.06                          = −  31,680
= TechnicalProfit = 528,000 × 0.12                          =    63,360

Capital           = OurLine × CapitalRatio  = 11,000,000 × 0.10 = 1,100,000
CapitalCost       = Capital × CostOfCapital = 1,100,000 × 0.06  =    66,000
ExpectedProfit    = 63,360 − 66,000                         = −   2,640
ReturnOnEquity    = 63,360 ÷ 1,100,000                      =    0.0576  (5.76 %)

The deal makes a technical profit, but earns 5.76 % on the capital it ties up against a 6 % hurdle. That leaves it 2,640 short of paying for its capital. The board's basis clause (uw.econ.basis.own) reads "on its own combined ratio …" with the 88 % filled in.

Step 4 — the desk score: DeskEconomicsCalc.Score

Every weight is struck in CHF at the desk's reference rates; EUR weighs 0.95.

RoE reason      = clamp(round(−2,640 × 0.95 ÷ 10,000), −40, 40)
                = clamp(round(−0.2508), −40, 40)                           =  0
Top-line reason = min(30, round(10 × log10(1 + 528,000 × 0.95 ÷ 100,000)))
                = min(30, round(10 × log10(6.016)))  = min(30, round(7.79)) =  8
Capital reason  = −min(25, round(5 × log10(1 + 1,100,000 × 0.95 ÷ 1,000,000)))
                = −min(25, round(5 × log10(2.045)))  = −min(25, round(1.55)) = −2

Score           = 0 + 8 − 2                                                 =  6

The reasons are listed largest first: topline EUR 528k (+8), ties up EUR 1.1m capital (−2), RoE … (0). These numbers were recomputed with Python from the formulas as written; the Formulae page computes them live.

SubmissionMetrics — every member

The scope is public interface SubmissionMetrics : IScope<string, Submission>. GetStorage() is the submission; each l is a SubmissionLayer. Every member is memoised by the proxy.

Member Formula, as written MTPL2027
Premium100 GetStorage().Layers.Sum(l => l.RateOnLine * l.Limit) 1,056,000
TotalLimit GetStorage().Layers.Sum(l => l.Limit) 22,000,000
GrossLineOffered GetStorage().Layers.Sum(l => l.OfferedShare * l.Limit) 11,000,000
OurPremium GetStorage().Layers.Sum(l => l.OfferedShare * l.RateOnLine * l.Limit) 528,000
BlendedRateOnLine TotalLimit > 0 ? Premium100 / TotalLimit : null 0.048
MinRateOnLine GetStorage().Layers.Count == 0 ? null : GetStorage().Layers.Min(l => l.RateOnLine) 0.034
TreatyCombinedRatio (CombinedRatioBases.IsCededTreaty(GetStorage().StatedCombinedRatioBasis) ? GetStorage().StatedCombinedRatio : null) ?? SubmissionCalc.DerivedTreatyCombinedRatio(GetStorage()) 0.88 (derived)
SubjectCombinedRatio CombinedRatioBases.IsSubjectBook(GetStorage().StatedCombinedRatioBasis) ? GetStorage().StatedCombinedRatio : null null
UndeclaredCombinedRatio CombinedRatioBases.IsUndeclared(GetStorage().StatedCombinedRatioBasis) ? GetStorage().StatedCombinedRatio : null null

The derivation behind TreatyCombinedRatio is SubmissionCalc.DerivedTreatyCombinedRatio:

submission is
{ StatedLossRatio: double lr, Brokerage: double b, CedingCommission: double c, ExpenseRatio: double e }
    ? lr + b + c + e
    : null;

What the inputs mean:

Why there is no member called CombinedRatio. A combined ratio on the cedent's subject book and one on the treaty we are offered are different measures. Only the treaty one is graded by the guideline. The subject-book one is context, and an undeclared one is a data-quality gap (the §6.1 referral). A missing component makes the derived ratio null, never a smaller number: reading it as zero would inflate the margin on the worst data.

DeskEconomics — every member

The plan constants (DeskEconomicsCalc)

Constant Value Meaning
PlanCombinedRatio 0.92d what a deal is ranked at until it states its own
PlanExternalCostRatio 0.10d plan brokerage + ceding commission
PlanInternalCostRatio 0.06d plan expense load
PlanLossRatio PlanCombinedRatio - PlanExternalCostRatio - PlanInternalCostRatio 0.92 − 0.10 − 0.06 = 0.76
CapitalRatio 0.10d capital per unit of committed line — always an assumption
CostOfCapital 0.06d the annual hurdle the capital must clear
ReferenceRates CHF 1.00, EUR 0.95, USD 0.90, GBP 1.20, … one unit of each currency in CHF; an unlisted currency weighs at par

How Assess chooses the three ratios

s is SubmissionOptions.Ranked(submission) — the favourite option alone when the layers are alternatives and one is flagged, else the submission as it stands.

Case (first that holds) loss external internalCost Basis
s.PricedLossRatio is { } priced priced (s.Brokerage ?? PlanExternalCostRatio) + (s.CedingCommission ?? 0d) s.ExpenseRatio ?? PlanInternalCostRatio priced
all four components on file s.StatedLossRatio!.Value s.Brokerage!.Value + s.CedingCommission!.Value s.ExpenseRatio!.Value stated
metrics.TreatyCombinedRatio is { } cr cr - external - internalCost s.Brokerage is { } b ? b + (s.CedingCommission ?? 0d) : PlanExternalCostRatio s.ExpenseRatio ?? PlanInternalCostRatio stated
nothing on file PlanLossRatio PlanExternalCostRatio PlanInternalCostRatio plan

OurPremium and OurLine come from step 1: metrics.OurPremium and metrics.GrossLineOffered.

The DealEconomics members

Member Formula, as written MTPL2027
OurPremium metrics.OurPremium 528,000
OurLine metrics.GrossLineOffered 11,000,000
LossRatio chosen by Assess (above) 0.72
ExternalCostRatio chosen by Assess 0.10
InternalCostRatio chosen by Assess 0.06
OwnRatio own is not null (own = metrics.TreatyCombinedRatio) true
OwnComponents all four of StatedLossRatio, Brokerage, CedingCommission, ExpenseRatio non-null true
PricedLoss s.PricedLossRatio is not null false
BasisName PricedLoss ? DeskBases.Priced : OwnRatio ? DeskBases.Stated : DeskBases.Plan stated
CombinedRatio LossRatio + ExternalCostRatio + InternalCostRatio 0.88
Margin 1d - CombinedRatio 0.12
ExpectedLoss OurPremium * LossRatio 380,160
ExternalCost OurPremium * ExternalCostRatio 52,800
InternalCost OurPremium * InternalCostRatio 31,680
TechnicalProfit OurPremium * Margin 63,360
Capital OurLine * DeskEconomicsCalc.CapitalRatio 1,100,000
CapitalCost Capital * DeskEconomicsCalc.CostOfCapital 66,000
ExpectedProfit TechnicalProfit - CapitalCost −2,640
ReturnOnEquity Capital > 0 ? TechnicalProfit / Capital : null 0.0576

The score (DeskEconomicsCalc.Score)

ToReference(amount, currency) is amount * (ReferenceRates.TryGetValue(currency, out var rate) ? rate : 1d).

Reason Added when Points, as written MTPL2027
uw.score.roe e.ReturnOnEquity is { } roe Math.Clamp(Math.Round(ToReference(e.ExpectedProfit, currency) / 10_000), -40, 40) 0
uw.score.topline e.OurPremium > 0 Math.Min(30, Math.Round(10 * Math.Log10(1 + ToReference(e.OurPremium, currency) / 100_000))) 8
uw.score.capital e.Capital > 0 -Math.Min(25, Math.Round(5 * Math.Log10(1 + ToReference(e.Capital, currency) / 1_000_000))) −2
Score — ordered.Sum(r => r.Points) 6

The reasons are ordered by Math.Abs(r.Points) descending, then by key. A deal with no offered line scores zero and has no reasons.

How the desk ranking uses them

There is one ranking, and these formulas are it (see Desk ranking):

  1. DeskEconomicsCalc.Assess builds the waterfall above. When the ranked option has been priced by its stop-loss model, PricedLossRatio takes the first row of the Assess table.
  2. DeskEconomicsCalc.Score turns it into the desk score.
  3. The Underwriting Desk computes both live (Underwriting/Workbench/Source/WorkbenchAreas.cs). The submission's pricing operation stores the same two numbers as deskScore and expectedProfit, with deskScoreBasis (Underwriting/Source/DeskRanking.cs, DeskRanking.Rank), so a catalog sorted by content.deskScore uses the same score. It does not reproduce the board's whole order: WorkbenchAreas.GridRows sorts open deals first, then by score, then breaks ties on expected profit, the priority score and the name.

Where the priced loss ratio comes from — the stop-loss model under each option and its stored result — is explained in the data model lesson. How a single loss distribution passes through each kind of cover (quota share, XL, tower, stop-loss) is Ceding a distribution.

Check yourself

Question. Our stop-loss model prices MTPL2027's tower at an expected loss ratio of 0.64, and the pack's cost figures stay as they are. What are the new technical profit, expected profit and desk score?

Answer. Assess takes the priced row: loss 0.64, external 0.10 + 0 = 0.10, internal 0.06, so the combined ratio is 0.80 and the margin 0.20.

TechnicalProfit = 528,000 × 0.20            = 105,600
ExpectedProfit  = 105,600 − 66,000          =  39,600   (capital unchanged: 1.1m × 0.06)
ReturnOnEquity  = 105,600 ÷ 1,100,000       =   9.6 %
RoE points      = round(39,600 × 0.95 ÷ 10,000) = round(3.762) = 4
Score           = 4 + 8 − 2                 =  10

The basis becomes priced, and the clause (uw.econ.basis.priced) reads "on our priced loss ratio … (combined …)" with 64 % and 80 % filled in. Only the loss ratio moved; premium, line and capital did not.

Reference

Symbol Where Meaning
Premium100 SubmissionMetrics reinsurance premium at 100 % placement
TotalLimit SubmissionMetrics sum of layer limits
GrossLineOffered SubmissionMetrics our committed capacity at the offered shares
OurPremium SubmissionMetrics, DealEconomics our premium at the offered shares
BlendedRateOnLine SubmissionMetrics premium ÷ total limit; null on an empty tower
MinRateOnLine SubmissionMetrics lowest layer rate on line (§6.1 minimum standard); null on an empty tower
TreatyCombinedRatio SubmissionMetrics combined ratio on the ceded-treaty basis — the only one graded
SubjectCombinedRatio SubmissionMetrics the cedent's subject-book ratio — context, never graded
UndeclaredCombinedRatio SubmissionMetrics a stated figure with no recognised basis — a data-quality gap
LossRatio, ExternalCostRatio, InternalCostRatio DealEconomics the three ratios Assess chose
CombinedRatio, Margin DealEconomics their sum, and one minus it
ExpectedLoss, ExternalCost, InternalCost, TechnicalProfit DealEconomics the waterfall in money
Capital, CapitalCost DealEconomics line × 10 %, and that × 6 %
ExpectedProfit DealEconomics technical profit after the cost of capital
ReturnOnEquity DealEconomics technical profit ÷ capital
BasisName DealEconomics priced / stated / plan
Score DealScore RoE points + top-line points − capital points

Sources: Underwriting/Source/SubmissionMetrics.cs, Underwriting/Source/DeskEconomics.cs, Underwriting/Source/SubmissionOptions.cs, Underwriting/Source/DeskRanking.cs. Tests: Underwriting/Submission/Test/SubmissionTests.cs, DealViewsTests.cs, DeskRankingTests.cs, FormulaeTests.cs, and Underwriting/Workbench/Test/WorkbenchTests.cs.