Experience Study vs Prescribed Table Selection Under VM-20

Under VM-20 Section 9 an actuary must decide how much of a block’s own mortality experience to trust and how much to defer to a prescribed industry table, then blend the two by a credibility factor and grade to the industry basis once the data thins. This page compares the company-experience route against straight prescribed-table selection and shows how to compute the blend in Python, extending the Mortality & Morbidity Rate Validation discipline within Assumption Validation & Rule Engine Design.

The Problem

VM-20 does not let a life insurer simply adopt its own observed mortality, nor does it force everyone onto a single table. Section 9 requires the modeled reserve mortality to start from company experience to the extent it is credible, blend the remainder toward a prescribed industry basic table, grade fully to that table after a limited sufficient-data period, and load a prescribed margin for adverse deviation on top. A block with millions of life-years of clean claims experience earns a high credibility factor and rides mostly on its own numbers; a newly issued or reinsured block with a few dozen deaths gets pulled almost entirely onto the 2015 Valuation Basic Table. Choosing between “use our study” and “use the prescribed table” is therefore a false dichotomy — VM-20 mandates a weighted answer whose weight is dictated by a credibility measure, and getting that weight, the grading path, and the margin stack right is what separates a defensible valuation from a finding. Straight table selection is only correct at the extreme where credibility is zero.

Two Routes and the Credibility Bridge

The company-experience route asks: how many deaths has this block actually produced, and is that enough to believe the experience rate over the industry rate? VM-20 permits the Limited Fluctuation method, whose credibility factor for mortality is

Z=min ⁣(1,  Dobs1082),Z = \min\!\left(1,\; \sqrt{\frac{D_{\text{obs}}}{1082}}\right),

where DobsD_{\text{obs}} is the number of observed claims and 1082 is the full-credibility standard for 90% confidence within 5%. VM-20 also permits the Bühlmann (greatest-accuracy) method, where

Z=nn+k,k=EPVVHM,Z = \frac{n}{n + k}, \qquad k = \frac{\text{EPV}}{\text{VHM}},

with kk the ratio of the expected process variance to the variance of the hypothetical means. Either way the blended rate is a convex combination of the company and industry rates,

qxblend=Zqxexp+(1Z)qxind,q_x^{\text{blend}} = Z\, q_x^{\text{exp}} + (1 - Z)\, q_x^{\text{ind}},

and the prescribed-table route is nothing more than this same formula evaluated at Z=0Z = 0. That is the conceptual bridge: prescribed selection is not a rival method but the zero-credibility boundary of the experience method.

A Minimal Working Example

The snippet blends a company experience table with the prescribed industry table by a Limited Fluctuation credibility factor, grades toward the industry basis after the sufficient-data period, and applies the margin for adverse deviation. It runs on NumPy alone:

import numpy as np

FULL_CREDIBILITY_DEATHS = 1082  # 90% confidence within 5%, VM-20 mortality standard


def limited_fluctuation_z(observed_deaths, full_standard=FULL_CREDIBILITY_DEATHS):
    return float(min(1.0, np.sqrt(observed_deaths / full_standard)))


def blend_mortality(q_experience, q_industry, z):
    q_experience = np.asarray(q_experience, dtype=float)
    q_industry = np.asarray(q_industry, dtype=float)
    return z * q_experience + (1.0 - z) * q_industry


def grade_to_industry(q_blended, q_industry, projection_year, grade_period):
    # After the sufficient-data period, grade linearly to 100% of the table.
    weight_on_industry = min(1.0, max(0, projection_year) / grade_period)
    q_industry = np.asarray(q_industry, dtype=float)
    return (1.0 - weight_on_industry) * q_blended + weight_on_industry * q_industry


def apply_mfad(q_rate, mfad):
    # Prescribed margin for adverse deviation, loaded once on the final rate.
    return np.asarray(q_rate, dtype=float) * (1.0 + mfad)


if __name__ == "__main__":
    ages = np.array([45, 46, 47, 48, 49])
    q_experience = np.array([0.00121, 0.00134, 0.00149, 0.00166, 0.00185])
    q_industry = np.array([0.00150, 0.00164, 0.00181, 0.00200, 0.00222])  # 2015 VBT basis

    observed_deaths = 620
    z = limited_fluctuation_z(observed_deaths)
    q_blend = blend_mortality(q_experience, q_industry, z)
    q_graded = grade_to_industry(q_blend, q_industry, projection_year=3, grade_period=10)
    q_valuation = apply_mfad(q_graded, mfad=0.08)

    print(f"Credibility Z   = {z:.3f}")
    print(f"Blended q_x     = {np.round(q_blend, 5)}")
    print(f"Graded q_x      = {np.round(q_graded, 5)}")
    print(f"Valuation q_x   = {np.round(q_valuation, 5)}")
Blending company experience and the prescribed table into VM-20 valuation mortality Company experience mortality and the prescribed industry table both feed a credibility blend weighted by Z, which grades toward the industry table over the sufficient-data period before a prescribed margin for adverse deviation yields the prudent valuation mortality. Company experience observed deaths, own q_x Prescribed table 2015 VBT / 2017 CSO Credibility blend Z q_exp + (1-Z) q_ind Grade to industry after sufficient-data yrs Valuation q_x + prescribed MfAD
The VM-20 Section 9 path: credibility-weighted blend, grading to the prescribed table, then the margin.

How It Works, Block by Block

