[toc]

本章节内容参考书籍:

《Options, Futures and Other Derivatives》Chapter 13

《数量金融》第一卷 第五章、第六章、第七章

《Introduction to the Mathematics of Finance》Chapter 4-5 (反正我是看不懂,里面涉及太多高级测度论知识了)

《An Elementary Introduction to Mathematical Finance》Chapter 7

《The Mathematics of Finance: Modeling and Hedging》Chapter 5-6

《Mathematics for Finance - An Introduction to Financial Engineering》Chapter 8.3

《Handbook of Financial Engineering: Using Derivatives to Manage Risk》Chapter 10-11

《Investments》Chapter 20-21

《Financial Institutions and Markets》 Chapter 14

Black-Scholes-Merton Formula

European Call Option Pricing Formula

\[ c = S_{0}N\left( d_{1} \right) - Xe^{- \text{rT}}N\left( d_{2} \right) \]

其中:

\[ d_{1} = \frac{\ln\left( \frac{S_{0}}{X} \right) + \left( r + \frac{\sigma^{2}}{2} \right)T}{\sigma\sqrt{T}} \]

\[ d_{2} = \frac{\ln\left( \frac{S_{0}}{X} \right) + \left( r - \frac{\sigma^{2}}{2} \right)T}{\sigma\sqrt{T}} = d_{1} - \sigma\sqrt{T} \]

\(N\left( x \right)\) 表示标准正态分布\(N\left( 0,1 \right)\)的概率值

推导Black-Scholes-Merton Formula:

Black-Scholes-Merton Formula 假设

  • 股票价格服从几何布朗运动 / 对数正态分布,即 \[ dS=\mu Sdt+\sigma S dW_t \Rightarrow \frac{dS}{S}=\mu dt+\sigma dW_t \] 其中 \(\{W_t \}_{t \geq 0}\) 服从标准布朗运动的随机过程。 \[ dW_t=\epsilon \sqrt{dt} \] 利用前述 \(It \hat{o}\) 引理,对于 \(f(t,S)\) ,其中 S 服从上面的过程,则 \[ df=(\frac{\partial f}{\partial S}\mu S+\frac{\partial f}{\partial t}+\frac{1}{2} \frac{\partial^2 f}{\partial S^2} \sigma^2 S^2)dt+\frac{\partial f}{\partial S} \sigma S dW_t \]

    \(f(t,S)=\ln S\) 时,代入得: \[ d\ln S=(\mu -\frac{\sigma^2}{2}) dt+\sigma dW_t \]\(f(t,S)=\ln S\) 满足Generalized Wiener Process / 带漂移的 Brown 运动,漂移率为常数 \(\mu -\frac{\sigma^2}{2}\) ,波动率为常数 \(\sigma^2\)

    \(\ln S\)\([0,T]\) 时间变化服从正态分布: \[ \ln (\frac{S_T}{S_0}) \sim \Phi((\mu -\frac{\sigma^2}{2})T,\sigma^2T) \Rightarrow S_T=S_0e^{(\mu -\frac{\sigma^2}{2})T+\sigma W_T} \] 显然有 \[ E(S_T)=S_0e^{\mu T} \]

股票价格服从几何布朗运动,则股票的连续复利收益率 x 服从正态分布。 \[ S_t=S_0e^{xT} \Rightarrow x=\frac{1}{T} \ln (\frac{S_T}{S_0}) \Rightarrow x \sim \Phi (\mu -\frac{\sigma^2}{2},\frac{\sigma^2}{T}) \]

这里需要区分:

股票的期望收益率 / 预期收益率 \(\mu\) 并不等于以连续复利计算的收益率的期望值 \(\mu-\frac{\sigma^2}{2}\) ,实际上因为

