3.5 — Extreme Value Theory: GEV, Block Maxima, POT, Extreme VaR

Chapter 3 · Reshaping Statistics

Prof. Xuhu Wan

Section 3.5 · Chapter 3 · Learning Statistics with Python

Extreme Value Theory: GEV, Block Maxima, POT, Extreme VaR

Reshaping Statistics

Prof. Xuhu Wan

ISOM, HKUST Business School · 2026 Edition

Extreme Value Theory: GEV, Block Maxima, POT, Extreme VaR

Averages have the central limit theorem; maxima have Fisher–Tippett–Gnedenko. You will first see that matching mean and variance does not match the tail, then collect the worst day of every 20-trading-day block on the Dow (1985–1990, so Black Monday is in the sample), fit a GEV by maximum likelihood, check it with a Q-Q plot, score each block’s rarity, and read off the extreme VaR — the highest pain threshold.

Same mean, same sd — same tail?

Draw 4 309 Normal returns with Apple’s mean and standard deviation (seed 71). They match on the first two moments. Predict the 0.1 % quantile comparison.

With mean and sd matched, Apple’s 0.1 % quantile versus the Normal’s is…

  • Identical (same sd ⇒ same tail)
  • Substantially larger in magnitude (~1.8× here)
  • Smaller
  • Positive

Same mean, same sd — and a 0.1 % quantile of −10.5 % against −5.8 %, a 1 % CVaR of −7.8 % against −5.1 %, and 25 days beyond four standard deviations where the Normal has none. Variance does not measure tail risk. Two portfolios with identical Sharpe ratios can have wildly different blow-up probabilities.

The Fisher–Tippett–Gnedenko theorem

If the standardised maximum \(M_n\) of \(n\) i.i.d. draws converges at all, it converges to the GEV family:

\[F(s) = \begin{cases} \exp\!\big(-e^{-s}\big) & \xi = 0 \\[4pt] \exp\!\big(-(1 + \xi s)^{-1/\xi}\big) & \xi \ne 0 \end{cases} \qquad Q(p) = \begin{cases} -\ln(-\ln p) & \xi = 0 \\[4pt] \dfrac{1}{\xi}\big((-\ln p)^{-\xi} - 1\big) & \xi \ne 0 \end{cases}\]

with \(s = (x - \mu)/\sigma\). Three sub-families, indexed by the tail index \(\xi\).

Which sign of \(\xi\) means a heavy, unbounded tail?

  • \(\xi < 0\) (Weibull)
  • \(\xi = 0\) (Gumbel)
  • \(\xi > 0\) (Fréchet)
  • Any — the tail is set by \(\sigma\)

scipy’s sign convention

scipy.stats.genextreme uses shape c with c = −ξ. Every fit below reports ξ = −c.

The three GEV densities

With \(\mu = 0, \sigma = 1\) the support ends at \(\mu - \sigma/\xi\): \(= 3\) for \(\xi = -1/3\) (right end), \(= -3\) for \(\xi = 1/3\) (left end). The Fréchet curve is the one that keeps going.

The sample: Dow Jones log returns, 1985–1990

Which date is the worst single day in 1985–1990, and roughly what log return? (Think October 1987.)

old.Return.idxmin().date(), round(old.Return.min(), 4)

1987-10-19, −0.2563

Block minima: the worst day of every 20-day block

rolling(20).min() gives the running 20-day minimum; taking every 20th row (iloc[::20]) makes the blocks non-overlapping. Predict the number of blocks.

Roughly 1 500 trading days in 1985–1990. How many 20-day block minima?

  • 20
  • About 74
  • About 1 500
  • 6 — one per year

One red dot per block, whatever happened in it: a calm month contributes a minimum of −0.5 %, October 1987 contributes −25.6 %. Block maxima treat both as one observation each — the method is rate-limited by design.

Peaks over threshold: keep every day below −1.5 %

POT throws away the calendar and keeps every exceedance. Predict the order of magnitude: how many of the 1 496 days fell below −1.5 %?

How many days in 1985–1990 have a log return below −0.015?

  • About 9
  • About 90
  • About 900
  • All of them

