Insurance ALM: Solvency II balance sheet
PricingLab by Raganel Consulting, powered by MatLogica AADC
What it values
An insurer that has taken over a pension scheme’s obligations (a bulk annuity) must pay those pensions for decades, and holds bonds to do it. Under Solvency II, the European and UK capital regime, it has to show regulators a balance sheet: what the bonds are worth, what the promised pensions are worth (the best-estimate liability, BEL), an extra margin on top (the risk margin), the capital left over (own funds), the capital the rules require (the solvency capital requirement, SCR) and the ratio of the two (the solvency ratio). This model builds that balance sheet for a book of 1,200 pension members backed by 21 bonds. It also returns, from a single calculation, how the liability, the assets and the own funds move with each of the 21 assumptions behind them.
Who uses this kind of number
Actuaries and ALM (asset-liability management) teams at life insurers, reinsurers and bulk-annuity providers; investment teams matching bonds to pension payments; and risk and capital teams that explain to the board and the regulator why the solvency ratio moved.
Inputs
| Name | Unit | Default | Meaning |
|---|---|---|---|
zero_1y | fraction | 0.0435 | Zero-coupon rate at 1 year |
zero_2y | fraction | 0.042 | Zero-coupon rate at 2 years |
zero_3y | fraction | 0.041 | Zero-coupon rate at 3 years |
zero_5y | fraction | 0.04 | Zero-coupon rate at 5 years |
zero_7y | fraction | 0.0398 | Zero-coupon rate at 7 years |
zero_10y | fraction | 0.0402 | Zero-coupon rate at 10 years |
zero_15y | fraction | 0.0415 | Zero-coupon rate at 15 years |
zero_20y | fraction | 0.0425 | Zero-coupon rate at 20 years |
zero_25y | fraction | 0.0428 | Zero-coupon rate at 25 years |
zero_30y | fraction | 0.043 | Zero-coupon rate at 30 years |
spread | fraction | 0.0095 | Investment-grade credit spread |
longevity | multiplier | 1.0 | Multiplier on base mortality (below 1 = people live longer) |
improvement | fraction/yr | 0.0125 | Annual mortality improvement |
inflation | fraction/yr | 0.032 | RPI inflation (drives pension escalation, capped 5%) |
expense_pp | GBP/yr | 68 | Administration expense per policy |
expense_infl | fraction/yr | 0.035 | Expense inflation |
makeham_a | per yr | 0.00022 | Gompertz–Makeham A (age-independent mortality) |
makeham_b | per yr | 0.0000385 | Gompertz–Makeham B (scale of age-dependent mortality) |
spread_hy | fraction | 0.031 | High-yield spread (no effect on the gilt-ladder book) |
equity_level | multiplier | 1.0 | Equity level (no effect on the gilt-ladder book) |
prepayment | fraction/yr | 0.06 | Mortgage prepayment (no effect on the gilt-ladder book) |
Every input has a supported range; describe_model lists it. Any input you leave out takes its default.
Outputs
- Value: the best-estimate liability (BEL), in GBP.
- Balance sheet: market value of assets, BEL, risk margin, technical provisions (BEL plus risk margin), own funds (assets minus technical provisions), SCR and solvency ratio (own funds divided by SCR).
- SCR by risk: interest rate, spread, longevity, expense, mortality and equity.
- Sensitivities of the BEL, of the assets and of the own funds to each of the 21 inputs, in GBP per 1.00 change in the input (for a rate, divide by 10,000 to get the effect of one basis point).
- Timing of the calculation in milliseconds.
How the sensitivities are computed
The model projects every member’s pension, year by year, and discounts it on the zero curve. All 21 sensitivities of the liability come from that same calculation, in one forward pass and one backward pass (adjoint algorithmic differentiation), instead of 42 extra revaluations with each input nudged up and down. The stressed balance sheets behind the SCR are computed in the same call.
How they are checked
Every sensitivity can be recomputed by bump-and-revalue: nudge the input up and down and revalue. Here the bumped valuations run through a separate, plain calculation path, not the one that produced the sensitivities, so the check compares two independent routes to the same number. The check_against_bumping tool does this on demand and reports each gap and both timings.
Measured on 5 November 2026 at the default inputs, on two cores of an Intel Xeon 8280L: the largest gap across all 21 sensitivities was 0.0000025% of the largest sensitivity (2.5 × 10⁻⁸ in relative terms), against a tolerance of 2%. The one-pass calculation took 1.7 ms; bump-and-revalue needed 42 valuations and took 43.2 ms. Gaps here are measured against the largest sensitivity, because four inputs have exactly zero effect on the liability of this book (below) and a relative gap on zero is undefined.
What the model includes
- The book: 1,200 simulated pension members, 842 already retired and 358 deferred (not yet retired). 468 pensions are level, 518 rise with RPI inflation capped at 5% a year, and 214 rise at a fixed 3%. 857 members carry a spouse’s pension that continues after their death. The book is simulated, not taken from any scheme.
- The assets: 21 bonds, 10 UK government gilts and 11 corporate bonds, with maturities out to 40 years, valued on the zero curve plus their credit spread.
- Mortality: Gompertz–Makeham, with women rated three years younger than men, a flat annual improvement rate and a multiplier for longevity scenarios. Spouses’ lives are treated as independent of members’.
- Expenses: a per-policy administration cost growing with expense inflation.
- Discounting on a ten-point zero curve, from 1 to 30 years.
- SCR from stresses shaped like the Solvency II standard formula: interest rates down and up, credit spreads up (100 basis points investment grade, 300 high yield), mortality 20% lower (longevity), expenses 10% higher with inflation one point higher, mortality 15% higher, and equities 39% lower. The modules are combined with a correlation matrix.
- Risk margin: a 4% cost of capital on the projected capital for non-hedgeable risks, year by year with the tapering factor of the UK PRA Rulebook (Technical Provisions 4A.1).
Credit spread moves the assets but not the liability, so its liability sensitivity is exactly zero. The high-yield spread, equity level and mortgage prepayment inputs belong to a wider general-account portfolio and have no effect on this all-bond book.
It is designed to show how a Solvency II balance sheet, and each of its sensitivities, responds to a change of assumption on a realistic annuity book, in well under a second.
Worked example (default inputs)
Run on 5 November 2026 with every input at its default:
| Item | GBP |
|---|---|
| Assets (market value) | 144,639,401 |
| Best-estimate liability | 103,496,203 |
| Risk margin | 3,835,006 |
| Technical provisions | 107,331,210 |
| Own funds | 37,308,192 |
| SCR | 15,048,936 |
| Solvency ratio | 247.9% |
SCR by risk: longevity 10,722,978; spread 6,836,649; interest rate 1,819,658; expense 259,935; mortality 0; equity 0. Longevity is the largest, as expected for an annuity book: the risk is that pensioners live longer than assumed. Mortality is zero because higher mortality is a gain on annuities.
Some sensitivities of the liability, per 1.00 change in the input:
| Input | d(BEL) |
|---|---|
| Zero curve at 30 years | −352,575,397 (about −35,258 per basis point) |
| Zero curve at 15 years | −248,894,272 (about −24,889 per basis point) |
| RPI inflation | 804,247,285 (about 80,425 per basis point) |
| Longevity multiplier | −47,545,352 (about −475,454 per 1% higher mortality rates) |
| Expense per policy | 16,619 per GBP 1 of annual expense |
The complete call, balance sheet with all stresses and all sensitivities of liability, assets and own funds, took 282 ms.
Three ways to use it
1. From an AI tool, through the hosted MCP endpoint. In any MCP client, add a remote server with this address and no authentication:
https://mypricinglab.com/lab/mcp
Then ask, for example: “Build the insurance ALM balance sheet at the defaults, then show what a 50 basis point fall in all zero rates does to the solvency ratio.” The tools are list_models, describe_model, price_model, check_against_bumping and run_model_function. The hosted service is free, needs no login, and runs on the simulated book.
2. In Excel. Install the PricingLab add-in and open the workbook PricingLab_InsuranceALM.xlsx. Instructions and downloads: https://mypricinglab.com/excel
3. On your own machine. The local install runs the same tools with no size caps, and your inputs never leave your machine. It is sent on request (Linux x86-64 today; ask about Mac and Windows): write to info@mypricinglab.com. Once installed:
pricinglab mcp # MCP server for a local MCP client
pricinglab serve # local web server for the Excel workbook
Details: https://mypricinglab.com/install
With login
A private hosted service, with your own book and assumptions, is available. Contact us.
Contact
PricingLab by Raganel Consulting, powered by MatLogica AADC. To run this on your own book, inside your own network, write to info@mypricinglab.com.