Ported from the open-source IFRS 17 Calculation Engine —
ifrs17/Import/4ImportScope-TechnicalMargin.ipynb —
originally written for Systemorph Cloud.
Technical margin, CSM and loss component
In the port these scopes are in
Ifrs17/Engine/Source/TechnicalMargin.cs, tested inIfrs17/Engine/Test/TechnicalMarginTests.cs. The margin, its allocation to CSM and loss component, and the switch are ported; The IFRS 17 formulas works a switch through with numbers. The experience adjustment on premiums, the amortization of the margin and the loss-recovery component are not ported. Each section below says which.
Experience adjustment on premium
The experience adjustment (EA) on premiums weights the cash-flow step (CF) of the premium
amount types by the group's premium allocation factor. Present values and actuals contribute
separately:
EA(PV) = PremiumAllocationFactor · PV(CF)
EA(Actual) = PremiumAllocationFactor · Actual(CF)
Premiums and their children are included; the novelties in force and new business for the present value, the combined novelty for the actuals. The allocation is always done at the finest granularity available (novelty, line of business, …).
Not ported.
PremiumAllocationis a property of DataNodeParameter that no scope reads, and the port computes no actuals.
Technical margin
To compute the CSM or loss component of each step of the
AoC structure it helps to introduce the technical margin
TM. Under BBA the best estimate and the risk adjustment are discounted on locked-in rates.
Not every best-estimate amount type enters the margin: non-attributable expenses are excluded. For
reinsurance, the credit default risk on current parameters and the attributable expenses are
excluded too; credit default risk on locked-in parameters (the
partner rating and default rate valid in the
first year of the reinsurance group) is included.
TM(s) = TM(EOP) of the previous period if s = BOP and the novelty is in force
0 if s = CF
IAF · AggregatedTM(IA) if s = IA
Premiums + AttributableExpenseAndCommissions + InvestmentClaims if s = EA
−AF · AggregatedTM(AM) if s = AM
AggregatedTM(EOP) if s = EOP
PV(s) without non-attributable amount types + PV_RA(s) otherwise
where
AggregatedTM(step) = Σ_(s ∈ previous steps) TM(s)
IAF = Π_(i = 1 … TS) Interest_i − 1
Interest_i is the monthly interest factor from the yield curve and TS the time step (see
Present values). The three terms of the experience-adjustment
step are
Premiums = Σ_(PR and its children) EA(PV) − EA(Actual)
AttributableExpenseAndCommissions = Σ_(ACA, AEA) ( PV_(novelty I) + PV_(novelty N) ) − Actual_(novelty C)
InvestmentClaims = Σ_(ICO and its children) ( PV_(novelty I) + PV_(novelty N) ) − Actual_(novelty C)
with the CF step implicit throughout, PV the best-estimate present value and Actual the actuals
of estimate type A. By the sign convention the CF step of the best estimate and of the actuals
have the same sign, which the minus in the formulas accounts for.
The port, rule by rule:
Step Port BOP, in forceTechnicalMarginForOpeningBalance:−stored(C) + stored(L)— the closing CSM and loss component carried inCFTechnicalMarginIsZeroIATechnicalMarginForInterestAccretion: aggregated margin × the factor over the periodEAno rule: the general formula applies, and EA/Chas no present value, soTM(EA) = 0AMno rule: the general formula applies, and AM/Chas no present value, soTM(AM) = 0— the margin is not releasedEOPTechnicalMarginForClosingBalance: the aggregated marginotherwise best estimate over the margin's amount types + risk adjustment, on L(Cunder VFA)The margin's amount types (
TechnicalMarginAmountType) leave out coverage units, non-attributable expenses andCDR— so the locked-in childCDRIstays in, as in the original. Under PAA they also leave out premiums and deferrable expenses. Attributable expenses are left out only when the loss-recovery estimate typeLRis asked for, not for reinsurance groups in general as the original describes.
Allocating the margin to CSM and loss component (gross)
The CSM and LC are computed from the technical margin. For a step s, the margin goes to the
loss component when the aggregated margin is positive and to the CSM when it is negative:
CSM(s) = 0, LC(s) = TM(s) if AggregatedTM(s) > 0
CSM(s) = −TM(s), LC(s) = 0 otherwise
The CSM is reported as the opposite of the margin, to satisfy the sign convention: a positive technical margin is onerous.
The margin can switch from CSM to LC, or back, at any step except amortization, where it does not switch from the previous step. On a switch the total accumulated in the CSM (LC) before that step is brought to zero, and the remainder is allocated to the LC (CSM).
The switch logic
The switch is applied separately to in force and to new business. The combined-liabilities step
CL brings the two together, because there the novelties are summed.
A) Opening balance. For the in-force novelty, CSM(BOP) and LC(BOP) are the previous
period's CSM(EOP) and LC(EOP).
B) The following steps — except CL — are best written as deltas, ΔCSM and ΔLC:
| Condition | ΔCSM(s) | ΔLC(s) |
|---|---|---|
switch LC → CSM: AggTM > 0 and AggTM + TM ≤ 0 |
−TM − AggTM |
−AggTM |
switch CSM → LC: AggTM ≤ 0 and AggTM + TM > 0 |
AggTM |
TM + AggTM |
stays CSM: AggTM ≤ 0 and AggTM + TM ≤ 0 |
−TM |
0 |
stays LC: AggTM > 0 and AggTM + TM ≥ 0 |
0 |
TM |
where AggTM is AggregatedTM(s) and TM is TM(s).
C) Combined liabilities CL. The switch is similar, except that a switch from LC to CSM can
happen because of new business and despite in force:
ΔCSM(CL) = −TM(CL) − ( AggTM(last in-force step) + TM(last in-force step) )
ΔLC(CL) = − ( AggTM(last in-force step) + TM(last in-force step) )
or because of in force and despite new business:
ΔCSM(CL) = −TM(CL) − ( AggTM(last new-business step) + TM(last new-business step) )
ΔLC(CL) = − ( AggTM(last new-business step) + TM(last new-business step) )
A switch in the other direction, CSM to LC, uses the same formulas with CSM and LC swapped.
D) Closing balance.
CSM(EOP) = Σ_(s ∈ previous steps) ΔCSM(s)
LC(EOP) = Σ_(s ∈ previous steps) ΔLC(s)
The port (
AllocateTechnicalMargin) writes the cases of B) as one rule: classify the aggregated margin before and after the step (Lif above1E-5, elseC); on a switch the newly entered side takes the step and the accumulated margin and the side being left gives its accumulated margin back; without a switch the current side takes the step. The opening balance never switches, and the closing balance sums the allocations of the previous steps.The previous steps of an in-force or new-business step are those of its own novelty, so B) runs separately per novelty as in the original. For
CLthe port applies the same rule, with the margin aggregated over the previous steps of every novelty. It has no separate formula for
- — no reference to the last in-force or last new-business step. Whether the two always agree is not established here: the port's tests pin the rule on pairs of (accumulated margin, step) (
TechnicalMarginTests), not on a chain where in force and new business carry opposite signs.
ComputationHelperalso declaresAocTypeWithoutCsmSwitch(BOP,EOP,AM,EA), but no scope reads it.AMandEAcarry a zero margin in the port, so they cannot cause a switch.
Contractual service margin
The CSM scope sets the estimate type C. For a group of insurance contracts the value comes from
the allocation above; for a group of reinsurance contracts it comes from the technical margin
directly.
In the port (
ContractualServiceMargin):−TechnicalMargin(C)for reinsurance held,−AllocateTechnicalMargin(C)otherwise. Same split.
Loss component
The loss-component scope sets the estimate type L. Port: LossComponent =
AllocateTechnicalMargin(L).
Loss-recovery component
Not ported. The port has the estimate type
LRand excludes attributable expenses from the margin whenLRis asked for, but there is no loss-recovery scope, no boundary, and no scope readsReinsuranceCoverage. The original's method follows.
For reinsurance held, a loss-recovery component (LoReCo) is computed when the underlying gross LRC business opens a loss component. If the underlying gross business is LIC there is no LoReCo, as there is no loss component on the gross side either. By definition the LoReCo aggregated along the chain must be negative, so that the insurer recovers the losses. Its lower limit is the LoReCo boundary with the sign inverted. The amount allocated follows the technical margin computed for the reinsurance group.
LoReCo boundary
The boundary is the underlying gross loss component weighted by the reinsurance coverage (RC)
parameter of the data node parameters. When a reinsurance group r
covers several gross groups g, the boundaries of each link are added:
LoReCoBoundary(r) = Σ_(g ∈ underlying GICs) RC_(g,r) · LC(g)
Under the premium allocation approach the LoReCo is the negative of the boundary
(LossRecoveryComponentPaa: −LoReCoBoundary), consistent with the negative-recovery convention. A limitation of the original:
no FX conversion between the functional currencies of the gross and the reinsurance group — they are
assumed equal.
LoReCo calculation
The LoReCo allocates the reinsurance technical margin (TM, measured for the estimate type LR)
while forcing the aggregated LoReCo to stay within its boundaries at every step. The upper
boundary is zero; the lower boundary is the negative of the cumulative boundary, −B(s), where
B(s) = AggBoundary(s) + Boundary(s) sums the boundary over the previous steps and this one. When a
full allocation would push the LoReCo past a boundary, a partial allocation brings it exactly to the
boundary, and the calculation continues with the next step. With A = AggLoReCo(s−1) + TM(s), the
original's LossRecoveryComponent reads:
LoReCo(s) = TM(s) if −B(s) ≤ A < Precision (within the boundaries)
−AggLoReCo(s−1) if A ≥ Precision (above the upper boundary, zero)
−AggLoReCo(s−1) − B(s) if A < −B(s) (below the lower boundary)
so that after the step the aggregated LoReCo is TM-driven, exactly 0, or exactly −B(s).
The in-force opening is the previous year-end closing. For the other novelties, and in the first year of the reinsurance group, the opening is the boundary with the sign inverted.
LoReCo(AM) = −AF · AggLoReCo(AM) (0 when |AggLoReCo(AM)| ≤ Precision)
AggLoReCo(EOP) = Σ_(novelties) Σ_(AoC types) LoReCo(novelty, AoC type)
The closing balance is the sum of every previous step.