Why do we use a normal distribution in Monte Carlo Simulations ?

Sirine Amrane
3 min readJan 18, 2025

--

In Monte Carlo simulations, particularly in finance, a recurring question arises: why assume that asset returns follow a normal distribution? While this assumption underpins many financial models, it is not always reflective of real-world data. This article explores the theoretical justification for using the normal distribution, its limitations, and provides a Python-based practical demonstration for modeling financial scenarios.

The Role of the Normal Distribution in Finance

Origins and Use in Financial Models

The normal distribution, also known as the Gaussian distribution, is a cornerstone of many financial models. Here’s why it is frequently employed:

  1. Aggregating Independent Events: Financial asset prices are influenced by numerous small, independent events — investor decisions, news, and macroeconomic factors. According to the Central Limit Theorem, the sum of these independent random variables tends to follow a normal distribution under certain conditions.
  2. Foundation for Analytical Models: Models like the Black-Scholes framework for option pricing assume log-normality of prices (implying normality in continuously compounded returns). This simplifies calculations and ensures tractable analytical solutions.
  3. Ease of Implementation: The normal distribution is defined by only two parameters:
  • Mean (μ): Represents the expected return.
  • Standard deviation (σ): Measures volatility, often interpreted as risk.

Standard Normal Distribution

A standard normal distribution is a special case of the normal distribution where:

  • μ = 0 (mean is 0)
  • σ = 1 (standard deviation is 1)

It serves as the base for generating random variables. To simulate asset-specific returns, the following transformation is used:

R=μ+Z⋅σR = \mu + Z \cdot \sigmaR=μ+Z⋅σ

where ZZZ is a random variable drawn from the standard normal distribution.

Limitations of the Normal Distribution in Finance

While the normal distribution is widely used, it has significant limitations when applied to financial data:

  1. Fat Tails: Empirical studies show that extreme events (e.g., market crashes) occur more frequently than predicted by a normal distribution. This phenomenon, called “fat tails,” is better captured by distributions such as the Student-t or Pareto.
  2. Skewness: Real-world returns are often asymmetric, whereas the normal distribution is inherently symmetric.
  3. Simplistic Assumptions: The assumption of normality overlooks structural complexities in financial markets, particularly during times of high volatility or economic stress.

Testing the Normality of Financial Returns

To assess whether returns follow a normal distribution, two main approaches can be used:

Visual Analysis:

  • Plot a histogram of the returns.
  • Overlay a fitted normal distribution for comparison.

Statistical Tests:

  • Shapiro-Wilk Test: Tests for normality.
  • Kolmogorov-Smirnov Test: Compares the empirical distribution to a theoretical normal distribution.

Python example: Monte Carlo Simulation and normality testing

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import shapiro, kstest, norm

# Parameters for the simulation
mean_return = 0.05 # Annualized mean return (5%)
volatility = 0.2 # Annualized volatility (20%)
time_horizon = 1 # 1 year
simulations = 10000 # Number of Monte Carlo simulations

# Generate normally distributed returns
np.random.seed(42)
random_returns = np.random.normal(loc=mean_return, scale=volatility, size=simulations)

# Visualizing the distribution of simulated returns
plt.hist(random_returns, bins=50, density=True, alpha=0.6, color='blue', label="Simulated Returns")
x = np.linspace(-0.5, 0.6, 100)
plt.plot(x, norm.pdf(x, mean_return, volatility), 'r--', label="Normal Distribution")
plt.title("Histogram of Simulated Returns")
plt.xlabel("Return")
plt.ylabel("Density")
plt.legend()
plt.show()

# Testing for normality
shapiro_stat, shapiro_p = shapiro(random_returns)
ks_stat, ks_p = kstest(random_returns, 'norm', args=(mean_return, volatility))

print("Shapiro-Wilk Test:")
print(f"Statistic: {shapiro_stat:.4f}, p-value: {shapiro_p:.4f}")
if shapiro_p > 0.05:
print("Fail to reject the null hypothesis: Returns are normally distributed.")
else:
print("Reject the null hypothesis: Returns are not normally distributed.")

print("\nKolmogorov-Smirnov Test:")
print(f"Statistic: {ks_stat:.4f}, p-value: {ks_p:.4f}")
if ks_p > 0.05:
print("Fail to reject the null hypothesis: Returns follow a normal distribution.")
else:
print("Reject the null hypothesis: Returns do not follow a normal distribution.")

Conclusion

The assumption of normality in Monte Carlo simulations is convenient and mathematically elegant, enabling simplified risk modeling and scenario generation. However, real-world financial data often deviates from this ideal due to fat tails and skewness. By using statistical tests and visualization, you can verify the suitability of this assumption for your specific dataset and decide whether alternative distributions might better capture the nuances of financial returns

Sirine Amrane

--

--

Sirine Amrane
Sirine Amrane

No responses yet