Skip to content
Property-cat reinsurance analytics for software engineers

Analytics Toolkit · Section 4.2

Value at Risk (VaR)

Value at Risk: the loss at a stated exceedance probability on the EP curve, as an observed trial loss, with its conventions and code.

Expected loss (EL) cannot distinguish a portfolio with steady losses from one with catastrophic losses. Value at Risk (VaR) addresses this by putting a number on the tail: the extreme right end of the loss distribution, where the rare but severe outcomes are. VaR at confidence α\alpha is the loss at exceedance probability (1−α)(1-\alpha) on the exceedance probability (EP) curve: the loss reached or exceeded in only (1−α)(1-\alpha) of trials. At α=0.90\alpha = 0.90, that is the 1-in-10 loss.

Unless a figure says otherwise, the numbers on this page follow the assumptions of the Metrics overview: the aggregate exceedance probability (AEP) basis, results at 100%, and the 20-trial demo tier. The overview also fixes what α\alpha means.

For NN equiprobable trials sorted in descending order, the rr-th largest loss has exceedance probability r/Nr/N. VaR at confidence α\alpha is the loss at exceedance probability (1−α)(1-\alpha):

VaRα=L(k)where k=⌊(1−α)⋅N⌋\text{VaR}_\alpha = L_{(k)} \quad \text{where } k = \lfloor (1-\alpha) \cdot N \rfloor

where L(r)L_{(r)} denotes the rr-th largest loss. The top kk trials, those at or above VaR, form the tail used for Tail Value at Risk (TVaR).

This site’s convention: VaR is always an observed trial loss, the kk-th largest, never a value interpolated between two ranks. Interpolating quantile definitions exist and are the default in most statistics libraries; they return a loss no trial produced. The formula leaves one more case open. When (1−α)⋅N<1(1-\alpha) \cdot N < 1, which means α\alpha above 1−1/N1 - 1/N and on 20 trials every quote past 1-in-20, k=0k = 0: no trial sits in the tail, the trial set cannot resolve that return period, and the quote does not exist. The code returns NaN rather than substituting the maximum, and the demo-scale report prints the absence in words.

For continuous distributions, VaR is equivalent to the α\alpha-quantile of the cumulative distribution function: inf⁡{x:P(L≤x)≥α}\inf\{x : P(L \leq x) \geq \alpha\}. For discrete trial sets, different quantile conventions can differ by one rank position. This site uses the EP curve convention throughout: the descending-sorted losses already form an EP curve, and VaR is the loss at a single position on it.

VaR tells you: “This loss is reached or exceeded in only (1−α)(1-\alpha) of trials.” Regulators use VaR to set minimum capital requirements: Solvency II requires capital to cover the 1-in-200 year loss (VaR0.995\text{VaR}_{0.995}).1

caldera_re/var.py Python
from caldera_re.aep import aep
from caldera_re.data import cedents
from caldera_re.utils import ep_index


def var(curve, alpha):
    """Compute VaR at confidence level alpha from an EP curve.

    The EP curve is sorted descending by loss (rank 1 = largest).
    VaR at alpha is the k-th largest loss, where k = ep_index(N, alpha)
    is the number of tail trials. In 0-based indexing: losses[k-1].

    VaR is always an observed trial loss -- no interpolation between
    ranks. k = 0 (alpha above 1 - 1/N) means no trial sits in the tail:
    the trial set cannot resolve that return period and the quote does
    not exist. NaN keeps that visible; falling through to losses[-1]
    would silently report the *smallest* loss.
    """
    N = len(curve)
    k = ep_index(N, alpha)
    if k < 1:
        return float('nan')
    return curve.iloc[k - 1]['loss']


if __name__ == '__main__':
    curve = aep(cedents.suncoast)

    for alpha in [0.80, 0.90, 0.95]:
        v = var(curve, alpha)
        ep = 1 - alpha
        rp = 1 / ep
        print(f"VaR({alpha:.0%}) = {v:.1f}M")
        print(f"  Reached or exceeded in {ep:.0%} of trials "
              f"(1-in-{rp:.0f} return period)")
        print()
Confidence level (α): 90% — 2 tail trials (worst 10%)
VaR(90%) = 489.1M Tail trials (above VaR)

VaR reads one rank and ignores the ranks above it; TVaR averages them.

  1. EIOPA, “Calculation of the Solvency Capital Requirement”, Solvency II Single Rulebook (Directive 2009/138/EC, Article 101). The Solvency Capital Requirement “shall correspond to the Value-at-Risk of the basic own funds of an insurance or reinsurance undertaking subject to a confidence level of 99,5 % over a one-year period.” ↩ ↩2

  2. Basel Committee on Banking Supervision, “Fundamental review of the trading book: A revised market risk framework”, consultative document, October 2013: “The proposals involve a shift in the measure of risk from value-at-risk to expected shortfall so as to better capture ‘tail risk’ …” The final standard, “Minimum capital requirements for market risk”, January 2019, carries the shift through: its internal models approach “relies upon the use of expected shortfall models”. Both are banking rules, and insurance regimes are split: the Swiss Solvency Test has measured capital with expected shortfall since 2006, while Solvency II calibrates to VaR and the IAIS adopted its Insurance Capital Standard in December 2024 on a one-year 99.5% VaR. ↩

  3. Federal Office of Private Insurance, “Technical document on the Swiss Solvency Test”, 2006, §2.4. The SST’s risk measure is the expected shortfall, which the document treats as synonymous with tail value at risk, and target capital “at a certainty level of 99%” is the average of the 1% largest one-year reductions in risk-bearing capital, plus a market value margin. ↩