Pricing — the data model
Start with one node. Open the sample price program. It is
a priced Program with the id PROG1. Read its content top to bottom and you have read the whole
module:
header Reinsurance/Samples/PropertyCatTreaty ← the treaty it prices
acceptancesById PropertyCat2023 → Reinsurance/Acceptance/PropertyCat2023
PropertyRisk2023 → Reinsurance/Acceptance/PropertyRisk2023
sectionsById S1 → Reinsurance/Samples/PropertyCatSection
lossModelsById property-cat-2024 → LossModelling/FrequencySeverityLossModel
simulationSettings 10,000 simulations, compressed to 5, last run 2024-03-01 09:30, 4,200, "completed"
simulationResults S1-GrossLoss [20, 45, 70, 95, 140]
S1-CededLoss [ 0, 0, 10, 35, 40]
Every value on the right is a node path: into the Reinsurance partition for the treaty, acceptances and sections, and into Loss Modelling for the loss model. The Program never holds a C# reference to a Reinsurance or Loss Modelling type. That is why the dependency is strictly one-way: Pricing → Reinsurance + LossModelling.
The two result distributions are illustrative draws, related by the section's 40 xs 60 layer
alone. Each ceded draw is min(max(gross − 60, 0), 40). The section's annual aggregate deductible
(5) and limit (120) are not applied, so these are pre-aggregate figures:
| Gross | 20 | 45 | 70 | 95 | 140 |
|---|---|---|---|---|---|
| Ceded | 0 | 0 | 10 | 35 | 40 |
The statistics over them (mean, standard deviation, quantile) are on the Formulas page.
The picture, drawn by the platform
Prerequisite: the class diagrams on this page are embedded from the Data Modelling plugin's explorer (/DataModelling/Explorer), which Pricing does not require. On an installation without it they render nothing; each type's own page under /Pricing still lists its properties.
The entities
Program: the pricing root
Source: Pricing/Program/Source/Program.cs. Type node: /Pricing/Program.
| Field | Type | Meaning | In the sample |
|---|---|---|---|
Id |
string | business identity; also the routing address pricing/{Id} (PricingAddress) |
PROG1 |
Header |
node path | the Reinsurance/Treaty it prices; the picker is limited to namespace:Reinsurance scope:descendants nodeType:Reinsurance/Treaty |
Reinsurance/Samples/PropertyCatTreaty |
AcceptancesById |
id → node path | the program's Reinsurance/Acceptance nodes |
2 entries |
SectionsById |
id → node path | the program's Reinsurance sections | S1 |
LossModelsById |
opaque id → node path | where a contract's opaque loss-model id becomes a real model | property-cat-2024 |
SimulationSettings |
embedded | the run configuration | see below |
SimulationResults |
embedded list | the simulated distributions | 2 |
Address (computed, not stored) |
PricingAddress |
new() { Id = Id }, printed as pricing/PROG1 |
— |
The opaque-id bridge. The sample section PropertyCatSection
carries models: [{ lossModel: "property-cat-2024", sections: [...] }]. That is a LossModelMap
(Reinsurance/Source/LossModelMap.cs). It knows the id only, never which model it is. The Program's
LossModelsById records which model the id resolves to. Rebinding it changes one Program entry and
leaves the contract untouched. It is not a re-price: Pricing ships no runner that follows this
path and recomputes the distributions. The stored SimulationResults stay exactly as they were
until something writes new ones. In the sample the id resolves to the type node
LossModelling/FrequencySeverityLossModel, because no frequency-severity instance node ships (see
the Loss Modelling data model).
The referenced nodes:
- the treaty Alpina Property Cat XL 2024 (
TR-2024-001) - the acceptances Property Cat 40 xs 60 — UWY 2023 and Property Risk 20 xs 10 — UWY 2023
- the section Property Cat XL (
S1): 40 xs 60, AAD 5, AAL 120
For the contract side, see the Reinsurance data model.
SimulationSettings: the run configuration
Source: Pricing/SimulationSettings/Source/SimulationSettings.cs. It is embedded in the Program.
| Field | Meaning | Sample |
|---|---|---|
PricingId |
the owning Program's id, pointing back at it | PROG1 |
NumberOfSimulations |
Monte-Carlo draws in a run | 10,000 |
CompressTo |
buckets the result distribution is compressed to | 5 (the C# fixture in Pricing/SampleData/Source/SamplePricings.cs says 100) |
LastRun |
when the run completed; null if it never ran | 2024-03-01T09:30:00 |
Timing |
elapsed time of the last run; the unit is "implementation-defined ticks/milliseconds" per source | 4,200 |
Message |
status or error message | completed |
IsInProgress |
true while a run executes | false |
SimulationResult: one simulated distribution
Source: Pricing/SimulationResult/Source/SimulationResult.cs. It is embedded in the Program.
| Field | Meaning | S1-GrossLoss |
|---|---|---|
Id |
identity within the program | S1-GrossLoss |
AmountType |
node path of a Reinsurance/AmountType |
Reinsurance/AmountType/PaidLoss |
Period |
development / projection period | 1 |
StructureId |
the section / structure id; a key of SectionsById |
S1 |
Distribution |
the samples | [20, 45, 70, 95, 140] |
Mean, StandardDeviation, Quantile(p) |
computed, never stored ([JsonIgnore]) |
74 · 41.40 · Q(0.9) = 122 |
The key of a result is (StructureId, AmountType, Period) plus its Id. StructureId joins it
to SectionsById.
Guideline: the underwriting guideline as rules
Type node: /Pricing/Guideline. Its content type is PricingState
(Pricing/Guideline/Source/PricingState.cs), a priced placement. The rules themselves are the
Guideline scope (Pricing/Guideline/Source/Guideline.cs) evaluated over that state.
PricingState field |
Meaning | Sample compliance check |
|---|---|---|
Name |
the placement | "Meridian Re — Property Cat renewal 2026" |
LineOfBusiness |
free text, normalised to look up the per-LoB cap | Property Cat |
GrossLine |
€ gross line | 62,000,000 |
CombinedRatio |
priced combined ratio | 1.08 |
TermMonths |
contract term | 24 |
CedentRating |
S&P or Moody's notation | A- |
MandatoryExclusionRemoved, NonStandardClause |
wording deviations | false, false |
Caps |
CapRow list (Label, MaxGrossLine, MaxNetRetention, MaxTermMonths, Aliases); when present it wins over the built-in §6 table |
empty |
The outputs are not stored. They are: Escalation (a flags enum: SecondUnderwriter, HeadOfLoB, Cuo,
UnderwritingCommittee, Legal), GuidelineVerdict (Write, ReferToCuo, Decline),
GuidelineShareAction (Maintain, Increase, Decrease, Decline), and one RuleResult per clause
(Clause, Title, Status, Messages, Escalation). See the Formulas page.
How it hangs together
| From | Field | To |
|---|---|---|
| Program | Header |
Reinsurance/Treaty |
| Program | AcceptancesById[*] |
Reinsurance/Acceptance |
| Program | SectionsById[*] |
Reinsurance section (ModelledReinsuranceSection, …) |
| Reinsurance section | models[].lossModel |
an opaque id |
| Program | LossModelsById[opaque id] |
a LossModelling loss model |
| SimulationResult | AmountType |
Reinsurance/AmountType |
| SimulationResult | StructureId |
a key of SectionsById |
| SimulationSettings | PricingId |
the Program's Id |
| PricingState | Caps |
a projection of the §6 cap rows; the source names Underwriting/CapacityCap nodes |
Nothing in Reinsurance or Loss Modelling points back at Pricing. The test
ProgramTests → "no back-reference into Pricing" pins that.
Check yourself
Q. An underwriter wants PROG1 to use a different loss model. The new model sits at
LossModelling/FrequencySeverityLossModel/PropertyCat2025. Which node changes, and which does not?
A. Only the Program changes: lossModelsById["property-cat-2024"] gets the new path. The section
PropertyCatSection keeps saying lossModel: "property-cat-2024".
It holds the opaque id, never the path, so the contract is untouched.
Rebinding is not the re-price itself. Pricing has no runner that resolves the path and recomputes
the distributions, so the stored simulationResults stay unchanged until a run writes new ones.
Reference
| Type | Node | Source | Shipped instance |
|---|---|---|---|
| Program | /Pricing/Program | Pricing/Program/Source/Program.cs |
SamplePriceProgram |
| SimulationSettings | /Pricing/SimulationSettings | Pricing/SimulationSettings/Source/SimulationSettings.cs |
embedded in the sample |
| SimulationResult | /Pricing/SimulationResult | Pricing/SimulationResult/Source/SimulationResult.cs |
embedded in the sample |
Guideline (PricingState) |
/Pricing/Guideline | Pricing/Guideline/Source/*.cs |
SampleGuidelineCompliance |
| PricingAddress | — (value) | Pricing/Source/PricingAddress.cs |
pricing/PROG1 |
| C# fixtures | — | Pricing/SampleData/Source/SamplePricings.cs |
SamplePricings.Program() |
Next: the formulas · Loss Modelling data model · one distribution ceded through QS, XL, tower and stop-loss.