Analytics Toolkit · Section 4.6
Additional metrics
Standard deviation, window TVaR, and the portfolio-level metrics: contribution to TVaR and marginal TVaR.
Beyond expected loss (EL), Value at Risk (VaR) and Tail Value at Risk (TVaR), and the two layer probabilities, reinsurance analytics uses several other metrics for risk profiling, contract pricing, and portfolio construction.
Standard deviation
Section titled “Standard deviation”Standard deviation is a measure of volatility around the mean:
We use the population formula (, not ). A model’s complete trial set is the probability space every metric in this chapter is defined on, each trial carrying probability ; the metrics describe that trial set and do not estimate the variance of a larger population from it, so the correction has nothing to correct. The model is in turn an approximation of the physical risk, and how well it represents that risk is model uncertainty, which the choice of divisor does not address. The demo tiers are the exception to the premise: both are subsamples of one 10,000-trial simulation, which is one more reason their numbers demonstrate the method and estimate nothing. They keep the formula so that the code matches what runs on a complete trial set.
Standard deviation captures how dispersed losses are around EL. It appears in simpler pricing models (e.g., the standard deviation premium principle adds a multiple of to EL to compute premium).1 It is less informative about tail behaviour than TVaR: two distributions with the same can have very different tails.
from caldera_re.aep import aep
from caldera_re.data import cedents
def standard_deviation(curve):
"""Population standard deviation of trial losses."""
return curve['loss'].std(ddof=0)
if __name__ == '__main__':
curve = aep(cedents.suncoast)
sd = standard_deviation(curve)
el = curve['loss'].mean()
print(f"EL: {el:.1f}M")
print(f"Std: {sd:.1f}M")
print(f"CV: {sd / el:.2f}") Standard deviation weighs every trial equally; window TVaR confines the average to one band of the tail.
Window TVaR
Section titled “Window TVaR”Standard TVaR captures the average severity of the entire tail beyond a single threshold. Window TVaR refines this by measuring the average loss within a bounded interval of the loss distribution, typically between two return periods or confidence levels.
Given two confidence levels , let and . The worst trials form the broader tail; the worst form the narrower, more extreme tail. Window TVaR is the mean of the trials between these two boundaries:
For example, Window TVaR(80%, 90%) averages the losses between the 1-in-5 and 1-in-10 return periods: the trials in the broader tail that are not in the extreme tail.
A finite trial set can place both boundaries at the same rank. On 20 trials, 91% and 94% both give one tail trial, so , the window holds no trial, and the quote does not exist. The code returns NaN, as VaR does at , rather than a loss of zero.
Window TVaR is especially useful for:
- Band-wise tail reporting: quoting the average loss between the 1-in-5 and 1-in-10 return periods, or between the 1-in-100 and 1-in-250, separately from the tail beyond the band.
- Differentiating frequency-driven from severity-driven risk: a window at short return periods is influenced by frequent, smaller losses, while a window deep in the tail captures catastrophic severity.
- Capital allocation: attributing risk capital to specific portions of the portfolio loss distribution rather than treating the entire tail as one block.
from caldera_re.aep import aep
from caldera_re.data import cedents
from caldera_re.report import fields
from caldera_re.utils import ep_index
def window_tvar(curve, alpha_low, alpha_high):
"""Compute Window TVaR between two confidence levels.
Returns the mean loss of trials in the tail band between
alpha_low and alpha_high (alpha_low < alpha_high).
The window captures trials that are in the broader alpha_low
tail but not in the narrower alpha_high tail — a specific segment
of the return period spectrum.
"""
if alpha_low >= alpha_high:
raise ValueError("alpha_low must be less than alpha_high")
N = len(curve)
k_low = ep_index(N, alpha_low)
k_high = ep_index(N, alpha_high)
if k_low == k_high:
return float('nan')
return curve.iloc[k_high:k_low]['loss'].mean()
if __name__ == '__main__':
from caldera_re.tvar import tvar
curve = aep(cedents.suncoast)
a_low, a_high = 0.80, 0.90
wt = window_tvar(curve, a_low, a_high)
k_low = ep_index(len(curve), a_low)
k_high = ep_index(len(curve), a_high)
window = curve.iloc[k_high:k_low]
rp_low = 1 / (1 - a_low)
rp_high = 1 / (1 - a_high)
print(f"Window TVaR({a_low:.0%}, {a_high:.0%})")
print(f" Return period band: {rp_low:.0f}-yr to {rp_high:.0f}-yr")
print(f" Trials in window (ranks {k_high + 1} to {k_low}):")
for _, row in window.iterrows():
print(f" Rank {row['rank']:.0f}: {row['loss']:.1f}M "
f"(RP = {row['rp']:.1f} yr)")
print(f" Window TVaR = {wt:.1f}M")
print()
print("For comparison:")
fields([(f"TVaR({a:.0%})", tvar(curve, a), f"full tail above {a:.0%}")
for a in (a_low, a_high)], indent=2, sep=' = ') A window describes one distribution on its own; the portfolio-level metrics relate one contract to the portfolio that holds it.
Portfolio-level metrics
Section titled “Portfolio-level metrics”When contracts combine into a portfolio, new questions arise: How much does a single contract contribute to overall tail risk? How should capital be allocated across contracts? Two metrics answer them, and they are not the same quantity. Contribution to TVaR (Co-TVaR) is a risk component: a contract’s share of the tail the portfolio already holds, and the shares add to the portfolio TVaR. Marginal TVaR is a risk delta: the portfolio TVaR with the contract minus the portfolio TVaR without it, which is the figure a decision to add the contract depends on. Financial perspectives derives the contribution-to-TVaR split for a single contract, and the portfolio analytics story puts the roll-up to work; allocating portfolio capital across contracts is (planned).
The next chapter, Financial Modelling, shows how contracts transform these distributions, turning a subject loss distribution into a gross loss distribution.
Footnotes
Section titled “Footnotes”-
Mary R. Hardy, “An Introduction to Risk Measures for Actuarial Applications”, Society of Actuaries study note, 2006 (the copy hosted by the CAS), §1. The standard deviation premium principle adds a multiple of the standard deviation to the mean, for some (Hardy writes the loading factor ; on this site is the confidence level), the loading being “related to the variability of the loss”; Gerber (1979) and Bühlmann (1970), which it cites, give the fuller catalogue of premium principles. ↩