Pricing scopes and formulas
Two pieces of code turn a submission into numbers:
SubmissionMetrics— a business-rules scope over oneSubmission: premium, limit, line, rates and the combined ratio (Underwriting/Source/SubmissionMetrics.cs).DeskEconomics— the waterfall from our premium down to economic profit, and the score the desk ranks by (Underwriting/Source/DeskEconomics.cs). It is not a scope interface: it is the recordDealEconomics(every figure a member) plus the pure functionsDeskEconomicsCalc.AssessandDeskEconomicsCalc.Score.
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:
RateOnLine— premium ÷ limit for the layer, as a fraction (0.078 = 7.8 %).Limit— the most the layer pays; it covers[Attachment, Attachment + Limit].OfferedShare— the share of the layer offered to us (0.5 = 50 %).StatedLossRatio— the pack's treaty loss ratio, recoveries ÷ reinsurance premium.Brokerage,CedingCommission,ExpenseRatio— fractions of reinsurance premium; the last is our own internal load.StatedCombinedRatio+StatedCombinedRatioBasis— a figure the pack states, and which book it measures:"Ceded treaty"or"Subject book, gross-up"(CombinedRatioBases). Anything else, including no basis, is undeclared.
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):
DeskEconomicsCalc.Assessbuilds the waterfall above. When the ranked option has been priced by its stop-loss model,PricedLossRatiotakes the first row of theAssesstable.DeskEconomicsCalc.Scoreturns it into the desk score.- The Underwriting Desk computes both live
(
Underwriting/Workbench/Source/WorkbenchAreas.cs). The submission's pricing operation stores the same two numbers asdeskScoreandexpectedProfit, withdeskScoreBasis(Underwriting/Source/DeskRanking.cs,DeskRanking.Rank), so a catalog sorted bycontent.deskScoreuses the same score. It does not reproduce the board's whole order:WorkbenchAreas.GridRowssorts 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.