Unit 3 · The Quant Math Toolkit — Session 02 of 06

Distributions & Fat Tails

Most finance formulas quietly assume that returns follow the bell curve. They don't, and the gap hides exactly where accounts die: in the tails. This session gives you the three distributions quants use every day — normal, lognormal and Student-t — the numbers that describe a distribution's shape, and the tools that measure how fat a tail really is. The core move: never quote a normal tail probability until you have looked at the tails themselves.

DURATION 1.5 h + lab LEVEL Foundations TRACKS QR · QT · QD · IND HANDS-ON 4,000 simulated years vs their normal twins

3.2.1 Three shapes every quant uses

A distribution is the complete answer to "what could happen, and how likely is each outcome?". Three of them cover most of a quant's working day — and knowing where each one breaks matters more than knowing its formula.

In Session 3.1 you summarised a bet with two numbers, its expected value and its standard deviation. For a coin flip those two numbers are the whole story. For a market return they give you the centre and the typical width, and nothing about the question a risk manager loses sleep over: how often a day far from the centre turns up. That is a question about the shape of the whole distribution, and three shapes do most of the work (fig 3.2.1).

The normal distribution N(μ,σ2)N(\mu, \sigma^2) is the bell curve. Two numbers pin it down completely, the mean μ\mu and the standard deviation σ\sigma, and its tails vanish astonishingly fast, like e−x2/2e^{-x^2/2}: 68.3% of outcomes land within one σ\sigma of the mean and all but 0.27% within three. It is everywhere because of the central limit theorem: anything built by adding up many small independent pieces ends up close to normal.

A lognormal distribution is what you get when the logarithm of a quantity is normal: if X∼N(m,s2)X \sim N(m, s^2), then eXe^X is lognormal. It is the natural model for a price. Log returns add up over time (Session 2.3), so the price after TT days is PT=P0er1+⋯+rTP_T = P_0\, e^{r_1 + \cdots + r_T}, and if that sum is roughly normal the price is roughly lognormal. The shape follows. A price can never fall below zero — you cannot lose more than you paid for a share — but it can double or triple, so the distribution leans to the right, with the mean above the median above the most likely value. Osborne (1959) proposed modelling log prices as a random walk; the same assumption sits inside the Black–Scholes–Merton model of Session 10.3.

The Student-t distribution looks like a bell curve with heavier tails. Its shape parameter, the degrees of freedom ν\nu, sets how heavy: a small ν\nu gives fat tails, and as ν\nu grows the Student-t turns into the normal. Its variance is ν/(ν−2)\nu/(\nu - 2), so to use it as a return model with volatility σ\sigma you first rescale it to unit variance and then multiply by σ\sigma:

rt=μ+σν−2νεt,εt∼tνr_t = \mu + \sigma \sqrt{\frac{\nu - 2}{\nu}}\;\varepsilon_t, \qquad \varepsilon_t \sim t_\nu

Compared with a normal of the same volatility, the result has a taller peak, thinner shoulders and far fatter tails — the right-hand panel of fig 3.2.1, whose inset magnifies the tail you cannot otherwise see.

THREE SHAPES EVERY QUANT USES NORMAL LOGNORMAL STUDENT-T vs NORMAL −3σ μ +3σ symmetric; tails vanish fast sums and averages (the CLT) mode median mean 0 never below zero; skewed right prices over long horizons taller peak thinner shoulders right tail, 3σ–6σ, zoomed same volatility, fatter tails daily returns (dashed: the normal) Mean and volatility pin down a normal completely; for the other two, the shape carries what they miss.
fig 3.2.1 — the three shapes: the normal, a lognormal price with its mode, median and mean, and a unit-variance Student-t(3) against the normal with the same volatility (the inset magnifies the right tail from 3σ to 6σ). The normal and Student-t curves share one vertical scale
DistributionParametersNegative values?TailsWhere you'll use it
Normalmean μ\mu, standard deviation σ\sigmayesthin: vanish like e−x2/2e^{-x^2/2}averages, test statistics, the default risk model
Lognormalmm, ss of the logarithmnolong right tail; every moment finiteprices and wealth over long horizons; option pricing
Student-tdegrees of freedom ν\nu, plus location and scaleyesfat: a power law (§3.2.6)fat-tailed returns; robust fitting
📌 Key idea — prices are roughly lognormal; returns are not normal

The lognormal describes a price at a horizon exactly as well as the normal describes the sum of log returns up to that horizon. Over years, many daily returns add up and the sum drifts towards normal (aggregational Gaussianity, measured in Session 5.1). Over one day it is not normal at all (§3.2.3). Use the lognormal for where a price might be in ten years; never use the normal for how bad tomorrow might be.

3.2.2 Skewness & kurtosis: numbers for shape

The mean says where, the volatility says how wide. Two more numbers describe the shape, and both of them are really about the tails.

A moment is an average of a power of the distance from the mean; the second one is the variance. Divide the third and fourth by the matching power of σ\sigma and you get two numbers with no units:

skew(X)=𝔼[(X−μ)3]σ3,kurt(X)=𝔼[(X−μ)4]σ4,excess kurtosis=kurt(X)−3\text{skew}(X) = \frac{\E\big[(X - \mu)^3\big]}{\sigma^3}, \qquad \text{kurt}(X) = \frac{\E\big[(X - \mu)^4\big]}{\sigma^4}, \qquad \text{excess kurtosis} = \text{kurt}(X) - 3