The dots now cluster in October 1987 and October 1989 — POT captures clusters of stress that block minima flatten to one point. Its price is choosing \(u\): too high and the sample is tiny, too low and the GPD approximation fails.

Warm-up: GEV on the block maxima of a Normal

Before real data, check the theorem on a case where you know the answer (the notebook’s i.i.d. Normal experiment).

10 000 standard-Normal draws, 100 blocks of 100, take each block’s maximum, fit a GEV. Which \(\xi\) should you expect?

  • About +1/3
  • About 0
  • About −1
  • Undefined — Normal maxima have no limit law

Fit the GEV to the Dow’s block losses

Minima become maxima by a sign flip: fit to \(-\text{Min20}\), the block loss. Predict the support bound.

For \(\xi > 0\) the GEV support starts at \(\mu - \sigma/\xi\). With \(\mu \approx 0.0136\), \(\sigma \approx 0.0070\), \(\xi \approx 0.354\), what is the bound?

round(loc - scale / xi, 4)

−0.0063

\(\xi \approx 0.35 > 0\): Fréchet. The 20-day worst loss of the Dow has a polynomial tail; moments of order above \(1/\xi \approx 2.8\) do not exist.

Diagnostic: Q-Q plot against the fitted GEV

One point will sit far above the 45° line at the top right. Which block is it?

  • The block containing 19 October 1987
  • The first block of 1985
  • The block with the smallest loss
  • None — a fitted distribution always fits

Extreme scores: how rare was each block?

Score \(= 1 - F_{\text{GEV}}(\text{loss}) = P(\text{a block is worse than this one})\). Small score = rare block.

Which date has the smallest score, and how many blocks score below 0.10?

score.idxmin().date(), (score < 0.10).sum()

1987-10-19, 6

Black Monday’s score is 0.0007: the fitted GEV says a worse 20-day block arrives once in about 1 400 blocks — 110 years. Two others (January 1988, October 1989) are 1-in-50 events.

POT with the generalised Pareto distribution

Exceedances over a high threshold follow a GPD (Pickands–Balkema–de Haan): \(\;P(X - u > y \mid X > u) \approx \big(1 + \xi y/\beta\big)^{-1/\xi}\), with the same \(\xi\) as the GEV. The POT quantile is

\[\text{VaR}_q = u + \frac{\beta}{\xi}\Big[\Big(\tfrac{n}{N_u}(1-q)\Big)^{-\xi} - 1\Big].\]

91 exceedances give \(\xi = 0.44\) against the GEV’s 0.35 — the same heavy-tail verdict from a different sample; agreement between the two estimators is your sanity check. The GPD’s 99 % one-day VaR (3.3 %) sits just above the empirical 1 % quantile (3.1 %): with 1 496 days the empirical quantile is fine at 1 %. The GPD earns its keep at 0.1 %, where there is nothing left to count.

Hill’s estimator: the tail index a third way

A Fréchet tail is a power law, \(P(L > x) \sim x^{-\alpha}\) with \(\alpha = 1/\xi\). Hill (1975) reads \(\alpha\) off the top \(k\) order statistics: \(\hat\alpha_k = \big[\tfrac{1}{k}\sum_{i\le k}\ln(L_{(i)}/L_{(k+1)})\big]^{-1}\). Predict which \(k\) agrees with the GPD’s \(\xi = 0.44\).

Where will the Hill estimate of \(\xi\) form a plateau near 0.44?

  • Only at \(k = 25\)
  • For \(k\) between 25 and 100; it breaks down at \(k = 200\)
  • Only at \(k = 200\)
  • At no \(k\) — Hill and GPD never agree

\(\hat\xi\) = 0.47, 0.42, 0.44 for \(k\) = 25, 50, 100 — the plateau — then 0.63 at \(k = 200\), where the threshold (0.8 %) is an ordinary day. Picking \(k\) is the craft, exactly as picking \(u\) was for POT: too few points is noise, too many is the body of the distribution.

Return levels: the 1-in-T-day loss

The \(T\)-day return level solves \(P(L > x_T) = 1/T\). Two estimators: the empirical quantile, and the fitted GPD extrapolated: \(x_T = u + \frac{\beta}{\xi}\big[(\tfrac{k}{n}T)^{\xi} - 1\big]\). Predict the empirical method’s fatal limit.

