Binomial Tree Option Pricing › Convergence to Black-Scholes
Quantitative FinanceAll chapters Binomial Tree Option Pricing › Convergence to Black-ScholesOne section · Sections in this chapter6 / 12 ↓
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
One of the most elegant properties of the binomial model is its convergence to the Black-Scholes price as the number of steps increases. This convergence validates that the binomial approach captures the same economic principles as the continuous-time framework. It also offers practical assurance that binomial trees produce accurate prices when enough steps are used.
Theoretical Convergence
As we discussed in Part III Chapter 2, the binomial random walk converges in distribution to geometric Brownian motion as (a consequence of the central limit theorem applied to the sum of log-returns). Each step in the binomial tree contributes a small random increment to the log-price, and the sum of many such increments becomes normally distributed. Since the Black-Scholes model assumes geometric Brownian motion, and since both models use risk-neutral valuation, the binomial price converges to the Black-Scholes price.
The rate of convergence for European options is , meaning doubling the number of steps roughly halves the error. However, convergence is not monotonic: prices oscillate around the true value, particularly for at-the-money options. This oscillation arises from the discrete nature of the tree and how the strike price falls relative to the tree's nodes at each step.
import numpy as np
from scipy.stats import norm
def black_scholes_price(S0, K, T, r, sigma, option_type="call"):
"""Calculate Black-Scholes price for European options."""
d1 = (np.log(S0 / K) + (r + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
if option_type == "call":
price = S0 * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
else:
price = K * np.exp(-r * T) * norm.cdf(-d2) - S0 * norm.cdf(-d1)
return price# Compare binomial convergence to Black-Scholes
S0 = 100
K = 100
T = 1
r = 0.05
sigma = 0.2
bs_price = black_scholes_price(S0, K, T, r, sigma, "call")
# Calculate convergence data
step_counts = [10, 25, 50, 100, 200, 500, 1000]
convergence_data = []
for N in step_counts:
binomial_price = binomial_tree_european(S0, K, T, r, sigma, N, "call")
error = binomial_price - bs_price
pct_error = 100 * error / bs_price
convergence_data.append((N, binomial_price, error, pct_error))Black-Scholes Call Price: $10.450584
Binomial Tree Convergence:
---------------------------------------------
N Binomial Error % Error
---------------------------------------------
10 $ 10.253409 -0.197175 -1.8867%
25 $ 10.520966 0.070382 0.6735%
50 $ 10.410692 -0.039892 -0.3817%
100 $ 10.430612 -0.019972 -0.1911%
200 $ 10.440591 -0.009992 -0.0956%
500 $ 10.446585 -0.003998 -0.0383%
1000 $ 10.448584 -0.001999 -0.0191%

The characteristic oscillation occurs because of how the strike price falls relative to the tree's nodes. For even N, the strike may fall exactly on a node, while for odd N it falls between nodes. This creates alternating over- and under-estimation that damps out as N increases.
Convergence Rate Analysis
The error decreases roughly proportionally to :
# Analyze convergence rate
N_values = [25, 50, 100, 200, 400, 800]
errors = []
products = []
for N in N_values:
binomial_price = binomial_tree_european(S0, K, T, r, sigma, N, "call")
err = abs(binomial_price - bs_price)
errors.append(err)
products.append(N * err)Convergence Rate Analysis:
--------------------------------------------------
N |Error| N × |Error|
--------------------------------------------------
25 0.070382 1.7596
50 0.039892 1.9946
100 0.019972 1.9972
200 0.009992 1.9985
400 0.004998 1.9991
800 0.002499 1.9994
If convergence is O(1/N), then N × |Error| should be roughly constant.The product being approximately constant confirms the convergence rate. This means that to reduce the error by a factor of 10, we need to increase the number of steps by a factor of 10, which has practical implications for computational cost.