Skewness measures asymmetry. Cubing keeps the sign of each deviation, so a long left tail — rare large losses — gives negative skewness, and a long right tail positive. Kurtosis measures tail weight: the fourth power makes a day 4σ from the mean count 256 times as much as a day 1σ away, so the extremes dominate it. A normal has kurtosis exactly 3, which is why quants usually quote excess kurtosis, kurtosis minus 3: zero for a normal, positive for fat tails. You will still read that kurtosis measures "peakedness". It doesn't; Westfall (2014) shows it is almost entirely about the tails.

🧭 Margin note — excess or not?

scipy.stats.kurtosis and pandas' .kurt() return excess kurtosis by default (zero for a normal); MATLAB's kurtosis returns plain kurtosis (three for a normal). A report that says "kurtosis 3" means either "perfectly normal" or "noticeably fat-tailed", depending on who wrote the code. Ask.

The lognormal: skew that grows with the horizon

For a lognormal with log-mean mm and log-volatility ss, everything is in closed form:

𝔼[eX]=em+s2/2,median=em,mode=em−s2,skew=(es2+2)es2−1\E\big[e^X\big] = e^{m + s^2/2}, \qquad \text{median} = e^{m}, \qquad \text{mode} = e^{m - s^2}, \qquad \text{skew} = \big(e^{s^2} + 2\big)\sqrt{e^{s^2} - 1}

Take an index at $100 with expected growth 7% a year and volatility 20%. With the convention of Session 2.3, the log price grows at μ−σ2/2\mu - \sigma^2/2 a year, so over τ\tau years m=(μ−σ2/2)τm = (\mu - \sigma^2/2)\,\tau and s=στs = \sigma\sqrt{\tau}:

HorizonMean priceMedian priceSkewnessExcess kurtosisPaths ending below the mean
1 day$100.03$100.020.0380.00350.3%
1 year$107.25$105.130.610.6854.0%
10 years$201.38$164.872.4512.362.4%
30 years$816.62$448.178.1022270.8%

Over a day the lognormal is indistinguishable from a normal. Over thirty years it is wildly skewed: a few lucky paths drag the mean up to $816.62 while 70.8% of paths end below it — the gap between the average and the typical outcome that you met in Session 3.1. The lab checks the ten-year row with 1,000,000 simulated prices: mean $201.31, median $164.87, skewness 2.45 ± 0.03.

The Student-t: same variance, redistributed

For the Student-t, excess kurtosis is 6/(ν−4)6/(\nu - 4) when ν>4\nu \gt 4 and infinite when ν≤4\nu \le 4. The table compares unit-variance versions with the normal; every entry is exact:

Unit varianceExcess kurtosisWithin ±1σ\pm 1\sigmaBetween 1σ1\sigma and 3σ3\sigmaBeyond ±3σ\pm 3\sigmaFalls beyond 4σ4\sigma, × the normal's
Normal068.3%31.5%0.27%1
Student-t(30)0.2369.1%30.5%0.41%4.1
Student-t(10)1.0071.0%28.2%0.73%18.8
Student-t(5)6.0074.7%24.1%1.17%56.4
Student-t(3)infinite81.8%16.8%1.38%97.3

Read across a row and you see the whole trade. At the same volatility, the Student-t(5) puts 74.7% of days within ±1σ instead of 68.3%, keeps only 24.1% in the shoulders, and spends what is left in the tails: falls beyond 4σ come 56 times as often. In code, the rescaling is one line; the lab checks it on 1,000,000 draws (sample variance 0.9997):

def t_unit(nu: float, size, rng: np.random.Generator) -> np.ndarray:
    """Student-t draws rescaled to unit variance (needs nu > 2)."""
    return rng.standard_t(nu, size) * np.sqrt((nu - 2) / nu)

3.2.3 How rare is a 5-sigma day?

Under the normal, big days are not merely rare. Past four or five standard deviations they become impossible on any human timescale — and that is exactly where markets keep producing them.

Call a daily return more than kk standard deviations below its mean a kk-sigma fall. Under a normal its probability is Φ(−k)\Phi(-k), where Φ\Phi is the standard normal cumulative distribution function, and with 252 trading days a year the expected wait between two of them is

ℙ(fall>kσ)=Φ(−k)=∫−∞−ke−x2/22πdx,expected wait=1252Φ(−k) years.\Prob(\text{fall} \gt k\sigma) = \Phi(-k) = \int_{-\infty}^{-k} \frac{e^{-x^2/2}}{\sqrt{2\pi}}\,\dd x, \qquad \text{expected wait} = \frac{1}{252\,\Phi(-k)} \text{ years.}
HOW LONG UNTIL A k-SIGMA FALL? — expected wait in trading days, log scale, to scale a week a year a decade a lifetime recorded history the age of the universe THE NORMAL SAYS 1σ 2σ 3σ 4σ 5σ 6σ 7σ 8σ A CUBIC POWER LAW SAYS (tail index 3, set equal to the normal at 2σ) 2σ 3σ … 8σ: from months to about a decade Each extra σ stretches the normal's wait enormously; under the power law it grows only slowly.
fig 3.2.2 — the tail ladder, drawn to scale on a logarithmic time axis: the normal's expected wait for a k-sigma fall (top) against a cubic power law set equal to it at 2σ (bottom). The exact waits are in the table below
Fall of more thanNormal: expected waitStudent-t(3): expected waitStudent-t(3) ÷ normal, per day
2σ44 trading days49 trading days0.89
3σ2.9 years144 trading days5.1
4σ125 years1.3 years97
5σ13,843 years2.5 years5,650
6σ4,022,201 years4.2 years963,561
8σ6,378,844,425,836 years9.8 years653,954,930,661

