Methodology and formulas

This document explains exactly what actuarial computes and the conventions it uses. It also works one example through by hand. The example is the same one the test suite checks in tests/test_puc_hand.py.

1. Notation

Symbol Meaning
x exact age at the valuation date: (valuation date − DOB) / 365.25
s past service at the valuation date: (valuation date − DOJ) / 365.25
R normal retirement age; n = R − x is the time to retirement
i, e discount rate and salary escalation rate (annual, effective)
W current monthly salary (basic + DA)
q^d_y, q^w_y independent annual rates of death and withdrawal at age last birthday y

2. Exit projection (multiple decrement)

Each projection year k = 0, 1, … runs while k < n. Within year k:

qd' = qd · (1 − qw/2) qw' = qw · (1 − qd/2)

Survivors to t = n retire. The unconditional exit probabilities sum to 1. Projected salary at time t is W · (1 + e)^t. An employee already at or beyond R is treated as exiting immediately (t = 0, probability 1).

3. Gratuity benefit

completed years N = ⌊S⌋ + 1 if the fraction of S is more than 0.5, otherwise ⌊S⌋     (S = service at exit)
benefit B = min(cap, days/divisor × salary_at_exit × N)                             (15/26, ₹20,00,000)
B = 0 for withdrawal or retirement when S < vesting_years (5); death is exempt from vesting

4. PUC: DBO and current service cost

The benefit is attributed to service in a straight line, so at each exit the accrued fraction is s / S. Then:

DBO = Σ_exits prob · B · (s / S) · v^t                    v = 1/(1+i)
CSC = Σ_exits prob · B · (min(1, t) / S) · v^t

min(1, t) is the part of the coming year's service that is actually rendered before the exit. It equals 0.5 for exits in year 0 and 1 for every later exit.

Worked example (hand-verified in the tests)

The employee is aged 56 with 8 years of service and retires at 58. Monthly salary is ₹26,000 with no escalation, so 15/26 × 26,000 = ₹15,000 per completed year. Withdrawal is 10% a year, mortality is switched off and i = 10%.

Exit t prob S N B s/S PV of accrued benefit
withdrawal 0.5 0.10 8.5 8 1,20,000 8/8.5 0.10 × 120000 × 0.941176 / 1.1^0.5 = 10,768.52
withdrawal 1.5 0.09 9.5 9 1,35,000 8/9.5 0.09 × 135000 × 0.842105 / 1.1^1.5 = 8,868.57
retirement 2.0 0.81 10.0 10 1,50,000 8/10 0.81 × 150000 × 0.8 / 1.21 = 80,330.58

DBO = 99,967.67. The withdrawal at t = 0.5 has exactly 0.5 years of extra service. That is not more than six months, so N = 8, not 9.

The current service cost replaces s/S with min(1,t)/S: 673.03 + 1,108.57 + 10,041.32 = 11,822.93.

5. Leave encashment

The accumulated balance L (capped at max_accumulation_days) is encashed on any exit, with no vesting. The balance runs down through availment at rate a per year:

DBO = Σ_exits prob · min(L, Lmax) · (1 − a)^t · salary_at_exit / divisor · v^t
CSC = Σ_exits prob · min(accrual · min(1, t), Lmax − L) · (1 − a)^max(0, t−1) · salary_at_exit / divisor · v^t

The accrued days are already fully earned, so no attribution fraction is applied to the DBO. The service cost values the days that will accrue in the coming year, limited by the headroom left under the cap. Leave encashment is an other long-term benefit, so all remeasurements go to profit or loss (Ind AS 19 para 156).

6. Duration and maturity profile

The expected cash flows are the accrued-basis expected payments prob · B · s/S for gratuity, or prob · leave value for leave, each placed at its exit time t.

duration = Σ t · CF_t · v^t / Σ CF_t · v^t        (Macaulay; the denominator equals the DBO)

The maturity profile sums undiscounted CF_t into policy years max(1, ⌈t⌉) for years 1 to 10, with a final bucket for everything after year 10.

7. Reconciliation and gain/loss attribution

The opening valuation uses the prior census and prior assumptions. The closing valuation uses the current census and current assumptions.

service cost = opening CSC
interest cost = i_prior × opening DBO
total actuarial (gain)/loss = closing DBO − (opening DBO + SC + IC − benefits paid) − past service cost

The closing census is then re-valued in steps. Each step undoes one group of assumption changes:

Step Valuation of the closing census with Difference attributed to
A current assumptions (closing DBO)
B current assumptions, prior benefit rules A − B = past service cost (plan amendment)
C B with prior discount and salary rates B − C = financial assumptions
D all prior assumptions C − D = demographic assumptions (mortality, attrition, retirement age)

Experience adjustments are whatever is left: total − financial − demographic. They capture the differences between what was expected and what actually happened, such as salary increases different from those assumed, more or fewer leavers than expected, and new joiners. The order of the steps matters, as it does in any sequential attribution. Here financial changes are measured at current demographics, which is the usual convention.

Plan assets:

interest income = i_prior × opening fair value
return excluding interest income = actual return − interest income
closing fair value = opening + contributions − benefits paid from fund + actual return

P&L and OCI (gratuity):

Leave: the remeasurement goes to P&L, and OCI is nil.

8. Sensitivity

The closing valuation is re-run with one assumption shifted at a time, by ±0.5% and ±1% absolute. For attrition, every band is shifted, with a floor at zero. The direction checks in the tests are:

In the example, the salary sensitivity is smaller than the discount-rate sensitivity. This is because many long-service employees reach the ₹20 lakh cap by retirement, and once the cap binds, salary growth no longer increases the benefit.

9. Mortality table (APPROXIMATION)

The built-in table is a compact approximation of IALM 2012-14 Ultimate. It is not the published table. It stores 15 anchor ages (15, 18, 20, 25, …, 80) with rounded q_x values and interpolates log-linearly between them. Ages outside 15–80 are clamped. This is enough for estimates and illustrations: before retirement, mortality decrements are small compared with attrition, so approximation errors in q_x move the DBO by far less than a 0.5% change in the discount rate. For a signed-off valuation, supply the full table:

mortality:
  custom_table: {18: 0.000874, 19: 0.000899, ...}   # every age you need
  scale: 1.0

Every disclosure note that uses the built-in table labels it "IALM 2012-14 Ultimate (compact approximation)".

10. Simplifications