Compute the Net Premium From a Mortality Table
Goal
You calculate a term insurance net premium directly from a life table and an assumed interest rate, add the expense loading to build the gross premium, and then confirm by numbers how much the premium moves when the assumed interest rate changes.
Why it matters
A premium is not "a value the company sets" but a value computed from three assumptions. How many die or are injured (the risk rate), how much will be earned by investing the money received (the assumed interest rate), and how much it costs to sell and maintain a contract (expenses). These three are called the assumed risk rate, the assumed interest rate, and the assumed expense ratio, and the product definition in an insurance product system is ultimately a table of these three assumptions.
The net premium comes from the first two assumptions alone. You read from the life table when and with what probability the sum insured will be paid, and discounting it at the assumed interest rate into present value gives the single-premium net premium. Dividing that by "what is paid every year while alive" gives the annual net premium. Adding expenses to it gives the gross premium the customer actually pays.
If you know this structure, you can hear what people in the field say. "If we lower the assumed interest rate by 0.25 percentage points, the premium goes up" means the discount rate falls so the present value grows, and "this product has a high share of expense loading" means the expense assumption is large. In a product system, if a premium is off by 1 won, the answer is which assumption was rounded in which place and how.
Rules of this lab
- The life table is
qxfor ages 30–80, withl30 = 100000.l(x+1) = l(x) × (1 − q(x)),d(x) = l(x) × q(x). Continue calculatinglxwith unrounded values, and write it in the file to two decimal places. - Death is assumed to occur at the end of the year. The single-premium net premium rate for an n-year term insurance (per 1 won of sum insured)
A = Σ(t=0..n−1) v^(t+1) × d(x+t) ÷ l(x),v = 1 ÷ (1 + i). - The annuity-due present value
ä = Σ(t=0..n−1) v^t × l(x+t) ÷ l(x). Annual net premium = sum insured × A ÷ ä, rounded to the nearest won. Monthly is annual ÷ 12, rounded (a simplification for this lab). - In the step 3 and 4 files you write
Aandäto six decimal places, but thenspof step 3 and the calculations of steps 5–7 use the unroundedAandä. If you read the six-digit values back from the file and divide, the result is off by a few won, and grading checks down to 1 won. - Gross premium
G = (P + α × S ÷ ä) ÷ (1 − β − γ).Pis the annual net premium,Sis the sum insured, andαthe acquisition expense rate,βthe maintenance expense rate, andγthe collection expense rate are inparams.csv. Rounded to the nearest won. - Write ratios to six decimal places.
Steps
- Save the generator in the example on the right as
/root/ins/make_premium.pyand run it withpython3 make_premium.py.lifetable.csv(51 rows),params.csv, andquotes.csv(5 quotes) are created. - In
/root/ins/lx.csv, write 51 lines for ages 30–80 with the headerage,qx,lx,dx. - Write the single-premium net premium for the 5 quotes in
/root/ins/nsp.csvwith the headerquote_id,age,term,sum_assured,nsp_rate,nsp.nsp_rateis A, andnspis the sum insured × A (the unrounded value), rounded to the nearest won. - Write the annuity-due present value for the 5 quotes in
/root/ins/annuity.csvwith the headerquote_id,annuity_due. - Write the annual and monthly net premiums in
/root/ins/net_premium.csvwith the headerquote_id,net_annual,net_monthly. Divide by the unroundedAandä, not the six-digit values in the file. - Write the gross premiums in
/root/ins/gross_premium.csvwith the headerquote_id,net_annual,loading,gross_annual,gross_monthly.loadingis the gross premium minus the net premium. - Calculate
Q1's annual net premium at assumed interest rates of 1.5%, 2.5%, and 3.5%, and write four lines in/root/ins/sensitivity.txt:net_at_1.5=,net_at_2.5=,net_at_3.5=, anddelta_pct=.delta_pctis how many % larger the 1.5% premium is than the 3.5% premium, written to one decimal place. - In
/root/ins/quote_report.md, write a quote explanation in four sections:## Premium Breakdown,## Calculation Basis,## Interest Rate Sensitivity, and## Limitations. 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
- If you wrap the table built in step 2 in a function, steps 3–7 all use that function. Carry
lxaround as a dictionary. - Python's
round()sends .5 toward the even side. For rounding below one won useint(x + 0.5). - Common mistake 1: using
tas the discount exponent for the death benefit. It ist+1, because death is assumed at the end of the year. - Common mistake 2: computing the next year from
lxrounded to two decimal places. Round only in the file. - Common mistake 3: adding the expense loading as a % of the net premium. The maintenance and collection expenses are ratios of the gross premium, so it is solved by division.
Create the life table and quote requests
Save the generator in the example on the right as /root/ins/make_premium.py and run it with python3 make_premium.py. lifetable.csv (51 rows), params.csv, and quotes.csv (5 quotes) are created.
Save the generator in the lab instructions as /root/ins/make_premium.py and run it with python3. If you edit it by hand, all the numbers in the later steps go off.
Build the number of survivors from the mortality rates
In /root/ins/lx.csv, write 51 lines for ages 30–80 with the header age,qx,lx,dx.
Start from l30 = 100000 and apply l(x+1) = l(x) × (1 − q(x)) and d(x) = l(x) × q(x). Continue the calculation in floating point and write with %.2f only in the file.
Find the single-premium net premium
Write the single-premium net premium for the 5 quotes in /root/ins/nsp.csv with the header quote_id,age,term,sum_assured,nsp_rate,nsp. nsp_rate is A, and nsp is the sum insured × A (the unrounded value), rounded to the nearest won.
A = Σ(t=0..n−1) v^(t+1) × l(x+t) × q(x+t) ÷ l(x), v = 1/1.025. Death is assumed at the end of the year, so the exponent is t+1. nsp = int(S × A + 0.5).
Find the value of paying the premium in installments
Write the annuity-due present value for the 5 quotes in /root/ins/annuity.csv with the header quote_id,annuity_due.
ä = Σ(t=0..n−1) v^t × l(x+t) ÷ l(x). It is annuity-due, so the first term is v^0 = 1.
Find the annual and monthly net premiums
Write the annual and monthly net premiums in /root/ins/net_premium.csv with the header quote_id,net_annual,net_monthly. Divide by the unrounded A and ä, not the six-digit values in the file.
net_annual = int(S × A ÷ ä + 0.5), net_monthly = int(net_annual ÷ 12 + 0.5). Divide using the floating-point values, not the six-digit values in the file.
Add expenses to build the gross premium
Write the gross premiums in /root/ins/gross_premium.csv with the header quote_id,net_annual,loading,gross_annual,gross_monthly. loading is the gross premium minus the net premium.
G = (P + 0.01 × S ÷ ä) ÷ (1 − 0.05 − 0.03), rounded to the nearest won. For P, use the rounded annual net premium from step 5 as it is, and loading = G − P.
Shake the assumed interest rate and watch the premium change
Calculate Q1's annual net premium at assumed interest rates of 1.5%, 2.5%, and 3.5%, and write four lines in /root/ins/sensitivity.txt: net_at_1.5=, net_at_2.5=, net_at_3.5=, and delta_pct=. delta_pct is how many % larger the 1.5% premium is than the 3.5% premium, written to one decimal place.
Run the calculation from step 5 three times with i = 0.015, 0.025, and 0.035. delta_pct = (net_1.5 − net_3.5) ÷ net_3.5 × 100, as %.1f.
Write the quote explanation
In /root/ins/quote_report.md, write a quote explanation in four sections: ## Premium Breakdown, ## Calculation Basis, ## Interest Rate Sensitivity, and ## Limitations. 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 Premium Breakdown section, write Q1's gross premium, net premium, and loading; in the Calculation Basis section, the assumed interest rate of 2.5%; and in the Sensitivity section, delta_pct, all as numbers.