Finite Difference Methods for Option Pricing › Convergence Analysis and Method Comparison
Quantitative FinanceAll chapters Finite Difference Methods for Option Pricing › Convergence Analysis and Method ComparisonOne section · Sections in this chapter7 / 14 ↓
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
Now let's compare all three finite difference methods against the analytical Black-Scholes formula to assess their accuracy and convergence properties.
from scipy.stats import norm
def black_scholes_call(S, K, T, r, sigma):
"""Analytical Black-Scholes call price."""
d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
# Analytical price
bs_price = black_scholes_call(S_0, K, T, r, sigma)Black-Scholes analytical price: $10.450584 Finite difference prices: Explicit (N=5000): $10.440896 Error: $0.009688 Implicit (N=500): $10.438580 Error: $0.012004 Crank-Nicolson (N=500): $10.440686 Error: $0.009897
All three methods converge to the analytical Black-Scholes price. The Crank-Nicolson scheme achieves an error comparable to the implicit scheme in this snapshot, but with better theoretical convergence properties that become apparent on finer grids.
Convergence Study
Let's examine how the error decreases as we refine the grid. This reveals the order of convergence for each method.
# Convergence study
M_values = [50, 100, 200, 400]
errors_cn = []
errors_implicit = []
for m_sim in M_values:
n_sim = 10 * m_sim # Keep ratio fixed
# Crank-Nicolson
S_grid, V = crank_nicolson_european_call(
S_max, K, T, r, sigma, m_sim, n_sim
)
idx = np.argmin(np.abs(S_grid - S_0))
errors_cn.append(abs(V[idx] - bs_price))
# Implicit
S_grid, V = implicit_european_call(S_max, K, T, r, sigma, m_sim, n_sim)
idx = np.argmin(np.abs(S_grid - S_0))
errors_implicit.append(abs(V[idx] - bs_price))
The convergence plot shows that both methods become more accurate as the coupled price and time grids are refined. Crank-Nicolson produces the smaller error at every tested resolution. Since this experiment changes and together, its slope combines spatial and temporal effects; isolating a formal convergence order would require holding one discretization error negligible while varying the other.