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:

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.

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.