The normal says a 4σ fall comes once every 125 years and a 5σ fall once every 13,843 years, longer than recorded history. A unit-variance Student-t(3) has the same volatility and even slightly fewer 2σ falls (its shoulders are thinner), but its waits grow slowly: a 5σ fall every 2.5 years, an 8σ fall about once a decade. Its tail is a power law (§3.2.6), and a power law is scale-free: doubling the size of a fall divides its frequency by roughly 23=82^3 = 8 wherever you start (7.6 from 4σ to 8σ for this Student-t). Under the normal the same doubling divides it by about 51 billion.

What markets actually do

Which ladder do real returns climb? This is one of the most replicated findings in finance. Mandelbrot (1963) found cotton price changes far too wild for a normal and proposed distributions with infinite variance. Larger data sets settled on a middle ground, summarised in Cont's (2001) survey of the stylized facts of returns: the tails look like a power law with a tail index "finite, higher than two and less than five for most data sets studied" — fat enough to rule out the normal, too thin for infinite variance. Cont also reports excess kurtosis of about 16 for five-minute S&P 500 futures returns and 60 to 74 for currency futures.

The most precise estimates come from physicists with enormous data sets. Gopikrishnan et al. (1999) studied about 1.2 million one-minute S&P 500 returns from 1984 to 1996. Between 3 and 50 standard deviations the tails fell off with an index of 2.95 ± 0.07 for gains and 2.75 ± 0.13 for losses by regression, or 3.45 and 3.29 with a Hill-type estimator (the method matters: §3.2.6). Daily gains of the S&P 500, the Nikkei and the Hang Seng gave 3.34, 3.05 and 3.03, and at horizons beyond about four days the distribution crept slowly towards the normal. Gopikrishnan, Meyer, Amaral & Stanley (1998) had already named the pattern the inverse cubic law in a shorter companion paper, and Gabaix (2009) reviews the evidence that it holds for individual stocks and indices at horizons from minutes to a few days: ℙ(|r|>x)∝x−3\Prob(|r| \gt x) \propto x^{-3}. Under it, a 10σ day is 125 times rarer than a 2σ day; under the normal it is about 3.0 × 1021 times rarer.

One day puts the two ladders side by side. The Dow Jones Industrial Average fell 22.6% on 19 October 1987 (Bernhardt & Eckblad 2013). Measured against a 1% daily volatility — about 16% a year, the scale of this session's simulated markets — that is a 22.6σ fall. The normal gives it a probability of about 10−113 per day; the Student-t(3), once every 216 years. Not a likely day, but a possible one.

📌 Key idea — the normal's tail is a cliff; a power law's is a slope

Under the normal, each extra σ makes a fall thousands to billions of times rarer; under a cubic power law, doubling the fall makes it only about eight times rarer. Every probability the normal quotes beyond about 3σ is wrong by orders of magnitude, and always in the same direction: too small.

3.2.4 Fat tails in simulated markets

Two mechanisms produce fat tails in real markets: volatility that changes over time, and sudden jumps. The lab builds a market around each and races it against a normal twin with exactly the same mean and volatility.

The first market is a GARCH-t model. Each day's volatility depends on yesterday's shock and yesterday's volatility, so calm spells and storms cluster — volatility clustering, which Session 5.1 measures in real data — and the shocks themselves are Student-t with ν\nu = 6. Session 5.5 builds and fits the GARCH model properly; here it is simply a realistic source of fat tails, with a long-run daily volatility of 1.00% (15.9% a year). Clustering alone fattens the tails. Pool calm days, drawn with a small σ, and stormy days, drawn with a large one, and the mixture has too many quiet days, too few middling ones, and extremes that the storms supply.

The second market is a jump-diffusion: a calm normal market with 15% volatility, plus crashes that arrive at random, 0.5 times a year on average, each a fall of about −10% (standard deviation 5%). Each market is simulated for 400 independent decades — 4,000 years, 1,008,000 trading days — and each gets a normal twin. Every return is measured in units of its market's true volatility, and the lab counts the falls:

garch = np.stack([qn.synth.garch_returns(N_DAYS, OMEGA, GARCH_A, GARCH_B, MU_G, NU_G, rng=rng_garch)["ret"].to_numpy()
                  for _ in range(N_PATHS)])                      # shape (paths, days)
garch_sd = np.sqrt(OMEGA / (1 - GARCH_A - GARCH_B))              # unconditional daily volatility
garch_twin = MU_G + garch_sd * rng_garch_twin.standard_normal((N_PATHS, N_DAYS))
z_garch = (garch - MU_G) / garch_sd
# … for each k:
    f_garch = float((z_garch < -k).mean())
    se_garch = qn.stats.batch_se(lambda b: (b < -k).mean(), z_garch)
    assert f_garch - p_norm > 4 * se_garch, f"GARCH-t should show more {k}-sigma falls than the normal"
Days in 4,000 yearsNormal: expectedTwins: GARCH · jumpGARCH-tJump: fallsJump: rises
beyond 3σ1,3611,300 · 1,4027,3712,170354
beyond 4σ31.932 · 172,7941,8027
beyond 5σ0.290 · 01,2991,6804
beyond 6σ0.0010 · 06771,5371