\[E[\ln(S_T)] = \ln S_0+\mu - \frac{\sigma^2}{2} < \ln E[S_T] = \ln S_0+\mu \]

  • 可以卖空证券,并且可以完全使用所得收入

  • 无交易费用、无税收,所有证券可以无限分割

  • 期权期限内股票不支付股息

    这一条后续可以放松为“股票支付股息的期权定价模型”

  • 不存在无风险套利机会

  • 证券交易连续进行

  • 短期无风险利率 r 为常数,并对所有期限均相同。

    这一条后续可以放松为“r 为关于时间 t 的函数”或“r 为某个随机过程”,这部分详见后续的利率模型

偏微分方程形式的Black-Scholes-Merton Equation

\[ \frac{\partial f}{\partial t}+rS\frac{\partial f}{\partial S} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 f}{\partial S^2}=rf \]

其中 \(f(t,S)\) 为关于 t 和 S 的函数,表示依赖于 S 的衍生产品价格。

对于某一特定的金融衍生产品,上述方程的解与其边界条件有关,边界条件定义了金融衍生品在 S 和 t 在边界上的取值。

对于 European Call Option 边界条件: \[ f=\max(S_T-K,0) \quad 当 t=T 时 \] 容易得到其期权价格的解析式。同理对 European Put Option 。

证明:

为消除 Wiener Process 的 \(dW_t\) 项,构造股票和期权的投资组合,其价值为 \(\Pi=-f+\frac{\partial f}{\partial S}\)

  • \(-1\) 衍生产品
  • \(+\frac{\partial f}{\partial S}\) 股票

\(d\Pi=-df+\frac{\partial f}{\partial S} dS \overset{\text{代入上述}It\hat{o} \text{引理}}{\Rightarrow} d\Pi=(-\frac{\partial f}{\partial t}-\frac{1}{2} \frac{\partial^2 f}{\partial S^2} \sigma^2 S^2 ) dt\)

投资组合在极短的时间内是无风险的,因为不含随机项。【仅在无穷小的区间内为无风险,为保证证券组合无风险,需要经常对投资组合中的衍生产品和股票的比例做出调整,即 \(\frac{\partial f}{\partial S}\) 其实是发生变化的】

由假设,证券投资组合必须获取与其他短期无风险债券相同的瞬时收益率,即\(d\Pi=r\Pi dt\)

其中 r 为无风险利率,带入整理即可得上述偏微分方程。

风险中性条件下的Black-Scholes-Merton Formula

为何设定在风险中性下
image-20210305134317845
image-20210305134350158
推导European Option

推导:

利用风险中性定价方法,在无风险测度 Q 下,期权到期的期望值为 \(E_{Q}[\max(S_T - X,0)]\) ,故 European Call Option 价格为以无风险利率贴现后的现值 \[ c = e^{- \text{rT}}E_{Q}[\max(S_T - X,0)] \]

按照 John Hull 的推导方法,当 \(S_T\) 服从对数正态分布时,设 \(\ln S_T\) 的方差为 \(\omega\) ,均值为 \(m=\ln E[S_T]-\frac{\omega^2}{2}\) ,则 \[ E[\max(S_T - X,0)]=E[S_T]N(d_1)-XN(d_2) \] 其中 \[ d_{1} = d_{2} + \omega = \frac{1}{\omega}( \ln(\frac{E[S_T]}{X}) + \frac{\omega^2}{2}) \] 这一公式推导如下: \[ E[\max(S_T - X,0)] = \int_X^{+\infty} (S_T - X) g(S_T) dS_T \overset{Q=\frac{\ln S_T-m}{\omega} \sim N(0,1)}{=} \int_{\frac{\ln X -m}{\omega}}^{+\infty} e^{Q\omega+m} h(Q) dQ -K\int_{\frac{\ln X -m}{\omega}}^{+\infty} h(Q) dQ \] 其中 \(h(Q)\) 为标准正态分布的概率密度函数。展开概率密度函数,由于 \[ e^{Q\omega+m} h(Q)=e^{m+\frac{\omega^2}{2}}h(Q-\omega) \] 代入计算整理可得上述公式。

实际上,代入 \(E[S_T]=S_0e^{rT}\)\(\omega=\sigma \sqrt{T}\) 即可得到结果。

B-S Formula 推广:

European Call Option:

