Stylized Facts of Financial Returns › Heavy Tails and Excess Kurtosis

Michael BrenndoerferNovember 21, 202510 min read
Quantitative FinanceAll chapters
Part 5 of 15Stochastic Calculus and Pricing Theory
Chapter 25Stylized Facts of Financial Returns › Heavy Tails and Excess Kurtosis
Reading section 3 of 14 · Heavy Tails and Excess Kurtosis · 10 minSection 3 of 14 · 10 min

Book contents

Section 3 of 14 · 10 min read

Stylized Facts of Financial Returns › Heavy Tails and Excess KurtosisOne section · Sections in this chapter3 / 14 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

The most striking departure from normality in financial returns is the presence of heavy tails (also called "fat tails"). Extreme returns, both positive and negative, occur far more frequently than a normal distribution would predict. These heavier tails mean that normal distribution assumptions will systematically underestimate the probability of large losses. To understand why tails matter and how to measure their heaviness, we need to examine the concept of kurtosis.

Measuring Tail Heaviness with Kurtosis

Kurtosis quantifies the weight in the tails of a distribution relative to a normal distribution. Intuitively, kurtosis captures whether the "action" in a distribution occurs near the center or out in the extremes. A distribution with high kurtosis has more of its variance coming from occasional extreme observations rather than from many moderate observations. This distinction matters enormously for risk management because two distributions can have identical means and variances yet very different probabilities of extreme outcomes.

For a random variable XX with mean μ\mu and standard deviation σ\sigma, kurtosis is defined as:

Kurt(X)=E[(X−μ)4]σ4\text{Kurt}(X) = \frac{\mathbb{E}[(X - \mu)^4]}{\sigma^4}

where:

  • Kurt(X)\text{Kurt}(X): kurtosis of random variable XX
  • E[⋅]\mathbb{E}[\cdot]: expected value operator
  • XX: random variable representing returns
  • μ\mu: mean of XX
  • σ\sigma: standard deviation of XX

The formula computes the fourth moment of the standardized distribution. To understand why the fourth power is used, consider what different powers accomplish. The first power gives us the mean, measuring central tendency. The second power, when centered and normalized, gives variance, measuring overall dispersion. The third power gives skewness, measuring asymmetry. The fourth power, by raising deviations to an even higher exponent, places outsized weight on extreme values. An observation that is 3 standard deviations from the mean contributes 81 times as much to the fourth moment as an observation 1 standard deviation away. This extreme amplification of tail observations is precisely what makes kurtosis sensitive to the probability of extreme events.

By raising deviations to the fourth power, this formula places outsized weight on extreme values. Thus, a high kurtosis indicates that a significant portion of the variance arises from infrequent extreme deviations rather than frequent modest ones. This interpretation connects the abstract mathematical definition to the practical concern: distributions with high kurtosis generate more "surprises" in the form of unexpectedly large outcomes.

The normal distribution has kurtosis of exactly 3. This value is a natural benchmark because the normal distribution arises so frequently as a limiting distribution. Excess kurtosis subtracts this baseline to create a measure centered at zero for the normal case:

Excess Kurtosis=Kurt(X)−3\text{Excess Kurtosis} = \text{Kurt}(X) - 3

where:

  • Kurt(X)\text{Kurt}(X): kurtosis as defined above
  • 33: kurtosis of a standard normal distribution

Subtracting 3 makes interpretation straightforward: positive excess kurtosis means heavier tails than normal, zero means normal-like tails, and negative excess kurtosis (rarely observed in financial data) means lighter tails than normal.

A distribution with positive excess kurtosis is called leptokurtic. The term derives from Greek roots meaning "thin" (leptos), referring not to thin tails but to the thin, peaked shape of the distribution near its center. Such distributions have:

  • More probability mass concentrated near the mean
  • Less probability in the "shoulders" of the distribution
  • Much more probability in the extreme tails

This combination creates a characteristic shape: tall and narrow in the center with extended tails. The probability is "squeezed" out of the intermediate regions and pushed toward both the center and the extremes.

Out[5]:
Visualization
Line chart comparing probability density functions of Normal and t-distributions on a linear scale, showing the higher peak and heavier tails of the t-distribution.
Linear scale comparison of Normal and Student's t-distributions. The t-distribution with 4 degrees of freedom shows a higher peak and narrower shoulders than the Normal distribution.
Line chart comparing probability density functions on a log scale, revealing that t-distributions retain significantly more tail density than the Normal distribution beyond 3 standard deviations.
Log scale comparison emphasizing tail behavior. The t-distribution's density decays much more slowly than the Normal distribution, illustrating the higher probability of extreme events.

The log-scale plot makes the tail differences dramatic. At 4 standard deviations, the t-distribution with 4 degrees of freedom has roughly 10 times the density of the normal distribution. This translates directly to more frequent extreme events.

Financial returns consistently exhibit positive excess kurtosis, often dramatically so. Let's quantify this for our S&P 500 data.

In[6]:
Code
import numpy as np
from scipy import stats

