No of Post Views:

34 hits

Introduction: Beyond a Constant World

In the landscape of quantitative finance, the Black-Scholes-Merton (BSM) model stands as a biggest achievement. It provides an elegant, closed-form solution for pricing European options, built upon a world of simplifying assumptions. This is the “Flatland” of finance. In this world, volatility is a single constant number. It is a beautiful, simple world, but it is not the world we live in. The market, through the prices of traded options, tells a different, more complex story. When we listen closely to that story, a distinct pattern emerges, a pattern shaped like a smile.

This tutorial is an expedition out of Flatland. It is a practical guide for the ambitious quant learner. The guide takes you on a journey from foundational theory to real-world application. It explores the models that bring depth and curvature to our understanding of volatility. This journey will unfold in four parts.

  • First, we will examine how the BSM model’s own logic reveals its fundamental flaw. It is a phenomenon that proves volatility is anything but constant. ‘Volatility Smile’ it is.
  • Second, we will explore the theoretical framework of local volatility. In this paradigm, volatility is no longer a fixed parameter. Instead, it becomes a dynamic function of asset price and time. We will learn the elegant Dupire model. It is practically challenging but allows us to reverse-engineer this function directly from market prices.
  • Third, we acknowledge the numerical hurdles of the Dupire model. We will build a powerful, pragmatic tool: the Constant Elasticity of Variance (CEV) model. This parametric model captures the most essential features of the smile with remarkable efficiency.
  • Finally, we will perform the ultimate act of a practicing quant: calibrating our CEV model to the market.

By the end of this journey, the reader will have gained a nuanced understanding of these advanced models. They will also acquire the practical skills to implement and test them.

Part 1: The Black-Scholes World and Its Cracks

This part establishes the foundational Black-Scholes-Merton model as our benchmark. We will introduce the concept of using market prices to infer a key unobservable parameter: Implied Volatility. We then use this very concept to demonstrate the model’s failure; and setting the stage for the more advanced models to follow.

1.1 The Benchmark: A Quick Refresher on the Black-Scholes-Merton Model

The Black-Scholes-Merton (BSM) model was first published in 1973. It revolutionized finance by providing the first widely accepted closed-form formula for pricing European options. The formula for the price of a European call option at time t=0 is given by:

Mathematical formula representing the Black-Scholes-Merton model for pricing European call options, including equations for d1 and d2.

Here, S_0 is the current price of the underlying asset, K is the option’s strike price, T is the time to expiration in years, r is the constant risk-free interest rate, sigma is the constant volatility of the asset’s returns, and Phi(.) is the cumulative distribution function (CDF) of the standard normal distribution.

The model’s is based on a set of strict assumptions:

  • Constant Volatility and Interest Rates
  • Lognormal Returns
  • No transaction costs or taxes
  • Assets are perfectly divisible.
  • No Dividends
  • European-Style Exercise

Among these, the assumption of constant volatility is the most critical but flawed. Market returns exhibit phenomena like volatility clustering and fat tails, both of which contradict the BSM framework.

Modern finance does not treat the BSM model as an absolute truth. Instead, it serves as a powerful, albeit flawed, benchmark.

For practical implementation, an object-oriented approach in Python provides a clean and reusable structure for the BSM model.

import numpy as np
from scipy.stats import norm

class BlackScholesMerton:
    """
    Provides a simple and clean implementation of the Black-Scholes-Merton model
    for pricing European options.
    """
    @staticmethod
    def price(S, K, T, r, sigma, option_type='call'):
        """
        Calculates the price of a European option using the BSM formula.

        Args:
            S (float): Current price of the underlying asset.
            K (float): Strike price of the option.
            T (float): Time to expiration in years.
            r (float): Risk-free interest rate (annualized).
            sigma (float): Volatility of the underlying asset (annualized).
            option_type (str): Type of the option, 'call' or 'put'.

        Returns:
            float: The BSM price of the option.
        """
        if T <= 0:
            if option_type == 'call':
                return max(0.0, S - K)
            elif option_type == 'put':
                return max(0.0, K - S)
            else:
                raise ValueError("Invalid option type. Must be 'call' or 'put'.")

        d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
        d2 = d1 - sigma * np.sqrt(T)

        if option_type == 'call':
            price = S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
        elif option_type == 'put':
            price = K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
        else:
            raise ValueError("Invalid option type. Must be 'call' or 'put'.")
        
        return price

# Example Usage:
# S0 = 100
# K = 105
# T = 0.5
# r = 0.05
# sigma = 0.2
# call_price = BlackScholesMerton.price(S0, K, T, r, sigma, 'call')
# put_price = BlackScholesMerton.price(S0, K, T, r, sigma, 'put')
# print(f"Call Price: {call_price:.4f}")
# print(f"Put Price: {put_price:.4f}")
1.2 The Market’s Whisper: Uncovering Implied Volatility

Volatility is the only input to the BSM formula that cannot be directly observed from the market. The stock price (S) is its current trading price, the strike (K) and maturity (T) are defined by the option contract, and the risk-free rate (r) can be proxied by government bond yields. Volatility, however, remains elusive.

Instead of guessing the volatility to calculate a theoretical price, we can reverse the problem. We can observe the actual market price of an option, C_market, and solve the BSM equation for the value of sigma. This resulting value of sigma is known as the implied volatility (IV).

Formally, this means we are looking for the root of the following nonlinear equation:

Implied volatility is a profoundly important concept. It represents the market’s consensus forecast of the underlying asset’s future volatility over the life of the option. Unlike historical volatility, which is calculated from past price movements, implied volatility is forward-looking. By “inverting” the BSM model to find the IV, we are extracting this forward-looking perception from a traded financial instrument. A high implied volatility doesn’t just mean an option is expensive. It signifies that market participants anticipate a turbulent period ahead. Therefore, IV is a critical barometer of market sentiment and risk appetite.

1.3 The Quant’s Toolkit: Finding Implied Volatility with Newton-Raphson

Since the BSM formula is nonlinear with respect to sigma, there is no closed-form solution for implied volatility. We must turn to numerical root-finding algorithms. The most common and efficient method used in finance for this task is the Newton-Raphson method.

The Newton-Raphson method is an iterative algorithm that finds successively better approximations to the roots of a real-valued function. The core idea is to start with an initial guess, sigma_0, and then approximate the function at that point with its tangent line. The x-intercept of this tangent line becomes the next, improved guess, sigma_1. This process is repeated until the function’s value is sufficiently close to zero.

To apply this to our problem, we need our function, f(sigma) and it’s derivative with respect to volatility f'(sigma). The derivative of the BSM price with respect to volatility is an option sensitivity measure known as Vega.

With the function and its derivative, the Newton-Raphson iterative formula becomes:

The iterative process continues. This process goes on until the difference between the model price and the market price is within a predefined tolerance. This tolerance is known as epsilon.

Below is a Python implementation of the Newton-Raphson method for finding the implied volatility of a European call option.

class BlackScholesMerton(BlackScholesMerton): # Extending the previous class
    @staticmethod
    def vega(S, K, T, r, sigma):
        """
        Calculates the Vega of a European option.
        """
        if T <= 0 or sigma <= 0:
            return 0.0
        d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
        vega = S * norm.pdf(d1) * np.sqrt(T)
        return vega

    @staticmethod
    def implied_volatility(market_price, S, K, T, r, option_type='call', tol=1e-6, max_iter=100):
        """
        Calculates the implied volatility of a European option using the Newton-Raphson method.

        Args:
            market_price (float): The observed market price of the option.
            S (float): Current price of the underlying asset.
            K (float): Strike price of the option.
            T (float): Time to expiration in years.
            r (float): Risk-free interest rate (annualized).
            option_type (str): Type of the option, 'call' or 'put'.
            tol (float): Tolerance for the price difference.
            max_iter (int): Maximum number of iterations.

        Returns:
            float: The implied volatility.
        """
        # Initial guess for sigma
        sigma = 0.5 

        for i in range(max_iter):
            model_price = BlackScholesMerton.price(S, K, T, r, sigma, option_type)
            vega = BlackScholesMerton.vega(S, K, T, r, sigma)
            price_diff = model_price - market_price

            if abs(price_diff) < tol:
                return sigma
            
            if vega == 0:
                # Vega can be zero for deep ITM/OTM options near expiry.
                # Newton-Raphson fails. Can switch to a bisection method here.
                # For simplicity, we return NaN.
                return np.nan

            # Newton-Raphson step
            sigma = sigma - price_diff / vega

        # If not converged after max_iter, return NaN
        return np.nan

# Example Usage:
# market_call_price = 4.7594
# S0 = 100
# K = 105
# T = 0.5
# r = 0.05
# iv = BlackScholesMerton.implied_volatility(market_call_price, S0, K, T, r, 'call')
# print(f"Implied Volatility: {iv:.4f}")
1.4 The Smile That Broke Black-Scholes

If the model’s core assumption of constant volatility were true, then the implied volatility calculated from options on the same underlying asset with the same maturity should be the same, regardless of their strike price.

However, when we perform this experiment with real market data, a very different picture emerges. The graph, which maps strike prices to their corresponding implied volatilities, is famously known as the volatility smile.

The following diagram illustrates a typical volatility smile for equity options:

The volatility smile is empirical proof that the market prices options in a way that is fundamentally inconsistent with the BSM model’s assumption of constant volatility. If the BSM world were reality, this plot would be a flat horizontal line.

This discrepancy arises because the lognormal distribution assumed by BSM fails to capture two key features of real-world asset returns:

  • Fat Tails: The market assigns a higher probability to large, extreme price movements (both crashes and rallies) than the normal distribution allows.
  • Skew: For equity markets, the smile is often asymmetrical, resembling more of a “smirk.” Implied volatility is typically highest for low-strike (out-of-the-money put) options and slopes downwards as the strike price increases. This reflects the “leverage effect” and the market’s greater fear of a sudden crash compared to a sudden rally.

The volatility smile is more than just a market quirk. It is the risk-neutral probability distribution of the underlying asset’s price, cleverly disguised. By studying the shape of the smile, we are effectively studying the market’s nuanced view on the full range of possible future outcomes. The BSM model fails to explain this phenomenon. This failure necessitates the development of more sophisticated models. These models can accommodate a dynamic, non-constant volatility structure.

Part 2: Modeling the Smile – The Local Volatility Approach (Coming soon …)


Leave a Reply

Discover more from SimplifiedZone

Subscribe now to keep reading and get access to the full archive.

Continue reading

Discover more from SimplifiedZone

Subscribe now to keep reading and get access to the full archive.

Continue reading