The twins stay within the normal's statistical noise (the lab asserts it, at four standard errors). The GARCH-t market does not: 2,794 falls beyond 4σ — one every 1.4 years instead of every 125 — and 1,299 beyond 5σ, where the normal expects 0.29: one every 3.1 years instead of every 13,843. The jump-diffusion is lopsided. Its large falls are crash days, and their frequency matches the exact calculation (0.162% of days beyond 5σ, simulated 0.167%). But it has fewer moderately large rises than even the normal (354 beyond 3σ against 1,361), because the crashes inflate the volatility that every move is measured against. That asymmetry is negative skewness: −2.95 in the simulation against −2.85 exactly (standard error 0.08), with excess kurtosis 43.2 against 41.0 (standard error 1.6).

GARCH-T DAILY RETURNS, IN STANDARD DEVIATIONS −6σ −4σ −2σ 0σ 2σ 4σ 6σ −6σ to −6σ −6σ to −6σ −6σ to −5σ −5σ to −5σ −5σ to −5σ −5σ to −5σ −5σ to −5σ −5σ to −4σ −4σ to −4σ −4σ to −4σ −4σ to −4σ −4σ to −4σ −4σ to −3σ −3σ to −3σ −3σ to −3σ −3σ to −3σ −3σ to −3σ −3σ to −2σ −2σ to −2σ −2σ to −2σ −2σ to −2σ −2σ to −2σ −2σ to −1σ −1σ to −1σ −1σ to −1σ −1σ to −1σ −1σ to −1σ −1σ to 0σ 0σ to 0σ 0σ to 0σ 0σ to 0σ 0σ to 0σ 0σ to 1σ 1σ to 1σ 1σ to 1σ 1σ to 1σ 1σ to 1σ 1σ to 2σ 2σ to 2σ 2σ to 2σ 2σ to 2σ 2σ to 2σ 2σ to 3σ 3σ to 3σ 3σ to 3σ 3σ to 3σ 3σ to 3σ 3σ to 4σ 4σ to 4σ 4σ to 4σ 4σ to 4σ 4σ to 4σ 4σ to 5σ 5σ to 5σ 5σ to 5σ 5σ to 5σ 5σ to 5σ 5σ to 6σ 6σ to 6σ 6σ to 6σ normal, same volatility normal, same volatility
fig 3.2.3 — the GARCH-t market's daily returns in units of its volatility, against the normal curve with the same volatility: a taller peak and thinner shoulders. The fat tails are too thin to see at this scale — that is what the QQ plots of §3.2.5 are for (the 0.13% of days beyond ±6σ are off the chart)

The histogram shows the Student-t pattern of §3.2.2 emerging from a market in which every single day's shock has only moderately fat tails: 77.2% of days within ±1σ against the normal's 68.3%, and 21.3% in the shoulders against 31.5%.

⚠️ Pitfall — "the sample kurtosis is small, so the tails are only mildly fat"

The GARCH-t market's true excess kurtosis is 28.3, from a closed-form formula. A typical simulated decade reports 4.5; one decade in ten reports less than 2.4 and one in ten more than 12.9; all 4,000 years pooled give 12.7. The kurtosis estimate is itself fat-tailed: its standard error depends on moments up to the eighth (Cont 2001), and for this market the eighth is infinite, so most samples simply miss the rare days that make the true value large. Treat a sample kurtosis as a warning light — a big number means fat tails; a small one proves nothing.

3.2.5 QQ plots: seeing the tails

Kurtosis squeezes the tails into one fragile number. A QQ plot shows every tail observation at once, and with practice you can read one in seconds.

A QQ plot (quantile–quantile plot) sorts your nn observations, standardises them by their own mean and volatility, and plots each one against the value a normal would put at the same rank: the ii-th smallest observation against the normal quantile at probability (i−12)/n(i - \tfrac12)/n. If the data are normal, the points lie on the diagonal. The middle of a QQ plot is almost always boring; the information is at the two ends, and there are only four patterns to learn (fig 3.2.4).

HOW TO READ A QQ PLOT — x: where a normal would put each point · y: where the data put it ON THE LINE normal quantile → normal S-SHAPE normal quantile → fat tails on both sides LEFT END DROPS normal quantile → left skew: crash risk ENDS CURL IN normal quantile → thin tails (e.g. uniform) Read the ends: where the points run steeper than the line, that tail is fatter than the normal's.
fig 3.2.4 — the four QQ patterns (schematic): on the line, an S-shape for fat tails, a left end that drops for crash-prone left skew, and ends that curl towards the line for tails thinner than the normal's

One simulated decade of each market (2,520 days) shows two of the patterns. With that many points, the most extreme normal quantile is ±3.54. The GARCH-t data run from −13.8σ to 5.3σ: an S that no normal can bend to (fig 3.2.5). The jump-diffusion hugs the line everywhere except the far left, where 5 crash days fall below −5σ, the worst at −15.6σ (fig 3.2.6). A left end that drops like this is the signature of strategies that earn steadily and occasionally blow up, such as writing put options.

QQ PLOT: ONE DECADE OF GARCH-T RETURNS VS THE NORMAL −15 −10 −5 0 5 10 −15 −10 −5 0 5 10 normal quantile (σ) data quantile (σ) y = x
fig 3.2.5 — one simulated decade of GARCH-t returns against the normal: both ends peel away from the diagonal, the S of fat tails
QQ PLOT: ONE DECADE OF JUMP-DIFFUSION RETURNS VS THE NORMAL −20 −15 −10 −5 0 5 −20 −15 −10 −5 0 5 normal quantile (σ) data quantile (σ) y = x
fig 3.2.6 — one simulated decade of jump-diffusion returns: on the line except the few crash days at the far left, the signature of negative skew
💡 Tip — QQ against the Student-t, too

