🎉 75% of content is free forever — Unlock Premium from $10/mo →
CW
Search courses…
💼 Servicesℹ️ About✉️ ContactView Pricing Plansfrom $10

Kurtosis — Fat Tails and Extreme Events

Foundations of StatisticsDescriptive Statistics🟢 Free Lesson

Advertisement

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

Excess Kurtosis=μ4σ43\text{Excess Kurtosis} = \frac{\mu_4}{\sigma^4} - 3

Here,

  • μ4\mu_4=Fourth central moment of the distribution
  • σ\sigma=Standard deviation
  • 00=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}")
TypeExcess KurtosisShapeExample
Mesokurtic= 0Normal-likeNormal distribution
Leptokurticgreater than 0Fat tails, sharp peakt-distribution, daily returns
Platykurticless than 0Thin tails, flat peakUniform 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 ApplicationKurtosis UsageWhy
Outlier detectionHigh kurtosis = heavy tailsMore outliers expected
Feature engineeringLow kurtosis → transformNormality helps linear models
Risk managementFat tails = extreme eventsFinancial ML models
Data qualityUnexpected kurtosis = data issuesSanity 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."

Premium Content

Kurtosis — Fat Tails and Extreme Events

Unlock this lesson and 900+ advanced tutorials with a Premium plan.

🎯End-to-end Projects
💼Interview Prep
📜Certificates
🤝Community Access

Already a member? Log in

Need Expert Statistics Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement