Kurtosis

Kurtosis is a measure of tailedness of a distribution. It defines how often outliers occur.
Distributions having medium kurtosis are known as mesokurtic.
Distributions having low kurtosis are known as platykurtic
Distributions having high kurtosis are known as leptokurtic.
We can call Tails are the end of the distribution. It represents the probability or frequency of the extreme values or low values as compared to mean.
What is a MesoKurtic Distribution?
A medium tailed distribution in which outliers are neither highly frequent nor highly infrequent. Kurtosis are measured in comparison to the normal distribution.
A normal Distribution have a Kurtosis of 3 so any distribution have a kurtosis approx of 3 is considered as MesoKurtic Distribution.
Normal Distribution have an excess curtosis 0 so any distribution having excess kurtosis of 0 can be considered as MesoKurtic.
What is PlatyKurtic Distribution?
It is a thin tailed distribution which means the outliers of the distribution are infrequent.
PlatyKurtic have a kurtosis less than 3.
PlatyKurtic have excess kurtosis less than 0.
It is also called negative kurtosis since the excess kurtosis is in negative.
What is LeptoKurtic Distribution?
It is a fat tailed distribution which means there are a lot of outliers.
LeptoKurtic have a Kurtosis more than 3.
LeptoKurtic have excess Kurtosis more then 0.
It is also known as positive Kurtosis since excess kurtosis is more than 0.
Mathematical Representation of Calculating Kurtosis.
If you have the entire population data:
N = Total population
μ = population mean
If you have the sample data:
nnn = sample size
xˉ\bar{x}xˉ = sample mean
sss = sample standard deviation
This formula:
The first term adjusts for bias.
The second term subtracts the bias to give excess kurtosis (normal distribution = 0).
Let’s take a Portfolio returns example to show the implementation of Kurtosis among to it.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kurtosis, norm
# Portfolio monthly returns (%)
returns = [1.2, 0.8, 1.5, -0.5, 2.0, -1.2, 5.5, -4.8, 0.7, 6.2, -3.0, 1.0]
returns_series = pd.Series(returns)
# Calculate kurtosis (Pearson and Fisher)
kurt_pearson = kurtosis(returns_series, fisher=False) # normal dist = 3
kurt_fisher = kurtosis(returns_series, fisher=True) # normal dist = 0
# Print results
print(f"Portfolio Kurtosis (Pearson): {kurt_pearson:.2f}")
print(f"Portfolio Kurtosis (Fisher): {kurt_fisher:.2f}")
if kurt_pearson > 3:
interpretation = "Fat tails detected – higher risk of extreme returns."
elif kurt_pearson < 3:
interpretation = "Thin tails – portfolio returns are relatively stable."
else:
interpretation = "Similar to normal distribution – occasional extremes."
print(f"Interpretation: {interpretation}")
# Visualization: Histogram with normal curve
plt.figure(figsize=(8,5))
count, bins, ignored = plt.hist(returns, bins=8, density=True, alpha=0.6, color='skyblue', edgecolor='black')
# Normal curve for comparison
mu, sigma = np.mean(returns), np.std(returns)
x = np.linspace(min(bins), max(bins), 100)
plt.plot(x, norm.pdf(x, mu, sigma), 'r', linewidth=2, label='Normal Distribution')
plt.title(f"Portfolio Returns Distribution\nKurtosis (Pearson) = {kurt_pearson:.2f}")
plt.xlabel("Monthly Return (%)")
plt.ylabel("Density")
plt.legend()
plt.grid(True)
plt.show()
We can see that the it forms a platykurtic graph.
Subscribe to my newsletter
Read articles from Aditya Jaiswal directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
