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:
- age
y = ⌊x + k⌋ f = min(1, n − k)is the fraction of the year before retirement (a final partial year scales the rates byf)- independent rates
qd = q^d_y · fandqw = q^w_y · f - dependent probabilities, assuming uniform distribution of each decrement over the year (UDD):
qd' = qd · (1 − qw/2)
qw' = qw · (1 − qd/2)
- in-service exits occur mid-year, at
t = k + f/2 - survivorship:
ₖ₊₁p = ₖp · (1 − qd' − qw')
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):
- P&L = service cost + past service cost + (interest cost − interest income)
- OCI = actuarial (gain)/loss − return excluding interest income
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:
- a higher discount rate lowers the DBO
- a higher salary escalation raises it
- attrition can move it either way, because higher attrition brings payments forward but also forfeits unvested benefits
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
- Benefits are attributed in a straight line even when the ₹20 lakh cap binds. Ind AS 19 para 73 would end attribution at the point where further service stops adding material benefit.
- Interest is not computed on mid-year cash flows.
- Disability and early retirement are not separate decrements.