\[ c = S_{0}N\left( d_{1} \right) - Xe^{- rT}N\left( d_{2} \right) \]

其中 \(N(d_2)\) 表示风险中性条件下期权被行使的概率,投资于股票的资金总额为 \(S_{0}N\left( d_{1} \right)\) ,其中 \(N(d_1)\) 为购买股票的数量,投资于无风险资产的资金总额为(借入) \(- Xe^{- rT}N\left( d_{2} \right)\)

European Put Option:

根据欧式期权平价关系: \[ c + Xe^{- rT} = p + S \]

故我们推出

\[ p = Xe^{- \text{rT}}N\left( - d_{2} \right) - S_{0}N\left( - d_{1} \right) \]

其中 \(d_{1},d_{2}\) 与上述公式意义相同

波动率 \(\sigma\) 计算

\[ \ln S_{t}\left( w \right) - \ln S_{0}\sim N\lbrack(r - \frac{\sigma^{2}}{2})t,\sigma^{2}t\rbrack \]

  • 历史波动率:首先计算对数收益率,其次计算样本标准差,最后按年进行标准化。

  • 隐含波动率:利用市场期权的报价及B—S公式,插值代入计算。

  • 指数加权波动率:利用最近时刻的波动率及以前不同时刻波动率的加权和。

界定二叉树模型中的参数

\[ u = e^{\sigma\sqrt{\frac{T}{N}}\ } \text{with probability } p = \frac{1}{2}\left( 1 + \frac{\mu}{\sigma}\sqrt{\frac{T}{N}} \right) \]

\[ d = \frac{1}{u}\text{with probability } p = \frac{1}{2}\left( 1 - \frac{\mu}{\sigma}\sqrt{\frac{T}{N}} \right) \]

\[ \text{while }\Delta t = \frac{T}{N} \]

而 Hull-White算法采取了不同的二叉树模型参数。

有离散红利的欧式期权的B-S公式

用股票的市场价格减去股票在期权到期日之前分配的红利的现值作为股价代入到B-S公式中,从而得到欧式期权的价值。

即: \[ c=(S_0-D)N(\overline{d_1})-Xe^{-rt}N(\overline{d_2}) \]

其中

\[ \overline{d_1} = \frac{\ln\left( \frac{S_{0} - D}{X} \right) + \left( r + \frac{\sigma^{2}}{2} \right)t}{\sigma\sqrt{t}} \]

\[ \overline{d_2} = \overline{d_1}- \sigma\sqrt{t} \]

有连续红利率收益的欧式股票期权的B-S公式、欧式股票指数期权定价公式

在定价标的股票支付连续红利的欧式期权时,可以把它当作标的股票不支付红利的欧式期权,只要用\[S_{0}e^{- \text{qT}}\]替代当前股价即可

即: \[ c = S_{0}e^{- \text{qT}}N\left( d_{1} \right) - Xe^{- \text{rT}}N\left( d_{2} \right) \]

其中

\[ d_{1} = \frac{\ln\left( \frac{S_{0}}{X} \right) + \left( r - q + \frac{\sigma^{2}}{2} \right)T}{\sigma\sqrt{T}} \]

\[ d_{2} = d_{1} - \sigma\sqrt{T} \]

加曼-科尔哈根外汇期权定价公式

\[ c = s_{0}e^{- r_{e}T}N\left( d_{1} \right) - Xe^{- r_{c}T}N\left( d_{2} \right) \]

\[ d_{1} = \frac{\ln(\frac{s_{0}e^{- r_{e}T}}{X}) + \{ r_{c} + \frac{\sigma^{2}}{2}\} T}{\sigma\sqrt{T}} \]

\[ d_{2} = d_{1} - \sigma\sqrt{T} \]

其中\[r_{e}\]表示基础货币的利率,\[r_{c}\]表示报价货币的利率。

期货期权——Black定价模型(1976)

假设期货价格过程为 \[ dF = \mu Fdt + \sigma Fdz \]

假定期货合约和期权合约同时到期,在连续红利的期权定价公式中,用期货价格代替股票价格,并且用无风险利率 r 替代红利率 q ,就得到期货期权的定价公式