Why can’t an empirical quantile give a 1-in-2 500-day loss from 1 496 days?

  • It can — empirical quantiles extrapolate freely
  • The formula divides by zero
  • There is no observation that far out — the quantile is undefined beyond the sample
  • Empirical quantiles are always biased high

At \(T = 250\) (one year) the two agree: 4.9 % against 4.7 %. At \(T = 1000\) the GPD says 8.9 % while the empirical 7.8 % rests on the two worst days in the sample; at \(T = 2500\) (ten years) only the GPD answers — 13.2 %, and Black Monday’s 25.6 % is the reminder that even that is one draw from the tail. Extrapolation with a fitted shape is what turns six years of data into a ten-year estimate.

Extreme VaR: the highest pain threshold

Invert the fitted GEV at probability \(\alpha\): the loss that only a fraction \(\alpha\) of 20-day blocks will exceed.

\[\text{EVaR}_\alpha = -\Big(\mu + \frac{\sigma}{\xi}\big[(-\ln(1-\alpha))^{-\xi} - 1\big]\Big)\]

With \(\xi = 0.354\), \(\mu = 0.0136\), \(\sigma = 0.0070\), what is EVaR at \(\alpha = 5\,\%\) (as a return)?

round(EVaR(xi, loc, scale, 0.05), 4)

−0.0506

A one-day 5 % VaR says “−1.6 %”. The extreme VaR says: in one 20-day block out of twenty, expect a day worse than −5.1 % — and 4.1 % of the 74 blocks did. That is the number a risk limit should be sized to.

Your turn: the 1 % extreme VaR

Compute the 1 % extreme VaR from the fitted GEV into evar01 (use EVaR), then count how many of the 74 block minima fell below it.

What you discovered

  • Matching mean and sd does not match the tail: Apple’s 0.1 % quantile is −10.5 % against −5.8 % for a Normal with the same moments, with 25 days beyond 4 sd where the Normal has none.
  • Maxima have their own limit law: the GEV with tail index \(\xi\) — Weibull (\(\xi<0\), bounded), Gumbel (0), Fréchet (\(\xi>0\), heavy). In scipy, c = −ξ.
  • Block minima (74 blocks of 20 days) give one observation per block; POT (91 days below −1.5 %) keeps every exceedance and sees clusters.
  • Three estimators, one verdict: GEV \(\xi \approx 0.35\), GPD \(0.44\), Hill plateau \(0.42\)\(0.47\). Normal block maxima, by contrast, gave \(\xi \approx 0\).
  • The Q-Q plot and the extreme score both single out 19 October 1987 (score 0.0007); a fitted GPD extrapolates to a 1-in-2 500-day loss of 13 % where the empirical quantile has nothing to count.
  • Extreme VaR at 5 % is about −5.1 % per 20-day block — three times the daily 5 % quantile of −1.6 %. That is the highest pain threshold.

Working with an AI Copilot

Three prompts that make an LLM useful for this chapter — and the pitfall each one guards against.

  1. “Before any test, print n, the standard deviation, and the excess kurtosis; if kurtosis is above 3, tell me which of the tests you propose assume Normality and give me a bootstrap or permutation alternative.” A copilot will run ttest_1samp on 20 fat-tailed returns and report a p-value to four decimals. The number is real; the assumption behind it is not.
  2. “When you run kstest against norm, confirm the data are standardised first (or pass args=(mean, sd)), and when you fit genextreme, state the sign convention and report ξ = −c.” Both are places where the code runs, returns a number, and the number is wrong — D = 0.47 on raw returns is a scale mismatch, not a shape test.
  3. “Fix the hypothesis, the metric, the sidedness and the sample size before you show me any result, and refuse to compute a p-value on a subset I chose after seeing the data.” Peeking, metric-shopping and post-hoc one-sided tests are the same error; an LLM that happily re-runs the analysis on request is the fastest p-hacking machine ever built.

Mistakes Library: “25-standard-deviation moves” (August 2007)

Warning