scipy.stats.probplot(x, dist=stats.t, sparams=(5,)) draws a QQ plot against a Student-t with 5 degrees of freedom instead of the normal. If the ends straighten out, that Student-t is a usable model for the tail; if they still bend, the tail is fatter still, or asymmetric. Always check both ends separately: losses and gains need not share a tail.

3.2.6 Power laws & the Hill estimator

"Fat-tailed" becomes a precise statement once you write the tail as a power law. One number, the tail index, then tells you which moments exist and which statistics you can trust.

A distribution has a power law tail when the probability of exceeding a level xx falls off like a power of xx:

ℙ(X>x)≈Cx−ζ  for large x,soℙ(X>2x)ℙ(X>x)≈2−ζ\Prob(X \gt x) \approx C\,x^{-\zeta} \ \text{ for large } x, \qquad \text{so} \qquad \frac{\Prob(X \gt 2x)}{\Prob(X \gt x)} \approx 2^{-\zeta}

The exponent ζ\zeta is the tail index: the smaller it is, the fatter the tail. Most papers write it α\alpha; in this course α\alpha means alpha, so we follow Gabaix (2009) and write ζ\zeta. On log–log axes a power-law tail is a straight line with slope −ζ-\zeta, and it is scale-free — doubling a move always costs the same factor 2ζ2^{\zeta}, which is why the bottom row of fig 3.2.2 is so compressed. A Student-t(ν\nu) has tail index ν\nu. The normal has none: its tail drops faster than any power. And a power-law tail rations moments, because 𝔼|X|p\E|X|^p is finite only for p<ζp \lt \zeta:

Tail indexMeanVarianceKurtosisWhat breaks
ζ≤1\zeta \le 1nonenonenoneaverages never settle: the law of large numbers fails (§3.2.7)
1<ζ≤21 \lt \zeta \le 2finitenonenoneσ does not exist and the usual CLT fails; below 2, sums tend to non-normal "stable" laws — Mandelbrot's 1963 hypothesis for prices
2<ζ≤42 \lt \zeta \le 4finitefinitenonevolatility exists, but estimates of it are noisy; the evidence puts daily returns here, near 3
ζ>4\zeta \gt 4finitefinitefinitekurtosis exists, but its estimate has a finite standard error only when ζ>8\zeta \gt 8

The Hill estimator

To estimate ζ\zeta you look only at the tail. Sort the losses from largest down, X(1)≥X(2)≥⋯X_{(1)} \ge X_{(2)} \ge \cdots, and choose how many of them, kk, count as "the tail"; X(k+1)X_{(k+1)} is then the threshold. For an exact power law the log of each loss relative to the threshold, ln⁡(X(i)/X(k+1))\ln\big(X_{(i)}/X_{(k+1)}\big), is exponentially distributed with mean 1/ζ1/\zeta, so Hill (1975) simply averages them:

1ζˆk=1k∑i=1kln⁡X(i)−ln⁡X(k+1)\frac{1}{\hat\zeta_k} = \frac{1}{k}\sum_{i=1}^{k} \ln X_{(i)} - \ln X_{(k+1)}

The Hill estimator is a few lines of numpy with one knob, kk — and turning that knob is where the trouble starts:

def hill_xi(x: np.ndarray, k_max: int) -> np.ndarray:
    """ξ̂_k = 1/ζ̂_k for k = 1..k_max, row by row, from the largest LOSSES (−x) of each sample."""
    losses = -np.sort(x, axis=1)[:, : k_max + 1]               # the k_max + 1 largest losses, descending
    logs = np.log(losses)
    k = np.arange(1, k_max + 1)
    return np.cumsum(logs[:, :k_max], axis=1) / k - logs[:, 1: k_max + 1]

The lab gives it a problem with a known answer: 200 independent samples of 40 years of daily Student-t(3) returns (10,080 days each), whose true tail index is 3. It first checks the code on exact power-law (Pareto) data, where the estimator's distribution is known exactly, and then compares the Student-t averages with an exact calculation. The last column runs the same estimator on normal data, which has no tail index at all:

Largest losses used, kkShare of the sampleAverage ζˆ\hat\zeta, 200 samplesOne sample's typical errorSame estimator on normal data
250.2%3.00±0.6510.4
500.5%2.93±0.409.1
1001.0%2.83±0.297.8
2502.5%2.67±0.166.0
1,0009.9%2.14±0.063.5

Read the table as a trade-off. With the largest 25 to 50 losses, the average is close to the truth (3.00 and 2.93), but a single 40-year sample is typically off by ±0.40 or more. With the largest 10% the estimate is precise and wrong — 2.14 ± 0.06 — because the threshold reaches into the body of the distribution, where the Student-t is not a power law. Normal data are worse. They have no tail index, yet at a 10% threshold Hill reports 3.5, right in the range published for stock returns, and the estimate keeps climbing as the threshold moves out. One sample's Hill plot (fig 3.2.7) wanders between 2.2 and 4.0 as kk runs from 10 to 1,000: pick your kk and you can defend almost any value in that range.