limited_fluctuation_z sizes trust by the square root of deaths. The credibility factor climbs with observed claims but flattens as it approaches full credibility at 1082 deaths, so a block with 620 deaths earns roughly 0.76 — meaningful weight on its own experience, but far from complete. The min(1, ...) cap is what stops an unusually large block from claiming more than 100% credibility, and it is the same cap that makes the formula degrade gracefully toward pure prescribed selection as deaths fall toward zero.

blend_mortality is the convex combination that unifies both routes. Multiplying the company rate by ZZ and the industry rate by 1Z1 - Z guarantees the blended rate always lies between the two, never outside them, so no age can end up more optimistic than the company study or more conservative than the table. Because the operation is vectorised over the age array, the whole select-and-ultimate structure blends in one expression.

grade_to_industry enforces the sufficient-data horizon. VM-20 only lets company experience carry the projection for a limited number of years; beyond that the assumption must move to the industry basis, because there is no credible evidence the block will keep diverging from the table decades out. Linear grading over grade_period years is the standard smooth transition, and anchoring it to the projection year keeps the early durations close to experience while the tail converges on the prescribed table.

apply_mfad loads the prescribed margin exactly once. The margin for adverse deviation is a deliberate conservatism VM-20 requires on top of the best-estimate blend, and it is loaded on the final graded rate rather than baked into any intermediate step. Applying it once, at the end, is what keeps the margin auditable and prevents the double counting discussed below. The resulting valuation mortality is what feeds the reserve engine reconciled under the NAIC VM-20 Compliance Frameworks.

Edge Cases and Production Hardening

Thin data collapses the choice to prescribed selection — as intended. With only a handful of deaths, ZZ falls near zero and the blend is almost entirely the industry table, which is exactly the regulatory intent, but a naive study can still emit a wildly volatile experience rate that leaks through even a small ZZ. Guard the experience input so an under-exposed cell cannot contribute a nonsense rate:

import numpy as np


def guard_experience(q_experience, exposure, min_exposure=200, fallback=np.nan):
    q_experience = np.asarray(q_experience, dtype=float)
    exposure = np.asarray(exposure, dtype=float)
    # Below the exposure floor the cell's own rate is not trustworthy at all.
    return np.where(exposure >= min_exposure, q_experience, fallback)

Where the guard returns nan, fall back to Z=0Z = 0 for that cell so the industry table stands in cleanly rather than a spurious experience figure being partially trusted.

Grading discontinuities create a visible kink in the reserve run. If the blend rides on experience through the sufficient-data period and then the grading only begins the year after, the mortality curve jumps at the boundary and the reserve moves with it, which examiners notice. Begin the linear grade at the end of the sufficient-data period and confirm the first graded year equals the blended rate, so the two segments meet continuously instead of stepping.

MfAD stacking silently doubles the conservatism. The most common error is loading a company-specific margin during the experience study and then loading the prescribed VM-20 margin again on the blended rate, so the final mortality carries two margins where the Valuation Manual intends one. Strip every margin out of the experience and industry inputs, blend and grade on a best-estimate basis, and apply the single prescribed MfAD last — the ordering the example follows deliberately. Validating that no hidden margin survives into the inputs is the job of the Automating Mortality Table Validation Against Industry Standards checks.

Compliance Note

VM-20 Section 9 is explicit that the mortality assumption must reflect company experience to the extent credible, grade to a prescribed industry table after the sufficient-data period, and carry a prescribed margin — and VM-31 obliges the appointed actuary to document the credibility method, the grading period, and the margin so the whole path can be reconstructed. ASOP No. 25 (Credibility Procedures) governs the choice between Limited Fluctuation and Bühlmann and requires that choice to be appropriate and disclosed. Recording ZZ, the observed death count, the grading horizon, and the MfAD alongside each valuation is what lets a reviewer confirm the blend was neither too optimistic on thin data nor doubly margined, and it feeds the same assumption-governance evidence the wider Mortality & Morbidity Rate Validation work maintains.

Frequently Asked Questions

When can I use my own experience instead of the prescribed table under VM-20?

You use company experience to the extent it is credible, measured by a VM-20-permitted method such as Limited Fluctuation or Bühlmann, and defer to the prescribed industry table for the remaining weight. Full credibility for mortality is reached at 1082 observed deaths, and anything less produces a partial credibility factor that blends the two rates rather than choosing one outright.

What is the difference between Limited Fluctuation and Bühlmann credibility?

Limited Fluctuation sets the credibility factor from the square root of observed deaths against a full-credibility standard, so it depends only on volume. Bühlmann derives the factor from the ratio of expected process variance to the variance of the hypothetical means, so it also reflects how much genuine heterogeneity exists between blocks. VM-20 permits either, provided the choice is documented and appropriate to the data.

Why must company mortality grade to the industry table?

Company experience can only support the assumption for a limited sufficient-data period, because there is no credible evidence a block will keep diverging from the industry basis decades into the projection. VM-20 therefore requires the assumption to grade linearly to the prescribed table after that period, and starting the grade exactly at the boundary avoids a discontinuous jump in the reserve.

How do I avoid double-counting the margin for adverse deviation?

Strip any margin out of both the experience and the industry inputs, perform the credibility blend and grading on a best-estimate basis, and apply the single prescribed VM-20 margin only to the final graded rate. Loading a study-specific margin and then the prescribed margin on top stacks two conservatisms where the Valuation Manual intends one.

Up a level: Mortality & Morbidity Rate Validation · Assumption Validation & Rule Engine Design


Regulatory references: NAIC Valuation Manual VM-20 Section 9 (Mortality) and VM-31 (PBR Actuarial Report); Actuarial Standards Board ASOP No. 25 (Credibility Procedures).