\[ c = e^{- \text{rT}}\left\lbrack F_{0}N\left( d_{1} \right) - XN\left( d_{2} \right) \right\rbrack \]

\[ p = e^{- \text{rT}}\left\lbrack XN\left( - d_{2} \right) - F_{0}N\left( - d_{1} \right) \right\rbrack \]

其中

\[ d_{1} = \frac{\ln\left( \frac{F_{0}}{X} \right) + \frac{\sigma^{2}T}{2}}{\sigma\sqrt{T}} \]

\[ d_{2} = \frac{\ln\left( \frac{F_{0}}{X} \right) - \frac{\sigma^{2}T}{2}}{\sigma\sqrt{T}} = d_{1} - \sigma\sqrt{T} \]

B-S Formula 希腊字母的表示

期权的希腊字母“兄弟会”:

  • Delta 值: 期权对资产价格的变化率

  • Gamma值: Delta对资产价格的变化率

  • Vega值 :期权对资产价格波动率的变化率

  • Rho值: 期权对利率的变化率

  • Theta值: 期权对时间的变化率

以看涨期权为例,无分红情况下,首先我们有 \[ C = C\left( X,S_{0},R,\sigma,T \right) = e^{- rT}E[\max(S_T-X,0)] \]

在B-S Formula 下我们有

\[ C = C\left( X,S_{0},R,\sigma,T \right) = S_{0}N\left( d_{1} \right) - Xe^{- rT}N\left( d_{2} \right) \]

则希腊字母:

  • Delta

\[ \Delta = \frac{\partial C}{\partial S_{0}} = N\left( d_{1} \right) \]

  • Gamma

