Lecture 5

The Black-Scholes European option pricing model is a mathematical equation for pricing plain vanilla European call and put options.

In general the “Black-Scholes model” is a mathematical framework in which we derive mathematical models for pricing derivatives.

In the Black-Scholes framework, some types of derivatives have nice equations for their price or value, but most do not. When they don’t, we have to use numerical methods to approximate the solution, such as:

This week we cover the Black-Scholes option pricing model for:

Quite simply, the Black-Scholes European call option pricing model is

C=SN(d1)KerTN(d2)C = S\mathcal{N} (d_{1}) − Ke^{−rT}\mathcal{N} (d_{2})

Where:

d1=logSK+(r+12σ2)TσTd_{1} = \frac{\log \frac{S}{K} + (r+\frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

And

d2=d1σTd_{2} = d_{1} - \sigma \sqrt{T}

=logSK+(r12σ2)TσT= \frac{\log \frac{S}{K} + (r -\frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

Let’s recall the notation and variables in the Black-Scholes model:


Notation and variables


First, σ\sigma is the volatility of the underlying asset, which we can take as the standard deviation of its continuously compounded annual returns.

alt text

Traders don't use historical data, they use market


Second, N(x)\mathcal{N}(x) is the CDF evaluated at xx of a standard normal random variable XX. It gives the probability that XX is less than or equal to xx:

n(X)=P(Xx)=12πxez22dz\mathcal{n}(X) = \mathbb{P}(X \le x) = \frac{1}{\sqrt{2 \pi}} \int^{x}_{- \infty } e^{- \frac{z^{2}}{2}} dz

Graphically, it’s the area under the standard normal PDF:

alt text


Example in code

Python

In [1]: from scipy . stats import norm
In [2]: x = 0.75
In [3]: N = norm.cdf(x) # SciPy ’s norm.cdf () is N()
In [4]: N
Out [4]: 0.7733726476231317

Black Scholes Model

In R

S = 50
K = 50
r = 0.05
T = 1/2
sigma = 0.25
d1 = (log(S/K) + (r + 0.5* sigma ^2)*T)/( sigma *sqrt(T))
d2 = d1 - sigma *sqrt(T)
C = S* pnorm (d1) - K*exp(-r*T)* pnorm (d2)

Gives:

> C
[1] 4.130008

In Python

import numpy as np
from scipy . stats import norm
S = 50
K = 50
r = 0.05
T = 1/2
sigma = 0.25
d1 = (np.log(S/K) + (r + 0.5* sigma **2)*T)/( sigma *np.sqrt(T))
d2 = d1 - sigma *np.sqrt(T)
C = S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)

gives

In [1]: C
Out [1]: 4.130007599671615

Use the yfinance Python module to calculate the historical volatility of the S&P/ASX 200 Index and price some September index option contracts, where here we’ll ignore dividends (for now).

Interest Rates Option Prices
alt text alt text
 import numpy as np , yfinance as yf
 from scipy . stats import norm
 P = yf. download ("^AXJO")["Adj Close "]
 ret = np.log(P).diff (1). dropna ()
 sigma = np.std(ret)*np.sqrt (252)
 K = 7775; S = 7761.7; T = 41/365
 r = (0.042923+0.04335) /2 # average of 1 & 2 month BBSW rate
 d1 = (np.log(S/K) + (r + 0.5* sigma **2)*T)/( sigma *np.sqrt(T))
 d2 = d1 - sigma *np.sqrt(T)
 C = S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2) # call price
 P = K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1) # put price

This code gives σ = 0.15375 and European call and put prices

1 In [1]: C
2 Out [1]: 171.73
3 In [2]: P
4 Out [2]: 147.45

Black-Scholes Model Puts

P=KerTN(d2)SN(d1)P = Ke^{−rT}\mathcal{N} (-d_{2}) - S\mathcal{N} (-d_{1})

where all variables and notation are as above.

P=C+erTKSP = C + e^{−rT}K − S

We check that they agree, using the original “generic” example above:

P = K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
P1 = C + np.exp(-r*T)*K - S # using put -call parity

Incorporating dividends

We now incorporate dividends into the Black-Scholes European option pricing equations, in order to more accurately price equity options.

Incorporating a continuously compounded dividend yield qq into the basic Black-Scholes model is relatively easy. We can show that the pricing equations for European call CC and put #PP options become

C=SeqTN(d1)KerTN(d2)C = Se^{-qT}\mathcal{N} (d_{1}) − Ke^{−rT}\mathcal{N} (d_{2})

P=KerTN(d2)SeqTN(d1)P = Ke^{−rT}\mathcal{N} (-d_{2}) - Se^{-qT}\mathcal{N} (-d_{1})

Where:

d1=logSK+(rq+12σ2)TσTd_{1} = \frac{\log \frac{S}{K} + (r - q + \frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

And

d2=d1σTd_{2} = d_{1} - \sigma \sqrt{T}

d2=logSK+(rq12σ2)TσTd_{2} = \frac{\log \frac{S}{K} + (r - q - \frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}


Example

alt text

import numpy as np , yfinance as yf
from scipy . stats import norm
XJO=yf. download ("^AXJO")["Adj Close "]
ret=np.log(XJO).diff (1). dropna (). rename (" returns ")
sigma =np.std(ret)*np.sqrt (252)
K =7775; S =7761.7; T =41/365; q =0.042 # dividend yield 4.2%
r =(0.042923+0.04335) /2 # average of 1 & 2 month BBSW rate
d1 =( np.log(S/K)+(r-q +0.5* sigma **2)*T)/( sigma *np.sqrt(T))
d2=d1 - sigma *np.sqrt(T)
C=S*np.exp(-q*T)*norm.cdf(d1)-K*np.exp(-r*T)*norm.cdf(d2)
P=K*np.exp(-r*T)*norm.cdf(-d2)-S*np.exp(-q*T)*norm.cdf(-d1)

This code gives European call and put prices

In [1]: C
Out [1]: 152.87
In [2]: P
Out [2]: 165.12

Remark:

Some reasons for inaccurate S&P/ASX 200 Index option prices:

Currency Options

When applying the Black-Scholes model to pricing currency options, we need to be mindful about the currency quoting conventions of SS and KK, as well as the handling of the domestic rdr_{d} and foreign rfr_{f} interest rates.

Let Sf:dS_{f:d} and Kf:dK_{f:d} be the spot and strike prices of 1 unit of the foreign currency (the underlying asset) in terms of the domestic currency.

The modification to the Black-Scholes model is relatively easy:

Cf:d=Sf:deqTN(d1)Kf:derTN(d2)C_{f:d} = S_{f:d}e^{-qT}\mathcal{N} (d_{1}) − K_{f:d}e^{−rT}\mathcal{N} (d_{2})

Pf:d=Kf:derTN(d2)Sf:deqTN(d1)P_{f:d} = K_{f:d}e^{−rT}\mathcal{N} (-d_{2}) - S_{f:d} e^{-qT}\mathcal{N} (-d_{1})

Where:

d1=logSf:dKf:d+(rq+12σ2)TσTd_{1} = \frac{\log \frac{S_{f:d}}{K_{f:d}} + (r - q + \frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

and

d2=d1σTd_{2} = d_{1} - \sigma \sqrt{T}

=logSf:dKf:d+(rq12σ2)TσT = \frac{\log \frac{S_{f:d}}{K_{f:d}} + (r - q - \frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

This is sometimes called the Garman-Kohlhagen (GK) equations, who suggested in their paper Foreign Currency Option Values the idea of viewing a currency option as an option on a stock paying a dividend rfr_{f}.


Example

We use Python to download exchange rates and price a 3-month at-the-money EUR:USD currency option (EUR = foreign currency).

SOFR Euribor Spot
alt text alt text alt text

Let’s first convert the simple Term SOFR and EURIBOR interest rates to continuous compounding. The future value of $1 invested at a simple interest rate ss is 1+sT1 + sT. Under compound interest rr, it is erTe^{rT}. Hence, for each of these rates, we want to find rr satisfying 1+sT=erT1 + sT = e^{rT}. Rearranging, we get

r=1Tlog(1+sT)r=\frac{1}{T}\log (1+sT)

I calculate the continuously compounded rates to be rf=0.03553r_{f} = 0.03553 and rd=0.05071r_{d} = 0.05071.

import numpy as np , yfinance as yf
from scipy . stats import norm
EURUSD = yf. download (" EURUSD =X")["Adj Close "]
ret = np.log( EURUSD ).diff (1). dropna ()
sigma = np.std(ret)*np.sqrt (252)
T = 90/360; S = 1.1024; K = S # at -the - money
rf = (360/90) *np.log (1+0.03569*90/360) # Euro is the foreign currency
rd = (360/90) *np.log (1+0.0510283*90/360) # USD is the domestic currency
d1 = (np.log(S/K) + (rd -rf +0.5* sigma **2)*T)/( sigma *np.sqrt(T))
d2 = d1 - sigma *np.sqrt(T)
C = S*np.exp(-rf*T)*norm.cdf(d1) - K*np.exp(-rd*T)*norm.cdf(d2)
P = -S*np.exp(-rf*T)*norm.cdf(-d1) + K*np.exp(-rd*T)*norm.cdf(-d2)

This code gives σ=0.11245σ = 0.11245 and call and put option values

In [1]: C
Out [1]: 0.0266
In [2]: P
Out [2]: 0.0225

Risk-neutral pricing and geometric Brownian motion

The ideas of risk-neutral pricing and geometric Brownian motion are central to all of quantitative finance and derivative security pricing.

It’s important to note that the Black-Scholes model is derived under a large list of assumptions. Some of these include what might be called the “usual assumptions” in financial theory and modelling:

We’re not so much interested in them as we are in the assumption on the stochastic or random process followed by the underlying asset.

St=Se(r12σ2)t+σtZfor0tTS_{t} = Se^{(r-\frac{1}{2} \sigma ^{2})t + \sigma \sqrt{t} Z} \: \: \text{for} \: \: 0 \le t \le T

where ZZ is a standard normal random variable. This implies that the underlying asset’s returns are normally distributed:

Rearranging the above, the asset’s continuously compounded returns

rt=logStS=(r12σ2)t+σtZr_{t} = \log \frac{S_{t}}{S} = \left( r - \frac{1}{2} \sigma ^{2} \right)t+\sigma \sqrt{t}Z

are normally distributed with E[rt]=(r12σ2)t\mathbb{E}[r_{t}]=\left( r - \frac{1}{2} \sigma ^{2} \right)t and Var[rt]=σ2t[r_{t}] = \sigma ^{2}t

alt text


Geometric Brownian Motion

In the risk-neutral approach, the underlying asset follows geometric Brownian motion as presented above. We can simulate it as follows:

alt text


Example

Simulating GBM by the above is used in the Monte Carlo simulation pricing of options, and we do this later in the course. Here is some Python code that simulates and plots geometric Brownian motion paths:

import numpy as np
from scipy . stats import norm
import matplotlib . pyplot as plt
S0 =50; r =0.05; T=1; sigma =0.25
M =1000; dt=T/M; dates =np. linspace (0,T,M+1) # 1000 time steps
N=10; S=np. zeros ([N,M+1]); S[: ,0]= S0 # 10 paths , each starting at S=50
for i in range (N):
for j in range (1,M+1):
Z=norm.rvs () # simulate outcomes of standard normal random variable
S[i,j]=S[i,j -1]* np.exp ((r -0.5* sigma **2)*dt+ sigma *np.sqrt(dt)*Z) # GBM
plt.plot(dates ,S[i ,:])
plt.title ("N=10 paths of geometric Brownian motion ") # plot

alt text


Risk-Neutral approach

But what is meant by the “risk-neutral” pricing approach? First note:

Law of finance: The value of an asset is the present value of its expected futures cashflows or payoff.

We can use a lot of complex maths to show that the value of European options in the risk-neutral approach is given by the law of finance:

C=erTE[max(0,STK)]C = e^{-rT}\mathbb{E}[\max (0, S_{T}-K)]

And

P=erTE[max(0,KST)]P = e^{-rT}\mathbb{E}[\max (0, K - S_{T})]

where STS_{T} is log-normally distributed as specifi ed above.

So in the risk-neutral pricing approach the value of a European option is


Remark

So in the risk-neutral pricing approach, investors don’t add a risk premium to the discount rate, since it’s just the risk-free rate r.

We can also rederive the futures/forward pricing formulas again here in the risk-neutral approach:

The payoff of a long futures contract is STKS_{T} − K, so the value of a long futures contract in the risk-neutral approach is

V=erTE[STK]=erTE[ST]erTKV=e^{-rT}\mathbb{E}[S_{T}-K]=e^{-rT}\mathbb{E}[S_{T}]-e^{-rT}K

But K is set so these contracts have 0 value: V = 0. In the risk-neutral approach, the value of every asset is the present value of its expected future payoff , including the underlying asset, so S=erTE[ST]S = e^{−rT}\mathbb{E}[S_{T}]. So using this and rearranging the above yields

K=erTSK=e^{rT}S


Variables affecting option prices and the Greeks

We now want to investigate and quantify how each of the input variables KK, SS, rr, TT, σσ and qq impact option premiums.

If you hold a derivatives portfolio

The Black Scholes model

C=N(d1)KerTN(d2)C = \mathcal{N} (d_{1}) − Ke^{−rT}\mathcal{N} (d_{2})

P=KerTN(d2)SN(d1)P = Ke^{−rT}\mathcal{N} (-d_{2}) - S\mathcal{N} (-d_{1})

(Ignoring dividends qq for now) where:

d1=logSK+(r+12σ2)TσTd_{1} = \frac{\log \frac{S}{K} + (r + \frac{1}{2}\sigma ^{2})T}{\sigma \sqrt{T}}

d2=d1σTd_{2} = d_{1} - \sigma \sqrt{T}

depends on the variables SS, KK, rr, TT and σσ.

We know that call (put) options with a higher strike price K have lower (higher) values, and we’re not so much interested any further in K.


The Greeks

We’re interested in the sensitivity of option prices to the other variables SS, rr, TT and σσ, and we give these sensitivities special Greek names:

We cover each of these one-by-one.


Remark: We will assume no dividends q since the equations are neater, until right at the end where we mention the impact of dividends.

Delta ∆ and gamma Γ

We know that as SS increases, calls premiums rise and put premiums fall.

alt text

We quantify this mathematically with the delta ∆, given by

C=N(d1)andP=N(d1)1∆_{C} = N(d_{1}) \: \: \text{and} \: \: ∆_{P} = N(d_{1}) − 1

Importantly, note the following, which confirms the first line of this slide:

0<C<1and1<P<0 0 < ∆_{C} < 1 \: \: \text{and} \: \: -1 < ∆_{P} < 0


Remark ∆ is the partial derivative of the premium with respect to S

But think of ∆ as:

From the remark above, we interpret ∆ as the change in the premium due to a change in S, giving us the approximations

dCΔcdSanddPΔpdSdC \approx \Delta _{c} dS \: \: \text{and} \: \: dP \approx \Delta _{p} dS

where dCdC and dPdP are a change in the premium and dSdS a change in SS.

CnewC+dCandPnewP+dPC_{new} \approx C + dC \: \: \text{and} \: \: P_{new} \approx P+dP


Remark: These approximations are used later in delta hedging.


alt text

From above, the approximation dCΔcdSdC \approx \Delta _{c} dS is not perfect, but:

Γ=f(d1)SσT\Gamma = \frac{f(d_{1})}{S \sigma \sqrt{T}}

(same for calls and puts), with:

f(x)=ex2/22πf(x) = \frac{e^{-x^{2} / 2}}{\sqrt{2 \pi}}

the PDF of a standard normal random variable


Remark: Γ is the 2nd partial derivative of the premium with respect to S.

We make the approximations of dC and dP more accurate by setting

dCΔcdS+12ΓdS2anddPΔpdS+12ΓdS2dC \approx \Delta _{c} dS + \frac{1}{2}\Gamma dS^{2} \: \text{and} \: \: dP \approx \Delta _{p} dS + \frac{1}{2}\Gamma dS^{2}


alt text

alt text


Rho ρ\rho

Rho ρ is the change in the premium from a change in r, and is given by

alt text

Note that:

alt text

As r increases, call premiums increase but put premiums decrease.

Remark: ρ is the partial derivative of the premium with respect to r.


alt text

Vega ν\nu

Vega ν is the change in the premium from a change in σ, and is given by:

ν=Sf(d1)T\nu = Sf(d_{1})\sqrt{T}

with f(x) the PDF of a standard normal random variable. Note that

0<ν0 < \nu

As σ increases, option premiums increase.

Remarkν is the partial derivative of the premium with respect to σ.


alt text

Theta θ\theta

Theta θ is a bit ambiguous. It gives the negative of the change in the premium from a change in T. And the equations are more complex:

alt text

with f (x) the PDF of a standard normal random variable.

Remark θ is the negative of the partial derivative of the premium with respect to T, telling us the impact of approaching expiry.

However, note that

alt text

On a non-dividend paying asset, call premiums fall as expiry nears.

However, there is some rules of thumb relating to time:

alt text

alt text

alt text


alt text

Incorporating dividends

On a dividend paying asset, all of the above interpretations remain unchanged except for θ. From the textbook, the equations become:

alt text

Note that Hull uses the notation N′(x) for the PDF of a standard normal random variable, whereas I’ve been using f(x).

alt text