HILL ESTIMATE OF THE TAIL INDEX VS K (STUDENT-T, TRUE ζ = 3) one 40-year sample average of 200 samples 1.0 2.0 3.0 4.0 200 400 600 800 1000 one 40-year sample one 40-year sample: 2.2 average of 200 samples average of 200 samples: 2.1 one sample: 2.2 average: 2.1
fig 3.2.7 — a Hill plot: the tail-index estimate against the number of largest losses used, for one simulated 40-year sample (noisy) and the average of 200 samples (biased downward as k grows); the grey line is the true value, 3
⚠️ Pitfall — "the Hill estimate is 2.9, so the tail index is 2.9"

A Hill estimate without its threshold means nothing. Plot ζˆ\hat\zeta against kk, look for a stretch where it is roughly flat, and report the range, not a point. Embrechts, Klüppelberg & Mikosch (1997) call the worst cases "Hill horror plots"; Drees, de Haan & Resnick (2000) show that, unless the data are exactly Pareto, plotting against log⁡k\log k is more revealing; Gabaix (2009) notes that there is no consensus rule for the cutoff, and that clustered financial data make the textbook standard error of about ζ/k\zeta/\sqrt{k} too small. Recall that Gopikrishnan et al. got 2.95 from one method and 3.45 from another on the same gains. Read "ζ ≈ 3" as "somewhere between about 2.5 and 4", never as a precise parameter.

A power law is also easy to see where there is none. Clauset, Shalizi & Newman (2009) show that the common shortcut — fitting a straight line to a log–log histogram — can give badly wrong exponents and says nothing about whether the data follow a power law at all, and Gabaix (2009) concedes that a lognormal sometimes fits a tail better.

💡 Looking ahead

The disciplined version of this idea is extreme value theory: fit a generalised Pareto distribution to the losses above a threshold and read rare-loss probabilities from it. Session 9.7 — VaR, ES, EVT & VaR Backtests builds it, with the same threshold problem front and centre.

3.2.7 What fat tails break

Fat tails are not a statistical curiosity. They change how you measure risk, how you size positions and which statistics you can believe — so check them before trusting any number built on the normal.

CHECK THE TAILS BEFORE YOU TRUST THE BELL — fit, check, decide 1 · FIT A NORMAL mean and volatility: what everyone quotes 2 · MOMENTS skewness, excess kurtosis: a warning light only 3 · QQ PLOT read both ends: steeper = fatter tail 4 · TAIL INDEX Hill across many k: is there a flat stretch? 5 · DECIDE how fat are the tails? NEAR-NORMAL ENDS the normal is fine for averages and everyday moves FAT TAILS, ζ WELL ABOVE 2 Student-t, historical data or EVT; size for the worst day, not σ ζ NEAR 2 OR BELOW the variance barely exists: distrust σ, Sharpe and correlation Every number built on the normal inherits its tails: check them first.
fig 3.2.8 — the tail check: fit the normal, then let moments, a QQ plot and a Hill plot decide whether it can be trusted, and what to use instead

Risk

A normal model puts the loss you should see on one day in a thousand at 3.09σ. In the GARCH-t market it is 5.37σ ± 0.10 — 1.7 times as deep — and for the Student-t(3), 5.90σ. That one-in-a-thousand loss is a value at risk, and a normal VaR understates it for exactly the reasons of §3.2.3. Session 9.7 — VaR, ES, EVT & VaR Backtests builds VaR and expected shortfall properly, together with the tests that catch a model like this.

⚠️ Pitfall — "it was a 25-sigma day; we were unlucky"

In August 2007 Goldman Sachs' chief financial officer explained a flagship hedge fund's losses: "We were seeing things that were 25-standard deviation moves, several days in a row" (Financial Times, 13 August 2007, as quoted by Dowd et al. 2008). Under a normal, a single 25σ day has a probability of about 10−138, and Dowd et al. put the expected wait for one such day at about 10135 years — the universe is about 1010 years old. A "25-sigma day" is not bad luck. It is a model announcing that it was wrong: the σ was measured in a calm market, and the tails were never normal. Session 9.8 returns to that month, the quant quake of 2007.

Sizing

Volatility targeting (Session 9.5) sets position size from σ, and the Kelly criterion (Session 3.6) from the ratio of edge to variance. With fat tails, the same σ hides a deeper worst day: at equal volatility, the Student-t(3) makes a 5σ fall 5,650 times as likely as the normal. Size for the loss you can survive, not only for the volatility you measured — the practical case for fractional Kelly.

Statistics

Moments that don't exist break the tools of Session 3.1. At ζ=1\zeta = 1 — the Cauchy distribution, a Student-t with one degree of freedom — the average of nn draws has exactly the same distribution as a single draw. In the lab, the average of 1,000 Cauchy draws landed beyond ±1 in 49.8% of 20,000 trials, against exactly 50% in theory; for 1,000 standard normal draws the chance is about 10−219. Averaging buys nothing at all. At ζ≈3\zeta \approx 3 averages do converge, but slowly — the Student-t(2.5) of Session 3.1 was still visibly non-normal after 1,000 draws — and fourth moments are held hostage by single days. In a typical simulated GARCH-t decade the largest day contributes 14.6% of the sum of fourth powers behind the kurtosis (its normal twin: 2.3%), and in one decade in ten more than 35.3%. Taleb (2025) reports about 80% for roughly half a century of S&P 500 returns. Anything built from fourth moments — kurtosis, the uncertainty of a variance, the standard error of a Sharpe ratio (Session 5.2) — inherits that instability.

📌 Key idea — check the tails before you trust the bell

