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 in Ifrs17/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. PremiumAllocation is 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 force TechnicalMarginForOpeningBalance: −stored(C) + stored(L) — the closing CSM and loss component carried in
CF TechnicalMarginIsZero
IA TechnicalMarginForInterestAccretion: aggregated margin × the factor over the period
EA no rule: the general formula applies, and EA/C has no present value, so TM(EA) = 0
AM no rule: the general formula applies, and AM/C has no present value, so TM(AM) = 0 — the margin is not released
EOP TechnicalMarginForClosingBalance: the aggregated margin
otherwise best estimate over the margin's amount types + risk adjustment, on L (C under VFA)

The margin's amount types (TechnicalMarginAmountType) leave out coverage units, non-attributable expenses and CDR — so the locked-in child CDRI stays 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 type LR is 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 (L if above 1E-5, else C); 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 CL the port applies the same rule, with the margin aggregated over the previous steps of every novelty. It has no separate formula for

  1. — 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.

ComputationHelper also declares AocTypeWithoutCsmSwitch (BOP, EOP, AM, EA), but no scope reads it. AM and EA carry 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 LR and excludes attributable expenses from the margin when LR is asked for, but there is no loss-recovery scope, no boundary, and no scope reads ReinsuranceCoverage. 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.