Kurtosis
Descriptive Statistics
Where Do Extreme Events Hide?
Kurtosis measures the heaviness of a distribution's tails — and reveals whether extreme events are rare surprises or regular visitors.
Understanding kurtosis helps you:
- Assess tail risk — know if crashes and outliers are more frequent than a normal model predicts
- Evaluate models — detect when a normal assumption dangerously underestimates extreme events
- Classify distributions — distinguish mesokurtic, leptokurtic, and platykurtic shapes
- Test normality — combine with skewness in the Jarque-Bera test for a rigorous check
In finance and science, the tails are where the action is. Kurtosis tells you how thick they are.
What is Kurtosis?
Definition
Kurtosis measures the tailedness of a distribution — how much probability mass is in the tails relative to a normal distribution. Excess kurtosis subtracts 3 (the normal distribution's kurtosis) so that the normal baseline is zero.
Excess Kurtosis
Here,
- =Fourth central moment of the distribution
- =Standard deviation
- =Excess kurtosis of a normal distribution (baseline)
import numpy as np
from scipy import stats
np.random.seed(42)
n = 5000
normal = np.random.normal(0, 1, n)
t3 = np.random.standard_t(df=3, size=n) # fat tails
uniform = np.random.uniform(-3, 3, n) # thin tails
for name, data in [("Normal", normal), ("t(df=3) Fat-tail", t3), ("Uniform Thin-tail", uniform)]:
ek = stats.kurtosis(data, fisher=True) # Fisher's: normal=0
print(f"{name:<22}: Excess Kurtosis = {ek:+.4f}")
| Type | Excess Kurtosis | Shape | Example |
|---|---|---|---|
| Mesokurtic | = 0 | Normal-like | Normal distribution |
| Leptokurtic | greater than 0 | Fat tails, sharp peak | t-distribution, daily returns |
| Platykurtic | less than 0 | Thin tails, flat peak | Uniform distribution |
Fat Tails in Finance
# Simulate daily stock returns — compare crash frequency
normal_rets = np.random.normal(0, 0.01, 2520)
fat_rets = np.random.standard_t(5, 2520) * 0.01
threshold = 0.03 # 3% daily move
print(f"Normal model >3% moves: {np.sum(np.abs(normal_rets)>threshold)}/2520")
print(f"Fat-tail model >3% moves: {np.sum(np.abs(fat_rets)>threshold)}/2520")
print("Fat tails vastly increase extreme event frequency!")
Why Fat Tails Matter
Normal-distribution risk models drastically underestimate the frequency of extreme market events. Financial returns are almost always leptokurtic.
Jarque-Bera Test for Normality
# Combines skewness and kurtosis into a single normality test
for name, data in [("Normal", normal), ("t(df=3)", t3)]:
jb_stat, p = stats.jarque_bera(data)
reject = "YES — not normal" if p < 0.05 else "NO — cannot reject normality"
print(f"{name}: JB={jb_stat:.2f}, p={p:.6f} -> Reject normality? {reject}")
Jarque-Bera Test
The Jarque-Bera test uses both skewness and kurtosis to assess normality. A significant p-value (p < 0.05) indicates the data is not normally distributed.
Kurtosis in Machine Learning
| ML Application | Kurtosis Usage | Why |
|---|---|---|
| Outlier detection | High kurtosis = heavy tails | More outliers expected |
| Feature engineering | Low kurtosis → transform | Normality helps linear models |
| Risk management | Fat tails = extreme events | Financial ML models |
| Data quality | Unexpected kurtosis = data issues | Sanity check pipeline |
import numpy as np
from scipy.stats import kurtosis
np.random.seed(42)
# Kurtosis and outlier detection
normal_data = np.random.normal(0, 1, 1000)
heavy_tailed = np.random.standard_t(df=3, size=1000)
print(f"Normal: kurtosis = {kurtosis(normal_data):.3f} (mesokurtic)")
print(f"t(3): kurtosis = {kurtosis(heavy_tailed):.3f} (leptokurtic, more outliers)")
# Count extreme values
extreme_normal = np.sum(np.abs(normal_data) > 3) / len(normal_data)
extreme_heavy = np.sum(np.abs(heavy_tailed) > 3) / len(heavy_tailed)
print(f"\nValues beyond ±3σ:")
print(f"Normal: {extreme_normal:.3%}")
print(f"t(3): {extreme_heavy:.3%} (more extremes due to heavy tails)")
Key Takeaways
Excess kurtosis = 0 for normal; greater than 0 = fat tails; less than 0 = thin tails
Leptokurtic distributions produce more extreme outliers than normal theory predicts
Financial returns are almost always leptokurtic — risk models must account for this
Jarque-Bera test formally tests normality using both skewness and kurtosis
"Kurtosis is the probability of the improbable. Ignore it, and the tails will bite you."