The normal is the right tool for averages of many independent pieces and the wrong one for a single bad day. Before any risk number, position size or confidence interval, run the tail check of fig 3.2.8 — and when the tails are fat, let the worst day, not the volatility, set the limits. Session 3.5 gives you the other escape route: simulate or bootstrap from the data instead of assuming a shape.

3.2.8 Try it

Open the companion lab, make a prediction, change one number and see whether the world agrees.

🔧 Try it (15 min, in the lab)

1. Predict first: how many 4σ falls should 4,000 years of normal days contain? (1,008,000 × Φ(−4).) Then set NU_G = 30.0 in section 3 — nearly normal shocks — and rerun. The GARCH market still has far more 4σ falls than your prediction: that excess is volatility clustering alone.
2. In section 5, set NU_HILL = 4. At which kk does the average Hill estimate come closest to 4, and is it above or below 4 at k=100k = 100? Explain in one sentence why the bias points that way.
3. In section 3, set JUMP_MEAN = -0.05. Predict whether the jump-diffusion's skewness becomes more or less negative, then check jd_skew_theory and the QQ plot.
4. Success looks like this: your three predictions are right, and every assert still passes.


3.2.9 Glossary · Check yourself · Go deeper

Normal distribution — the bell curve N(μ,σ2)N(\mu, \sigma^2), fixed by its mean and standard deviation; symmetric, with tails that vanish like e−x2/2e^{-x^2/2}. The limit of averages (CLT), and a poor model for single days.
Lognormal distribution — the distribution of eXe^X when XX is normal; positive and right-skewed, with mean above median above mode. The standard model for a price at a horizon.
Student-t distribution — a bell-shaped distribution with degrees of freedom ν\nu and power-law tails of index ν\nu; variance ν/(ν−2)\nu/(\nu - 2), so multiply by (ν−2)/ν\sqrt{(\nu - 2)/\nu} for unit variance. Tends to the normal as ν\nu grows.
Skewness — the standardised third moment 𝔼[(X−μ)3]/σ3\E[(X - \mu)^3]/\sigma^3; negative when rare large losses give a long left tail.
Kurtosis — the standardised fourth moment 𝔼[(X−μ)4]/σ4\E[(X - \mu)^4]/\sigma^4, a measure of tail weight; 3 for a normal, so excess kurtosis is kurtosis minus 3. Its sample estimate is unreliable when tails are fat.
Fat tails — extreme outcomes far more frequent than a normal with the same volatility allows; in returns, typically a power-law tail with an index between about 2 and 5.
Tail index — the exponent ζ\zeta of a power-law tail, ℙ(X>x)≈Cx−ζ\Prob(X \gt x) \approx C x^{-\zeta}; smaller means fatter, and moments of order ζ\zeta and above are infinite. Often written α\alpha elsewhere.
QQ plot — sorted, standardised data plotted against the quantiles a reference distribution (usually the normal) predicts; points on the diagonal mean a match, bending ends reveal the tails.
Power law — a relationship in which one quantity varies as a power of another; for a tail, ℙ(X>x)∝x−ζ\Prob(X \gt x) \propto x^{-\zeta}, a straight line on log–log axes and scale-free.
Moment — an average of a power of the distance from the mean, 𝔼[(X−μ)n]\E[(X - \mu)^n]; the second moment is the variance, and the third and fourth (divided by the matching power of σ\sigma) give skewness and kurtosis.
Excess kurtosis — kurtosis minus 3, so it is zero for a normal and positive for fat tails; scipy and pandas report it by default, MATLAB does not.
Hill estimator — an estimate of the tail index ζ\zeta from the kk largest losses, 1/ζˆk=1k∑i=1kln⁡X(i)−ln⁡X(k+1)1/\hat\zeta_k = \tfrac{1}{k}\sum_{i=1}^{k} \ln X_{(i)} - \ln X_{(k+1)} (Hill 1975); sensitive to the choice of kk, the threshold.
Jump-diffusion model — a constant-volatility diffusion plus rare, randomly timed jumps (a compound Poisson process); produces negative skew and fat tails from the jumps alone, unlike a GARCH market's time-varying volatility.
Hill plot — the Hill estimate ζˆk\hat\zeta_k plotted against the threshold kk, used to look for a stable stretch instead of trusting a single kk.

Check yourself