In the second week of August 2007, quantitative equity funds run by Goldman Sachs, Renaissance, AQR and others lost between 10 % and 30 % in a few days as crowded long-short factor positions unwound together. Goldman’s Global Equity Opportunities fund fell about 30 % in a week and received a US$3 billion injection. Explaining it, CFO David Viniar told the Financial Times (13 August 2007): “We were seeing things that were 25-standard-deviation moves, several days in a row.”

Under a Normal model a 25σ event has probability of order \(10^{-137}\) — it should not happen once in the life of the universe, let alone on consecutive days. The models were not unlucky; they were mis-specified. A Fréchet tail with \(\xi \approx 0.35\), the number you fitted to the Dow, assigns such moves probabilities measured in years, not eons.

Lesson for this chapter: counting sigmas presumes a Gaussian. The tail index, block maxima and the extreme VaR exist precisely because “how many σ” is the wrong question about the tail.

Decision Memo — Set the 20-day loss limit for the index book

To: Chief Risk Officer From: <Your name>, risk analytics Subject: Replace the daily-VaR-based stop with an extreme-VaR limit Date: 2026-09-15

Recommendation: Size the index book’s hard loss limit to the 5 % extreme VaR of the 20-day block minimum: −5.1 % of notional per block, reviewed quarterly.

Evidence: - GEV fitted by MLE to 74 block minima (DJI 1985–1990): ξ = 0.35, μ = 0.0136, σ = 0.0070; Q-Q diagnostic straight apart from 19 Oct 1987. - EVaR(5 %) = −5.1 % vs the daily 5 % quantile of −1.6 %: the current stop is sized to an ordinary bad day, not to an ordinary bad month. - Six blocks in six years scored below 0.10; the limit would have been breached 3 times (4.1 % of blocks), all in identified stress episodes.

Caveats: - 74 observations: the ξ confidence interval is wide (bootstrap it, §3.2, before sign-off). - Historical window ends 1990; re-estimate on 2008 and 2020 to test stability of ξ. - GPD on 91 exceedances gives ξ = 0.44 and the Hill plateau 0.42–0.47 vs the GEV’s 0.35; agreement in sign and size is the sanity check, not proof.

Next step: Re-fit on rolling 6-year windows to 2024; report EVaR(5 %) and EVaR(1 %) with bootstrap bands.

Chapter Summary

Concept Tool
Population vs sample sample, std(ddof=1)
Empirical distribution ECDF via np.sort and arange(1, n+1)/n, DKW bound, KernelDensity, Silverman’s \(h\)
Parametric fit and diagnostics stats.t.fit, probplot, bimodality coefficient
Bootstrap rng.integers(0, n, (B, n)), percentile CI, BCa (\(z_0\), \(a\) from the jackknife)
Tests shapiro, kstest (studentise first), ks_2samp, ttest_1samp(alternative=), permutation via rng.shuffle, rolling \(\hat t\)
Experimental design \(n = 2\sigma^2(z_\alpha+z_\beta)^2/\tau^2\), peeking simulation, \(\alpha\)-spending, ε-greedy / UCB1 / Thompson
Association pearsonr, spearmanr, kendalltau, distance correlation via pdist, tail co-exceedance
Extreme values genextreme.fit (ξ = −c), block minima, genpareto.fit, Hill estimator, return levels, extreme score, EVaR

Next: Chapter 4 — Statistical Predictive Models.

Discussion Questions

  1. The bootstrap SE of Apple’s 2017 kurtosis was 1.55 on an estimate of 4.58, and BCa moved the interval to \([2.2, 9.1]\). If a risk model needs the kurtosis as an input, what would you feed it — the point estimate, the lower bound, or the fitted \(t\)’s df — and why?
  2. The rolling \(t\)-test flagged 20 days out of 249 at \(|\hat t| > 2\). Under the null of no regime change, roughly how many flags would you expect from 249 dependent, overlapping tests — and what does §3.3’s peeking simulation say about reading those flags as signals?
  3. Tesla joined the S&P’s worst 5 % of days a third of the time, yet the Pearson correlation within those days was lower than overall. Which number belongs in a diversification argument, and which in a stress test?
  4. The GEV on block minima, the GPD on exceedances and the Hill estimator gave \(\xi\) = 0.35, 0.44 and 0.42–0.47. If they disagreed sharply, which would you trust for a risk limit — and what would you change first: the block length, the threshold, or \(k\)?