\[ \Gamma = \frac{\partial^{2}C}{\partial S_{0}^{2}} = N^{'}\left( d_{1} \right)\frac{1}{S_{0}\sigma\sqrt{T}} \]

  • Theta

\[ \Theta = \frac{\partial C}{\partial T} = \frac{\sigma}{2\sqrt{T}}S_{0}N^{'}\left( d_{1} \right) + Xre^{- rT}N\left( d_{2} \right) \]

  • Vega

\[ V = \frac{\partial C}{\partial\sigma} = S_{0}\sqrt{T}N^{'}\left( d_{1} \right) \]

  • Rho

\[ \rho = \frac{\partial C}{\partial r} = XTe^{- rT}N\left( d_{2} \right) \]

对于看跌期权希腊字母计算同理,详见《数量金融》第7章。

如下需注意,对于Theta值,上述内容按照《An Elementary Introduction to Mathematical Finance》导出,而下述内容中的时间T则被替换为 T-t ,Theta值的求导为\[\frac{\partial C}{\partial t}\]

敏感性分析

Black-Scholes Formula using Monte-Carlo Method: Valuation

Black-Scholes Formula European Option in Python

\[ c = S_{0}N\left( d_{1} \right) - Xe^{- \text{rT}}N\left( d_{2} \right) \]

\[ p = Xe^{- \text{rT}}N\left( - d_{2} \right) - S_{0}N\left( - d_{1} \right) \]

# -*- coding: utf-8 -*-

import math
import numpy as np
from scipy import stats

def Black_Scholes_European_Call_Option(S0,sigma,T,X,r):
d1=(math.log(S0/X)+(r+np.square(sigma)/2)*T)/(sigma*np.sqrt(T))
d2=d1-sigma*np.sqrt(T)
nd1=stats.norm.cdf(d1)
nd2=stats.norm.cdf(d2)
ct=S0*nd1-X*np.exp(-r*T)*nd2
return ct

def Black_Scholes_European_Put_Option(S0,sigma,T,X,r):
d1=(math.log(S0/X)+(r+np.square(sigma)/2)*T)/(sigma*np.sqrt(T))
d2=d1-sigma*np.sqrt(T)
nd1=stats.norm.cdf(-d1)
nd2=stats.norm.cdf(-d2)
pt=X*np.exp(-r*T)*nd2-S0*nd1
return pt

S0=10;sigma=0.3;T=0.5;X=10;r=0.05
ct=Black_Scholes_European_Call_Option(S0,sigma,T,X,r)
pt=Black_Scholes_European_Put_Option(S0,sigma,T,X,r)
print('ct=',round(ct,5))
print('pt=',round(pt,5))

Black-Scholes Formula European Option in MATLAB

参考:https://ww2.mathworks.cn/help/releases/R2021a/finance/pricing-and-analyzing-equity-derivatives.html

另外提一句,《量化投资:以MATLAB为工具》书中的代码及FQuantToolBox,因年代久远不便使用。

European Option

参考:《Python for Finance》

\[ C_0=e^{-rT}E_0\{\max(S_T-K,0)\}=e^{-rT}\int_0^{+\infty}h(s)q(s)ds \]

\[ \widetilde{C_0}=e^{-rT}\frac{1}{I} \sum_{i=1}^I \max(\widetilde{S_T^i}-K) \]

其中 \(\widetilde{S_T^i}\) 为到期日的第 \(i\) 个模拟指数水平。

静态模拟方法:

\[ \displaylines{S_T= S_{0}e^{\left( r - \frac{\sigma^{2}}{2} \right)t + \sigma\sqrt{t}Z} \\ C_0=e^{-rT}E_0\{\max(S_T-K,0)\}} \]

S0 = 100.
r = 0.05
sigma = 0.25
T = 1.0
I = 50000 #模拟5e5次

def gbm_mcs_stat(K):
''' Valuation of European call option in Black-Scholes-Merton
by Monte Carlo simulation (of index level at maturity)

Parameters
==========
K: float
(positive) strike price of the option

Returns
=======
C0: float
estimated present value of European call option
'''
z=np.random.standard_normal(I) #模拟的关键
ST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * math.sqrt(T) * z)
# calculate payoff at maturity
hT = np.maximum(ST - K, 0)
# calculate MCS estimator
C0 = math.exp(-r * T) * np.mean(hT)
return C0

gbm_mcs_stat(K=105.) #行权价为105.0
# 10.044221852841922

动态模拟方法:

纯Python
#
# Monte Carlo valuation of European call options with pure Python
#

from time import time
from math import exp, sqrt, log
from random import gauss, seed

seed(20000)
t0 = time()

# Parameters
S0 = 100. # initial value
K = 105. # strike price
T = 1.0 # maturity
r = 0.05 # riskless short rate
sigma = 0.2 # volatility
M = 50 # number of time steps
dt = T / M # length of time interval
I = 250000 # number of paths

# Simulating I paths with M time steps
S = []
for i in range(I):
path = []
for t in range(M + 1):
if t == 0:
path.append(S0)
else:
z = gauss(0.0, 1.0) # 生成标准正态分布随机数
St = path[t - 1] * exp((r - 0.5 * sigma ** 2) * dt + sigma * sqrt(dt) * z)
path.append(St)
S.append(path)

# Calculating the Monte Carlo estimator
C0 = exp(-r * T) * sum([max(path[-1] - K, 0) for path in S]) / I

# Results output
print("European Option Value %7.3f" % C0)
运用Numpy库
#
# Monte Carlo valuation of European call options with NumPy
#

import math
import numpy as np
from time import time

np.random.seed(20000)
t0 = time()

# Parameters
S0 = 100.; K = 105.; T = 1.0; r = 0.05; sigma = 0.2
M = 50; dt = T / M; I = 250000 * 2

# Simulating I paths with M time steps
S = np.zeros((M + 1, I))
S[0] = S0
for t in range(1, M + 1):
z = np.random.standard_normal(I) # pseudorandom numbers
z -= z.mean() # corrects 1st moment
z /= z.std() # corrects 2nd moment
S[t] = S[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * math.sqrt(dt) * z)
# vectorized operation per time step over all paths

# Calculating the Monte Carlo estimator
C0 = math.exp(-r * T) * np.sum(np.maximum(S[-1] - K, 0)) / I

# Results output
print("European Option Value %7.3f" % C0)