1. A risk report says a strategy's daily returns show excess kurtosis of 4.5 over the last ten years, so its tails are "only mildly fat". What do you say?
That a small sample kurtosis proves nothing. Its standard error depends on the eighth moment, which may be infinite, so most samples miss the days that make the true value large. In §3.2.4 a market with a true excess kurtosis of 28.3 reported a median of 4.5 per decade. Look at a QQ plot and a Hill plot instead.
2. A strategy's QQ plot against the normal hugs the line, except that its right end bends sharply upwards. What kind of strategy might this be, and is that tail good or bad news?
A fat right tail with a normal-looking left one: positive skewness, occasional large gains — the profile of strategies that buy options. It is good news for the P&L distribution, but it usually comes with many small losses, and it is the mirror image of the jump-diffusion's left end in fig 3.2.6.
3. You run the Hill estimator on 40 years of daily losses and get 3.4, 2.8 and 2.2 using the largest 50, 250 and 1,000 losses. Which number do you report?
None of them alone. The estimate at kk = 1,000 reaches into the body of the distribution and is biased downward; the one at kk = 50 is noisy (about ±0.4 for a 40-year sample in the lab). Plot ζˆ\hat\zeta against kk, look for a roughly flat stretch, and report a range such as "about 2.5 to 3.5", noting that clustered returns make the nominal standard errors too small.
4. A stock index starts at $100 with 7% expected growth and 20% volatility a year. A planner quotes you the expected level in 30 years. Is that the outcome you should plan around?
No. The price is roughly lognormal and very skewed at that horizon: the mean, $816.62, is pulled up by rare lucky paths, while the median is $448.17 and 70.8% of paths end below the mean. Plan around the median and a bad quantile, not the mean.
5. A vendor's risk model says a 6σ daily loss happens once every 4,022,201 years. Your firm has seen three in 40 years. Were you unlucky?
Almost certainly not; the model is wrong. That wait is the normal's. Under a cubic power law, or the GARCH-t market of §3.2.4 (a 6σ fall every 5.9 years), three in 40 years is unremarkable. The σ was probably measured in calm markets, and the tails were never normal.
6. Two strategies have the same volatility. One has normal returns, the other Student-t(3) returns. How much deeper is the second one's one-in-a-thousand-days loss, and what does that mean for sizing?
The normal's is 3.09σ, the Student-t(3)'s 5.90σ — almost twice as deep at the same σ. Sizing both by volatility gives them the same position, but the fat-tailed one should be smaller if the constraint is the worst day you can survive.
🔧 Homework (~1 h before Session 3.3)

1. Real data: download the daily "Fama/French 3 Factors" file from the Kenneth French data library and rebuild the market's daily return as Mkt-RF + RF (both are in percent). For each decade, compute the excess kurtosis; over the whole sample, count the falls beyond 4σ and 5σ against the normal's expectation, draw a QQ plot, and draw a Hill plot of the largest losses. Is there a flat stretch, and does it sit inside Cont's range of 2 to 5?
2. In the lab, add a cell after section 3: nu_hat, loc_hat, scale_hat = stats.t.fit(garch[:40].ravel()). Is the fitted ν\nu equal to the shocks' ν\nu = 6? Explain in two sentences why not.
3. Read Cont (2001), sections 1 to 4, and the part of Gabaix (2009) on the cubic law of returns. Write down one stylized fact you expect Session 5.1 to measure, and how you would test it.

📚 Go deeper

  1. Cont, R. (2001). "Empirical properties of asset returns: stylized facts and statistical issues." Quantitative Finance 1(2), 223–236. doi:10.1080/713665670
  2. Gabaix, X. (2009). "Power Laws in Economics and Finance." Annual Review of Economics 1, 255–294. doi:10.1146/annurev.economics.050708.142940
  3. McNeil, A. J., Frey, R. & Embrechts, P. (2015). Quantitative Risk Management: Concepts, Techniques and Tools, revised ed., ch. 3 "Empirical Properties of Financial Data" and ch. 5 "Extreme Value Theory". Princeton University Press. ISBN 978-0-691-16627-8
  4. Embrechts, P., Klüppelberg, C. & Mikosch, T. (1997). Modelling Extremal Events for Insurance and Finance. Springer. ISBN 978-3-540-60931-5
  5. Clauset, A., Shalizi, C. R. & Newman, M. E. J. (2009). "Power-Law Distributions in Empirical Data." SIAM Review 51(4), 661–703. doi:10.1137/070710111
  6. Taleb, N. N. (2025). Statistical Consequences of Fat Tails: Real World Preasymptotics, Epistemology, and Applications, 3rd ed. STEM Academic Press. The figure quoted here is from ch. 3, Table 3.3. arXiv:2001.10488

Sources for the numbers

  1. Gopikrishnan, P., Plerou, V., Amaral, L. A. N., Meyer, M. & Stanley, H. E. (1999). "Scaling of the distribution of fluctuations of financial market indices." Physical Review E 60(5), 5305–5316. doi:10.1103/PhysRevE.60.5305
  2. Gopikrishnan, P., Meyer, M., Amaral, L. A. N. & Stanley, H. E. (1998). "Inverse cubic law for the distribution of stock price variations." The European Physical Journal B 3(2), 139–140. doi:10.1007/s100510050292 · arXiv:cond-mat/9803374
  3. Mandelbrot, B. (1963). "The Variation of Certain Speculative Prices." The Journal of Business 36(4), 394–419. doi:10.1086/294632
  4. Hill, B. M. (1975). "A Simple General Approach to Inference About the Tail of a Distribution." The Annals of Statistics 3(5), 1163–1174. doi:10.1214/aos/1176343247
  5. Drees, H., de Haan, L. & Resnick, S. (2000). "How to make a Hill plot." The Annals of Statistics 28(1), 254–274. doi:10.1214/aos/1016120372
  6. Westfall, P. H. (2014). "Kurtosis as Peakedness, 1905–2014. R.I.P." The American Statistician 68(3), 191–195. doi:10.1080/00031305.2014.917055
  7. Osborne, M. F. M. (1959). "Brownian Motion in the Stock Market." Operations Research 7(2), 145–173. doi:10.1287/opre.7.2.145
  8. Dowd, K., Cotter, J., Humphrey, C. & Woods, M. (2008). "How Unlucky Is 25-Sigma?" The Journal of Portfolio Management 34(4), 76–80. doi:10.3905/jpm.2008.709984 · arXiv:1103.5672
  9. Bernhardt, D. & Eckblad, M. (2013). "Stock Market Crash of 1987." Federal Reserve History. https://www.federalreservehistory.org/essays/stock-market-crash-of-1987