Skip to main content
Back to module
Actuarial Mathematics · Exams and Practice

Actuarial work in spreadsheets

Reading53mLesson 2 of 3 in this module

What you'll learn

  • Build a reserving triangle
  • Calculate volume-weighted age-to-age and cumulative development factors
  • Estimate ultimate losses and unpaid reserves with the chain ladder
  • Apply good spreadsheet practice to a reviewable model

Build a loss development triangle and a chain ladder reserve estimate in a spreadsheet.

Why it matters

Actuaries use Python, R and SQL more every year, but spreadsheets are still everywhere: rate indications, reserve reviews, pension valuations and quick checks are often built, reviewed and handed over in Excel. A reviewer must be able to follow every number. This lesson uses the most famous actuarial spreadsheet of all, the loss development triangle and the chain ladder method, to show how to build a clear, checkable model. It connects directly to the P&C reserves from module 2.

The loss development triangle

Claims take time to settle. A car accident in 2025 might be paid partly in 2025, more in 2026 and the last of it in 2028. Arrange cumulative paid losses by accident year (rows) and development age (columns, in months since the start of the accident year):

accident year12243648
20221,0001,5001,6501,700
20231,1001,7001,870
20241,2001,750
20251,300

(Amounts in thousands.) Each diagonal is a calendar year. The bottom-right is empty because those ages have not happened yet. The reserving question is: what will each row grow to (its ultimate loss)?

The chain ladder method

1. Age-to-age factors. For each pair of ages, divide the sum of the later column by the sum of the earlier column, using only rows that have both (the volume-weighted average):

12-24: (1,500 + 1,700 + 1,750) / (1,000 + 1,100 + 1,200) = 4,950 / 3,300 = 1.5000
24-36: (1,650 + 1,870) / (1,500 + 1,700)                 = 3,520 / 3,200 = 1.1000
36-48: 1,700 / 1,650                                      =                 1.0303

2. Cumulative development factors (CDFs). Multiply the factors from each age to the end. We assume no development after 48 months (a tail factor of 1.0; real reviews estimate one):

CDF 48 = 1.0000
CDF 36 = 1.0303
CDF 24 = 1.1000 * 1.0303 = 1.1333
CDF 12 = 1.5000 * 1.1333 = 1.7000

3. Ultimates and reserves. Multiply each row's latest value by its CDF. The unpaid (reserve) is ultimate minus paid to date:

accident yearpaid to dateCDFultimateunpaid
20221,7001.00001,700.000.00
20231,8701.03031,926.6756.67
20241,7501.13331,983.33233.33
20251,3001.70002,210.00910.00
total6,6207,820.001,200.00

The insurer needs about 1.2 million held for these claims. Most of it is for the most recent year, whose estimate is also the least certain: a small change in the 12-24 factor moves it a lot. Methods such as Bornhuetter-Ferguson (which blends the chain ladder with an expected loss ratio, a credibility idea) are used to stabilise recent years.

Spreadsheet formulas

With the triangle in B2:E5 (rows = years, columns = ages):

12-24 factor (B8):   =SUM(C2:C4)/SUM(B2:B4)
24-36 factor (C8):   =SUM(D2:D3)/SUM(C2:C3)
36-48 factor (D8):   =E2/D2
CDF at 12 (B9):      =PRODUCT(B8:D8)*tail

Put every assumption (tail factor, any selected factor that overrides the average) in its own clearly labelled input cell, never typed inside a formula.

Good spreadsheet practice

  • Separate inputs, calculations and outputs, ideally on different tabs, with inputs shaded one colour.
  • No hard-coded numbers in formulas. =C2*1.0303 hides an assumption; =C2*$D$9 points to it.
  • Check totals. Add a reconciliation: total ultimate minus total paid must equal total unpaid. Show a check cell that says OK or ERROR.
  • Document. A notes tab with the data source, date, method and who reviewed it. ASOP 41 (actuarial communications) expects that another actuary could follow your work.
  • Version and lock. Save dated versions; protect formula cells so they are not overwritten.
  • Know when to move to code. Large triangles, many segments or stochastic methods (bootstrapping, Mack's model) are easier to reproduce in Python or R, such as the open-source chainladder Python package.

Common mistakes

  • Averaging the individual ratios with a simple mean when the volume-weighted average was intended (or the reverse), without saying which.
  • Using rows that lack the later age in a factor's denominator.
  • Forgetting the tail. Long-tailed lines (liability, workers' compensation) develop for many years.
  • Mixing paid and incurred data in one triangle.

Quick recap

  • Triangles arrange cumulative losses by accident year and development age.
  • Chain ladder: age-to-age factors, then CDFs, then ultimate = latest x CDF, unpaid = ultimate - paid.
  • Build spreadsheets with separate inputs, no hard-coded numbers, check cells and notes.

Try it

The Do tab walks you through building this triangle and reserve estimate in a free spreadsheet, with a check that the total unpaid is 1,200.

Key terms (6)

loss development triangle
A table of cumulative losses with accident years as rows and development ages as columns.
chain ladder
A reserving method that projects each accident year to ultimate using development factors from the triangle.
Age-to-age factors
Ratios of cumulative losses at one development age to the previous age, here volume-weighted.
tail factor
A factor for development after the last age in the triangle; 1.0 means no further development.
ultimate
The final amount an accident year's losses are expected to reach.
input cell
A clearly labelled cell that holds an assumption, referenced by formulas instead of typing numbers into them.

Recap

  • A triangle arranges cumulative losses by accident year and development age.
  • Chain ladder: age-to-age factors, then cumulative factors, then ultimate = latest x CDF and unpaid = ultimate - paid.
  • The most recent year carries most of the reserve and the most uncertainty.
  • Keep inputs, calculations and outputs separate, with no hard-coded numbers, check cells and notes.
Also in this lesson: