Calibrating Trees and the Black-Scholes Formula





Kerry Back

Calibration

  • Estimate \(\sigma=\) std dev of annual stock return
  • Find \(r_f =\) annualized continuously compounded interest rate \(= \log(1+\text{annual rate})\).
  • \(T=\) time to maturity of an option in years
  • \(N=\) number of periods in a binomial model

  • \(\Delta t = T/N=\) period length
  • Set the up rate of return as \(u = e^{\sigma\sqrt{\Delta t}}-1\) and set \(d=1/(1+u)-1\) as before
  • Set the 1-period interest rate as \(r=e^{r_f \Delta t}-1\)
  • The risk-neutral probability of “up” is

\[p = \frac{r-d}{u-d} = \frac{e^{r_f \Delta t} - e^{-\sigma \Delta t}}{e^{\sigma \Delta t} - e^{-\sigma \Delta t}}\]

Dividends

  • The simplest assumption is that the stock pays dividends continuously with a constant dividend yield.
  • This means that the dividend paid in each small period \(\Delta t\) is \(q \times S \times \Delta t\) where \(S\) denotes the price at the beginning of the period and \(q\) is a constant.
  • Set \(q =\) annual dividend / stock price

  • We can still use a binomial model with the same \(r\), \(u\), and \(d\), except that the risk-neutral probability of “up” should be

\[\frac{e^{(r_f-q) \Delta t} - e^{-\sigma \Delta t}}{e^{\sigma \Delta t} - e^{-\sigma \Delta t}}\]

Take limit

  • As the number of periods is increased, the distribution of the stock price converges to lognormal, meaning that log stock price has a normal distribution.
  • The values of options converge
  • The limits of European option values are given by the Black-Scholes formulas

Black-Scholes Call Formula

import numpy as np
from scipy.stats import norm

def callBS(S, K, T, sigma, r, q=0):
    d1 = np.log(S/K) + (r-q+0.5*sigma**2)*T
    d1 /= sigma*np.sqrt(T)
    d2 = d1 - sigma*np.sqrt(T)
    N1 = norm.cdf(d1)
    N2 = norm.cdf(d2)
    return np.exp(-q*T)*S*N1 - np.exp(-r*T)*K*N2

Black-Scholes Put Formula

def putBS(S, K, T, sigma, r, q=0):
    d1 = np.log(S/K) + (r-q+0.5*sigma**2)*T
    d1 /= sigma*np.sqrt(T)
    d2 = d1 - sigma*np.sqrt(T)
    N1 = norm.cdf(-d1)
    N2 = norm.cdf(-d2)
    return np.exp(-r*T)*K*N2 - np.exp(-q*T)*S*N1

Call Example

  • \(K=50\), \(T=1\), \(\sigma=0.4\), \(r=0.04\)

Put Example

  • \(K=50\), \(T=1\), \(\sigma=0.4\), \(r=0.04\)