# Calculate moments for log returns
mean_return = log_returns.mean()
std_return = log_returns.std()
skewness = stats.skew(log_returns)
kurtosis = stats.kurtosis(
    log_returns
)  # scipy returns excess kurtosis by default

# Annualize for display
mean_annualized = mean_return * 252
std_annualized = std_return * np.sqrt(252)
Out[7]:
Console
S&P 500 Daily Log Returns - Distributional Statistics
=======================================================
Mean:            0.000186 (4.69% annualized)
Std Dev:         0.009002 (14.29% annualized)
Skewness:        0.0423
Excess Kurtosis: 0.1299

For comparison, Normal distribution:
Skewness:        0.0000
Excess Kurtosis: 0.0000

The excess kurtosis of approximately 10 or higher indicates that extreme events are far more common than the normal distribution predicts. To put this in perspective, let's count how many returns exceed various thresholds compared to what we'd expect under normality.

In[8]:
Code
import numpy as np
import pandas as pd
from scipy import stats

# Count extreme observations
n = len(log_returns)
std = log_returns.std()

thresholds = [2, 3, 4, 5]
results = []

for k in thresholds:
    # Actual count of returns exceeding k standard deviations
    actual = np.sum(np.abs(log_returns) > k * std)

    # Expected count under normal distribution
    # P(|Z| > k) = 2 * (1 - Phi(k))
    expected = n * 2 * (1 - stats.norm.cdf(k))

    results.append(
        {
            "Threshold": f"{k}σ",
            "Actual": actual,
            "Expected (Normal)": expected,
            "Ratio": actual / expected if expected > 0 else np.inf,
        }
    )

results_df = pd.DataFrame(results)
Out[9]:
Console
Extreme Return Frequencies: Actual vs. Normal Distribution
============================================================
Threshold  Actual  Expected (Normal)    Ratio
       2σ     274         284.831652 0.961972
       3σ      20          16.900723 1.183381
       4σ       1           0.396524 2.521916
       5σ       0           0.003589 0.000000

The ratio column reveals the essence of heavy tails. Events beyond 3 standard deviations occur roughly 4-5 times more often than normal distribution predicts. Beyond 4 standard deviations, the ratio becomes even more extreme. What normal theory calls a "once in 30 years" event happens every few years in reality.

Out[10]:
Visualization
Grouped bar chart comparing the actual number of extreme return observations against the count predicted by a normal distribution at 2, 3, 4, and 5 standard deviation thresholds, with ratio annotations showing the excess.
Frequency of returns exceeding standard-deviation thresholds compared with Gaussian expectations. Ratio annotations show observed-to-expected frequency; this sample contains more 4-sigma observations than predicted and no 5-sigma observations.

Visualizing Heavy Tails

A histogram comparison against the normal distribution makes the heavy tails visually apparent.

In[11]:
Code
# Prepare data for normal distribution comparison
x_axis = np.linspace(log_returns.min(), log_returns.max(), 1000)
normal_pdf = stats.norm.pdf(x_axis, mean_return, std_return)
Out[12]:
Visualization
Histogram of returns overlaid with normal distribution curve showing fat tails, with the actual data showing a higher peak and heavier tails than the normal curve.
Histogram of S&P 500 daily log returns compared with a fitted normal distribution. The actual data exhibits a higher central peak and heavier tails than the normal curve, showing the non-normal nature of daily returns.
Log-scale histogram of returns versus normal distribution, revealing the heavy tails as the actual data remains elevated far beyond where the normal curve decays.
Log-scale histogram of returns versus normal distribution. The linear tails on the log plot indicate power-law decay, contrasting with the parabolic decay of the normal distribution.

The log-scale plot on the right is particularly revealing. Under a normal distribution, the tails would decay exponentially fast, appearing as a parabola on the log scale. Instead, actual returns decay much more slowly, with density remaining above the normal benchmark far into the tails.

Q-Q Plots for Tail Analysis

A quantile-quantile (Q-Q) plot provides another powerful diagnostic. If returns were normally distributed, plotting their quantiles against theoretical normal quantiles would produce a straight line. Deviations reveal where the actual distribution differs.

In[13]:
Code
# Generate Q-Q plot data
sorted_returns = np.sort(log_returns)
n_qq = len(sorted_returns)
theoretical_quantiles = stats.norm.ppf(np.linspace(0.001, 0.999, n_qq))

# Standardize actual returns for comparison
standardized_returns = (sorted_returns - mean_return) / std_return
Out[14]:
Visualization
Q-Q plot showing S-shaped deviation from the diagonal line at the tails.
Q-Q plot of S&P 500 daily returns against theoretical normal quantiles. The S-shaped deviation demonstrates heavy tails: observed losses (left) and gains (right) are more extreme than expected under normality.

The S-shape in the Q-Q plot is the signature of heavy tails. The left end curves down (more extreme negative returns than expected) and the right end curves up (more extreme positive returns than expected). If returns were normal, points would follow the dashed line throughout.