Reserves, IFRS 17, and the Solvency Pipeline
Goal
You calculate the policy reserves of in-force contracts with the assumptions at the time of enrollment, revalue the same contracts at the current discount rate to pull out IFRS 17's best estimate liability, risk adjustment, and contractual service margin, and then build even a simplified solvency ratio from company figures in a single pipeline.
Why it matters
An insurer keeps promises of decades from now with the premiums it receives today. So the core question of accounting is "how much to set aside now for money to be paid in the future," and the answer is the policy reserve. The reserve of a term insurance is the present value of benefits to be paid in the future minus the present value of net premiums to be received in the future. It is small early in the contract and grows later as the risk increases.
IFRS 17 demands a different answer to the same question. It evaluates liabilities not with the assumptions at enrollment but with current assumptions (the best estimate liability, BEL), adds compensation for uncertainty (risk adjustment, RA), and books the unrealized profit that still remains as a liability called the contractual service margin (CSM), then recognizes it as profit in portions over the contract period. It is a device that prevents profit from being recognized early, and a contract expected to lose money is booked immediately as a loss.
The solvency regime (K-ICS) looks at the company as a whole. Insurance, market, and credit risks are each converted to capital requirements and combined, and it looks at what % of that requirement the available capital is. These three layers — cost-basis reserves, current-value liabilities, and solvency — are the backbone of an insurer's closing system, and the same contract shows up with different numbers in the three layers.
Rules of this lab
- The actuarial functions are the same as in Module 1.
A(x, n, i)is the single-premium net premium rate of an n-year term insurance, andä(x, n, i)is the n-year annuity-due present value. At elapsed year t, the age isissue_age + elapsedand the remaining term isterm − elapsed. - Policy reserve (cost basis)
V = S × A(x+t, n−t, 2.5%) − P × ä(x+t, n−t, 2.5%), rounded to the nearest won.Pis the annual net premium ininforce.csv. Multiply by the unroundedAandä, not the six-digit values you write in the file (grading checks down to 1 won). - Recursion check:
(V_t + P) × (1 + i) = q(x+t) × S + (1 − q(x+t)) × V_(t+1).V_(t+1)is the reserve one year later, calculated with the same formula after raising the age by one and reducing the remaining term by one, and theV_nat maturity is 0. - IFRS 17 is calculated at the initial recognition point (the enrollment point). Best estimate liability
BEL = S × A(x, n, 3.0%) − P × ä(x, n, 3.0%)(the enrollment age and the full term, without subtracting the elapsed time). Risk adjustmentRA = PV(benefits) × 0.5%(0.5% of the present value of benefits, thepv_claimsof step 5). Fulfillment cash flowsFCF = BEL + RA. IfFCF < 0, thenCSM = −FCFand the loss component is 0. IfFCF ≥ 0, thenCSM = 0and the loss component =FCF. (Omitting the roll-forward of later periods is a simplification for this lab.) - Solvency required capital
= √(I² + M² + C² + 2ρ(IM + IC + MC)) + O, whereI·M·C·Oare the insurance, market, credit, and operational risks incapital.csvandρiscorrelation. Rounded to an integer in units of 100 million won. Ratio = available capital ÷ required capital × 100, to one decimal place. - Write actuarial ratios such as
Aandannuityto six decimal places and amounts as integers. Only the solvency ratioratio_pctis written to one decimal place. - The total lines (
total_reserve,total_csm,total_loss_component) are the sums of the columns you wrote, each rounded per contract.
Steps
- Save the generator in the example on the right as
/root/ins/make_reserve.pyand run it withpython3 make_reserve.py.lifetable.csv,inforce.csv(5 contracts),params.csv, andcapital.csvare created. Also save the actuarial function file/root/ins/act.py, which later steps use, as in the example on the right — it containsterm_insurance(qx, lx, x, n, i)andannuity_due(qx, lx, x, n, i). - Write the current-point reserve of
P001in/root/ins/reserve_P001.txtin three lines:A=,annuity=, andreserve=. - Write all 5 contracts in
/root/ins/reserves.csvwith the headerpolicy_no,age_now,remaining,A,annuity,reserve, and write one line,total_reserve=(the sum of thereservecolumn), in/root/ins/reserves.txt. - Write the recursion check in
/root/ins/recursion_check.csvwith the headerpolicy_no,v_next,lhs,rhs,diff.v_nextis the reserve one year later,V_(t+1)(0 at maturity);v_next,lhs, andrhsare rounded to integers, anddiffislhs − rhs. - Write
/root/ins/bel.csv, applying the current discount rate at the enrollment point, with the headerpolicy_no,pv_claims,pv_premiums,bel. - Write
/root/ins/csm.csvwith the headerpolicy_no,bel,ra,fcf,csm,loss_component, and write two lines (the sum of each column) in/root/ins/csm.txt:total_csm=andtotal_loss_component=. - Write four lines in
/root/ins/kics.txt:required_capital=,available_capital=,ratio_pct=, andmeets_100=.ratio_pcthas one decimal place, andmeets_100isYESorNO. - In
/root/ins/valuation_report.md, write a closing memo in four sections:## Policy Reserves,## IFRS17 Summary,## Solvency, and## Data and Regulatory Notes. The section titles can be the English ones or titles with the same meaning in Korean, Japanese, or Chinese, and you can also write both, one in parentheses.
Notes
- In step 1 you save the actuarial functions to
/root/ins/act.pyas in the example on the right (the same file as in Module 1). This lab starts a new Pod, so the file from Module 1 is no longer there. - The recursion check verifies something only when you calculate
V_(t+1)separately withAandä(if you solve the recursion formula backward,diffis always 0). Calculated that way, ifdiffis close to 0 (±2 won), the reserve calculation is correct, and if it is far off, suspect the discount exponent ofA(t+1) or the age shift. - Common mistake 1: when calculating BEL, recomputing the net premium
Pat the current rate too, or computing with the age after subtracting the elapsed time.Pis a value fixed in the contract, and initial recognition is at the enrollment point. - Common mistake 2: putting operational risk inside the sum of squares in the required capital. In this lab it is added outside.
- Common mistake 3: "fixing" the reserve of
P005(0 years elapsed) because it is not exactly 0. You roundedPto the won, so a few won remain.
Create the in-force contracts and assumptions
Save the generator in the example on the right as /root/ins/make_reserve.py and run it with python3 make_reserve.py. lifetable.csv, inforce.csv (5 contracts), params.csv, and capital.csv are created. Also save the actuarial function file /root/ins/act.py, which later steps use, as in the example on the right — it contains term_insurance(qx, lx, x, n, i) and annuity_due(qx, lx, x, n, i).
Save the generator in the lab instructions as /root/ins/make_reserve.py and run it with python3. Also save the actuarial functions in the example on the right as /root/ins/act.py — the grader imports the two functions term_insurance(qx, lx, x, n, i) and annuity_due(qx, lx, x, n, i) to check their values (this lab starts a new Pod, so the file from Module 1 is no longer there).
Calculate the reserve of one contract
Write the current-point reserve of P001 in /root/ins/reserve_P001.txt in three lines: A=, annuity=, and reserve=.
Age = 35 + 5 = 40, remaining term = 20 − 5 = 15. Find A(40, 15, 2.5%) and ä(40, 15, 2.5%), then reserve = int(S × A − P × ä + 0.5). P is 198386 in inforce.csv.
Pull out the reserves for all in-force contracts
Write all 5 contracts in /root/ins/reserves.csv with the header policy_no,age_now,remaining,A,annuity,reserve, and write one line, total_reserve= (the sum of the reserve column), in /root/ins/reserves.txt.
Repeat step 2 over the five lines of inforce.csv and sum the reserve. age_now = issue_age + elapsed, remaining = term − elapsed.
Verify the reserves with the recursion formula
Write the recursion check in /root/ins/recursion_check.csv with the header policy_no,v_next,lhs,rhs,diff. v_next is the reserve one year later, V_(t+1) (0 at maturity); v_next, lhs, and rhs are rounded to integers, and diff is lhs − rhs.
V(t+1) is calculated with the same formula after moving the age forward by one and reducing the remaining term by one (0 at maturity). lhs = (V_t + P) × 1.025, rhs = q(x+t) × S + (1 − q(x+t)) × V_(t+1). lhs and rhs must each be within ±2 won of the true value, and diff ends up near 0. In the v_next column, write the V_(t+1) you put into rhs, rounded to the nearest won.
Find the best estimate liability at the current discount rate
Write /root/ins/bel.csv, applying the current discount rate at the enrollment point, with the header policy_no,pv_claims,pv_premiums,bel.
It is the enrollment point, so use issue_age and term as they are (without subtracting the elapsed time), and the rate is current_rate (0.030) in params.csv. pv_claims = int(S × A + 0.5), pv_premiums = int(P × ä + 0.5), and bel is the difference between the two. Use P as it is.
Split into risk adjustment and contractual service margin
Write /root/ins/csm.csv with the header policy_no,bel,ra,fcf,csm,loss_component, and write two lines (the sum of each column) in /root/ins/csm.txt: total_csm= and total_loss_component=.
ra = int(pv_claims × 0.005 + 0.5), fcf = bel + ra. If fcf < 0, csm = −fcf and loss_component = 0; otherwise, csm = 0 and loss_component = fcf. Read the step 5 file and calculate.
Calculate the solvency ratio
Write four lines in /root/ins/kics.txt: required_capital=, available_capital=, ratio_pct=, and meets_100=. ratio_pct has one decimal place, and meets_100 is YES or NO.
required = round(√(I² + M² + C² + 2 × 0.25 × (IM + IC + MC)) + O), and ratio = available ÷ required × 100 as %.1f. The result must be smaller than the simple sum (6600).
Write the closing memo
In /root/ins/valuation_report.md, write a closing memo in four sections: ## Policy Reserves, ## IFRS17 Summary, ## Solvency, and ## Data and Regulatory Notes. The section titles can be the English ones or titles with the same meaning in Korean, Japanese, or Chinese, and you can also write both, one in parentheses.
Use the four section titles exactly as given, either the English titles or titles with the same meaning in Korean, Japanese, or Chinese. In the policy reserves section, write the total; in the IFRS17 section, the CSM (contractual service margin) total on the same line as the word "CSM" and the current discount rate of 3.0% on the same line as the word "discount"; in the solvency section, the ratio; and in the cautions section, the matter of sensitive data.