期权定价模型
一、普通香草期权
1. 含持有成本的Black-Scholes期权定价公式
持有成本是指持有标的资产的过程中,会持续产生一定的费用或损失,也可能是获得一定的收益,如股息、存储成本、外汇利差等。以存储成本为例,当标的资产为实物商品时,如农产品、金属等时,在持有过程中需要进行存储,这会产生一系列的费用,包括仓储费、保险费、损耗费等,这些费用构成了存储成本。在这种情况下,存储成本会增加持有标的资产的总成本。当持有成本为0时,该公式简化为标准的BS公式。
C = S e ( b − r ) T N ( d 1 ) − K e − r T N ( d 2 ) P = K e − r T N ( − d 2 ) − S e ( b − r ) T N ( − d 1 ) \begin{equation} \begin{aligned} C &= Se^{(b-r)T}N(d_1)-Ke^{-rT}N(d_2) \\ P &= Ke^{-rT}N(-d_2) - Se^{(b-r)T}N(-d_1) \end{aligned} \end{equation} CP=Se(b−r)TN(d1)−Ke−rTN(d2)=Ke−rTN(−d2)−Se(b−r)TN(−d1)
其中:
d
1
=
l
n
(
S
/
K
)
+
(
b
+
σ
2
2
)
T
σ
T
d
2
=
d
1
−
σ
T
\begin{equation} \begin{aligned} d_1 &= \frac{ln(S/K)+(b+\frac{\sigma^2}{2})T}{\sigma \sqrt T} \\ d_2 &= d_1 - \sigma \sqrt T \end{aligned} \end{equation}
d1d2=σTln(S/K)+(b+2σ2)T=d1−σT
参数含义:
- S:标的资产当前价格
- T:期权到期时间(年化)
- b:持有成本率(cost of carry rate)
- N( ⋅ \cdot ⋅):标准正态分布的累积分布函数
- r:无风险利率
- K:行权价格
- σ \sigma σ:标的资产波动率(年化)
持有成本b的取值:
- 股票(无股息): b = r b = r b=rb=r b=rb=r(退化为标准BS公式)
- 股票(连续股息率q): b = r − q b=r-q b=r−q
- 外汇期权(外币利率 r f r_f rf): b = r − r f b=r-r_f b=r−rf
- 商品(存储成本率c): b = r + c b=r+c b=r+c
- 期货合约: b = 0 b=0 b=0(期货价格已隐含持有成本)
补充:风险中性定价
在风险中性测度(Risk-Neutral Measure)下,所有资产的预期收益率被调整为无风险利率r。对于标的资产,其价格动态需考虑以下因素:
- 实际收益率:标的资产的真是预期收益率(通常记为 μ \mu μ)
- 持有成本:例如股息率q、储存成本或便利收益(对商品而言)。
- 无风险利率:r
风险中性定价通过调整标的资产的收益率,使其等于无风险利率r,即:
调整后的收益率
=
r
−
持有成本
或
r
+
遍历收益
调整后的收益率 = r - 持有成本\quad 或\quad r+遍历收益
调整后的收益率=r−持有成本或r+遍历收益
对于股票,若股息率为q,则调整后的收益率为
b
=
r
−
q
b=r-q
b=r−q。因此,在风险中性测度下,标的资产价格
S
t
S_t
St的预期演化公式为:
S
t
=
S
0
⋅
e
b
t
S_t = S_0 \cdot e^{bt}
St=S0⋅ebt
python代码如下所示:
from scipy.stats import norm
from math import log, sqrt, exp
def GBlackScholes(S: float, K: float, T: float, r: float, b: float, sigma: float, option: str = 'call') -> float:
"""
计算广义Black-Scholes期权定价公式的值。
参数:
S (float): 标的资产的当前价格
K (float): 期权的执行价格
T (float): 期权到期时间(年)
r (float): 无风险利率
b (float): 成本率
sigma (float): 标的资产的波动率
option (str): 期权类型,'call' 表示看涨期权,'put' 表示看跌期权
返回:
float: 期权的理论价格
"""
# 计算d1和d2的值
d1 = (log(S / K) + (b + sigma ** 2 / 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
# 根据期权类型计算期权价格
if option == 'call':
return S * exp((b - r) * T) * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2)
elif option == 'put':
return K * exp(-r * T) * norm.cdf(-d2) - S * exp((b - r) * T) * norm.cdf(-d1)
else:
# 若输入的期权类型不是 'call' 或 'put',抛出异常
raise ValueError("Option type must be either 'call' or 'put'.")
2. 基于有现金分红股票的欧式期权定价
当标的资产为股票时,上市公司会按照一定的规则向股东分配利润。在股票持有期间,上市公司发放股息会使股票的价值降低。例如,某股票价格为100元,公司宣布每股发放5元股息,在除息日,股票价格通常会下调5元至95元。对于持有该股票期权的投资者而言,股息的发放会影响其定价。通过将扣除多次预期分红现值后的股票净现值作为新的股票价格输入到BS模型中,其他参数不变,我们可以计算出期权的价值。
python代码如下所示:
from math import exp, sqrt, log
from scipy.stats import norm
def BlackScholes(S0: float, K: float, T: float, r: float, sigma: float, option: str = "call") -> float:
# 计算d1和d2的值
d1 = (log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
# 根据期权类型计算期权价格
if option == "call":
value = S0 * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2)
elif option == "put":
value = K * exp(-r * T) * norm.cdf(-d2) - S0 * norm.cdf(-d1)
else:
# 若输入的期权类型不是 'call' 或 'put',抛出异常
raise ValueError("Option type must be either 'call' or 'put'.")
return value
def CashDividend(S0: float, K: float, T: float, r: float, sigma: float,
D1: float, t1: float, D2: float, t2: float, D3: float, t3: float, option: str) -> dict:
"""
考虑现金分红的期权定价计算。
参数:
S0 (float): 标的资产的当前价格
K (float): 期权的执行价格
T (float): 期权到期时间(年)
r (float): 无风险利率
sigma (float): 标的资产的波动率
D1 (float): 第一次现金分红的金额
t1 (float): 第一次现金分红对应的时间(距离当前时刻的时间)
D2 (float): 第二次现金分红的金额
t2 (float): 第二次现金分红对应的时间(距离当前时刻的时间)
D3 (float): 第三次现金分红的金额
t3 (float): 第三次现金分红对应的时间(距离当前时刻的时间)
option (str): 期权类型,'call' 表示看涨期权,'put' 表示看跌期权
返回:
dict: 包含期权价值和扣除分红现值后的标的资产价格的字典
"""
# 计算扣除现金分红现值后的标的资产价格
stk_price_net_npv_div = S0 - D1 * exp(-r * t1) - D2 * exp(-r * t2) - D3 * exp(-r * t3)
# 调用BlackScholes函数计算期权价值
value = BlackScholes(stk_price_net_npv_div, K, T, r, sigma, option)
result = {
"value": value,
"stk_price_net_npv_div": stk_price_net_npv_div
}
return result
3. 针对交易日波动率调整的Black-Scholes模型
French (1984)对Black-Scholes期权定价模型进行了调整,主要针对于交易日波动率的计算方式进行了修正。标准Black-Scholes模型默认使用日历日计算期权到期时间,但French指出波动率仅在交易日发生,非交易日(如周末、节假日)市场关闭,价格无变化,因此,模型中的时间参数应基于交易日而非日历日。
原Black-Sholes模型:
T
=
日历日到期天数
365
T=\frac{日历日到期天数}{365}
T=365日历日到期天数
French调整后
T
a
d
j
=
交易日到期天数
252
T_{adj}=\frac{交易日到期天数}{252}
Tadj=252交易日到期天数
波动率年化需按交易日调整后的
T
a
d
j
T_{adj}
Tadj进行年化。假设某期权剩余到期时间为30天(含21个交易日),波动率为20%。调整后,时间参数略微增加,期权价格计算更为准确。
模型 | 时间参数 | 年化波动率 |
---|---|---|
原Black-Schole模型 | 30 / 365 ≈ 0.0820 30/365\approx 0.0820 30/365≈0.0820 | 0.2 ∗ 0.0822 ≈ 5.75 0.2*\sqrt{0.0822} \approx 5.75% 0.2∗0.0822≈5.75 |
French调整 | 21 / 252 ≈ 0.0833 21/252\approx 0.0833 21/252≈0.0833 | 0.2 ∗ 0.0833 ≈ 5.77 0.2*\sqrt{0.0833} \approx 5.77% 0.2∗0.0833≈5.77 |
Python 代码如下所示:
from math import exp, sqrt, log
from scipy.stats import norm
def French(S0: float, K: float, T: float, t1: float, r: float, b: float, sigma: float, option: str = "call") -> float:
"""
实现 French (1984) 调整的 Black - Scholes 模型,用于计算考虑交易日波动率的期权价值。
参数:
S0 (float): 标的资产的当前价格
K (float): 期权的执行价格
T (float): 剩余到期时间(日历日)
t1 (float): 剩余到期时间(交易日)
r (float): 无风险利率
b (float): 持仓成本
sigma (float): 标的资产的波动率
option (str): 期权类型,默认为 "call"(看涨期权),也可以是 "put"(看跌期权)
返回:
float: 计算得到的期权价值
"""
# 计算 d1 和 d2
d1 = (log(S0 / K) + (b * T + 0.5 * sigma ** 2 * t1)) / (sigma * sqrt(t1))
d2 = d1 - sigma * sqrt(t1)
# 根据期权类型计算期权价值
if option == "call":
value = S0 * exp((b - r) * T) * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2)
elif option == "put":
value = K * exp(-r * T) * norm.cdf(-d2) - S0 * exp((b - r) * T) * norm.cdf(-d1)
else:
raise ValueError("Option type must be either 'call' or 'put'.")
return value
4. 默顿跳跃扩散模型
Merton (1976)提出了跳跃扩散模型,在传统几何布朗运动的基础上引入了跳跃过程,以更真实地反应市场中由突发事件(如财报公布、政策变动或黑天鹅事件)引起的资产价格突变。跳跃扩散模型可以更好拟合深度虚值/实值期权的波动率微笑,但计算也更加复杂,需级数展开或数值方法(如傅里叶变换)。
模型 | 核心思想 |
---|---|
Black-Scholes模型 | 假设资产价格遵循连续路径(几何布朗运动),且波动率恒定 ,无法解释现实中价格突然跳涨/跳跌的现象(如市场崩盘) |
Merton的改进 | 在几何布朗运动基础上,叠加跳跃过程。 扩散部分:连续的布朗运动(描述日常波动) 跳跃部分:离散的泊松过程(描述突发事件引发的瞬时价格跳跃) 波动率由扩散波动率和跳跃波动率两部分构成 |
跳跃扩散模型下,欧式看涨期权的价格为:
C
=
∑
k
=
0
∞
e
−
λ
′
T
(
−
λ
′
T
)
k
k
!
⋅
C
B
S
(
S
0
,
T
,
K
,
r
,
σ
k
)
\begin{equation} \begin{aligned} C = \sum^{\infty}_{k=0} \frac{e^{-\lambda'T}(-\lambda'T)^{k}}{k!} \cdot C_{BS}(S_0,T,K,r,\sigma_k) \end{aligned} \end{equation}
C=k=0∑∞k!e−λ′T(−λ′T)k⋅CBS(S0,T,K,r,σk)
其中
λ
′
\lambda'
λ′是调整后的跳跃强度:
λ
′
=
λ
(
1
+
κ
)
\lambda' = \lambda (1+\kappa)
λ′=λ(1+κ)
Python代码:
from math import exp, sqrt, factorial, log
from scipy.stats import norm
# 假设已经有 BlackScholes 函数的实现
def BlackScholes(S0, K, T, r, sigma, option="call"):
d1 = (log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
if option == "call":
return S0 * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2)
elif option == "put":
return K * exp(-r * T) * norm.cdf(-d2) - S0 * norm.cdf(-d1)
else:
raise ValueError("Option type must be either 'call' or 'put'.")
def JumpDiffusion(S0: float, K: float, T: float, r: float, sigma: float, lamda: float, gamma: float, option: str = "call") -> float:
"""
计算跳跃扩散模型下的期权价值。
参数:
S0 (float): 标的资产的初始价格
K (float): 期权的执行价格
T (float): 期权到期时间
r (float): 无风险利率
sigma (float): 基础波动率(扩散部分的波动率)
lamda (float): 跳跃频率(年均跳跃次数,如0.1表示平均每年0.1次跳跃)
gamma (float): 跳跃幅度的方差参数,用于控制跳跃方差占总体方差波动率的比例
option (str): 期权类型,默认为 "call"(看涨期权),也可以是 "put"(看跌期权)
返回:
float: 跳跃扩散模型下的期权价值
"""
# 输入参数检查
if lamda <= 0:
raise ValueError("Lamda (jump frequency) must be greater than 0.")
if option not in ["call", "put"]:
raise ValueError("Option type must be either 'call' or 'put'.")
# 计算跳跃幅度的标准差
delta = sqrt(gamma * sigma ** 2 / lamda)
# 调整后的扩散波动率(分离跳跃影响后的基础波动率)
Z = sqrt(sigma ** 2 - lamda * delta ** 2)
# 初始化求和变量
total_sum = 0
# 循环计算不同跳跃次数下的期权价值并求和
for i in range(11):
# 第i次跳跃发生后的总波动率
vi = sqrt(Z ** 2 + delta ** 2 * (i / T))
# 累加每次跳跃次数对应的期权价值
total_sum += exp(-lamda * T) * ((lamda * T) ** i) / factorial(i) * BlackScholes(S0, K, T, r, vi, option)
return total_sum
跳跃扩散模型的期权价格是无限级数求和,此处的代码截断到I=10次跳跃(假设更多次跳跃的概率可忽略)。 e − λ ′ T ( − λ ′ T ) k k ! \frac{e^{-\lambda'T}(-\lambda'T)^{k}}{k!} k!e−λ′T(−λ′T)k 是泊松分布的概率权重(发生i次跳跃的概率)
5. 基于已知股息股票的美式看涨期权
Roll-Geske-Whaley (RGW)模型由Richard Roll (1977)提出,后由Rober Geske和Robert Whaley拓展完善,解决了Black-Sholes无法处理美式期权提前行权的问题。该模型专门用于处理标的资产在期权存续期间派发已知股息的场景。
核心思想: 美式看涨期权在股息派发前可能被提前行权:
- 期权持有者可能在股息除权日前行权,买入股票以获取股息(否则股息归原股东所有)。若不行权,股息除权日后股价下跌可能导致期权价格下跌。
场景对比 | 结果 |
---|---|
持有期权(未行权) | 期权持有者不是股东,无法获得股息,除权后股价下跌,股权价值可能受损 |
持有期权(未行权) | 期权持有者支付行权价X买入股票,成为股东,获得股息d,同时持有股票(股价为S-d) |
-
RGW模型通过计算临界股价(提取行权与持有无差异的股价)和联合概率分布,量化这一这一决策对期权价值的影响。模型通过以下条件判断是否应提前行权。
判断条件: 股息d大于因提前行权所损失的行权价利息收益(X的时间价值: X ( 1 − e − r ( T 2 − t 1 ) ) X(1-e^{-r(T_2-t1)}) X(1−e−r(T2−t1)))时,才值得行权。
d > X ( 1 − e − r ( T 2 − t 1 ) ) d > X(1-e^{-r(T_2-t1)}) d>X(1−e−r(T2−t1))
若在 t 1 t_1 t1行权,需立即支付X,而非等到到期日 T 2 T_2 T2再支付X。若在 t 1 t_1 t1时刻,将这笔钱以无风险利率r投资,到 T 2 T_2 T2时刻可增值为 X e T 2 − t 1 Xe^{T_2-t_1} XeT2−t1,因此损失的利息收益为 X e r ( T 2 − t 1 ) − X = X ( e r ( T 2 − t 1 ) − 1 ) Xe^{r(T_2-t_1)}-X=X(e^{r(T_2-t_1)}-1) Xer(T2−t1)−X=X(er(T2−t1)−1)。将损失利息折现到 t 1 t_1 t1时刻,即 X ( e r ( T 2 − t 1 ) − 1 ) ⋅ e − ( r ( T 2 − t 1 ) ) = X ( 1 − e − r ( T 2 − t 1 ) ) X(e^{r(T_2-t_1)}-1) \cdot e^{-(r(T_2-t_1))}=X(1-e^{-r(T_2-t_1)}) X(er(T2−t1)−1)⋅e−(r(T2−t1))=X(1−e−r(T2−t1))。临界价格: 是指使得提前行权与继续持有期权无差异的股价,即满足:
C ( I , T 2 − t 1 ) = I + d − X C(I,T_2-t1) = I + d - X C(I,T2−t1)=I+d−X
其中, C ( I , T 2 − t 1 ) C(I,T_2-t1) C(I,T2−t1)是以I为当前股价,剩余期限 T 2 − t 1 T_2-t_1 T2−t1的欧式看涨期权价格。假定在时间 t 1 t_1 t1的股票价格为I,若在此刻行权,投资者支付行权价X买入股票,成为股东,获得股息d,同时持有股票(股价为I),那么投资者的资产价值为 − X + d + I -X+d+I −X+d+I,如果不行权,投资者的资产价值为继续持有期权的时间价值 C ( I , T 2 − t 1 ) C(I,T_2-t1) C(I,T2−t1)。由于该方程无解析解,需用数值方法(如二分法)迭代。判断条件和临界价格的关系:
判断条件 d > X ( 1 − e − r ( T 2 − t 1 ) ) d > X(1-e^{-r(T_2-t1)}) d>X(1−e−r(T2−t1))用于初步筛选是否可能触发提前行权。当股息较低时,事件机制主导,提前行权无异议。当股息收益显著,需量化行权价临界点。- 若成立(股息d较小)
提前行权的机会成本(放弃的时间价值)高于股息收益 →无需计算临界价格,直接按欧式期权定价(使用BS模型)。 - 若不成立(股息d较大)
股息收益超过机会成本→需进一步计算临界价格I,调整定价模型。
- 若成立(股息d较小)
模型假设:
- 单一已知股息,标的资产在时间 t 1 t_1 t1派发确定金额股息d。
- 无其他行权动机:仅因股息派发可能触发提前行权。
- 波动率恒定。
- 连续复利:利率和股息贴现使用连续复利计算。
Python代码:
import numpy as np
from math import exp, sqrt, log
from scipy.stats import norm, multivariate_normal
# 假设的 BlackScholes 函数定义
def BlackScholes(S0: float, K: float, T: float, r: float, sigma: float, option: str = "call") -> float:
d1 = (log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
if option == "call":
return S0 * norm.cdf(d1) - K * exp(-r * T) * norm.cdf(d2)
elif option == "put":
return K * exp(-r * T) * norm.cdf(-d2) - S0 * norm.cdf(-d1)
else:
raise ValueError("Option type must be either 'call' or 'put'.")
def mcdf(x: float, y: float, rho: float) -> float:
upper = np.array([x, y])
mu = np.array([0, 0])
sigma = np.array([[1, rho], [rho, 1]])
mvn = multivariate_normal(mu, sigma)
p = mvn.cdf(upper)
return p
def RollGeskeWhaley(S: float, X: float, t1: float, T2: float, r: float, d: float, v: float) -> float:
"""
使用 Roll - Geske - Whaley 模型计算期权价格。
参数:
S (float): 标的资产当前价格
X (float): 期权执行价格
t1 (float): 股息派发时间
T2 (float): 剩余到期时间
r (float): 无风险利率
d (float): 股息金额
v (float): 标的资产波动率
返回:
float: 期权价格
"""
# 输入参数有效性检查
if t1 < 0 or T2 < 0 or r < 0 or d < 0 or v < 0:
raise ValueError("Input parameters t1, T2, r, d, v must be non - negative.")
if T2 < t1:
raise ValueError("T2 must be greater than or equal to t1.")
infinity = 100000000
epsilon = 0.00001
# 调整标的股价(扣除股息现值)
Sx = S - d * exp(-r * t1)
# 判断是否无需提前行权
if d <= X * (1 - exp(-r * (T2 - t1))):
return BlackScholes(Sx, X, T2, r, v, "call")
# 计算初始的期权价格
ci = BlackScholes(S, X, T2 - t1, r, v, "call")
# 初始化搜索范围
HighS = S
# 扩大上界直至满足条件
while (ci - HighS - d + X) > 0 and HighS < infinity:
HighS = HighS * 2
ci = BlackScholes(HighS, X, T2 - t1, r, v, "call")
# 如果上界超过设定的无穷大,按无需提前行权处理
if HighS > infinity:
return BlackScholes(Sx, X, T2, r, v, "call")
LowS = 0
I = HighS * 0.5
ci = BlackScholes(I, X, T2 - t1, r, v, "call")
# 二分法搜索临界价格
while abs(ci - I - d + X) > epsilon and HighS - LowS > epsilon:
if (ci - I - d + X) < 0:
HighS = I # 调整上界
else:
LowS = I # 调整下界
I = (HighS + LowS) / 2
ci = BlackScholes(I, X, T2 - t1, r, v, "call")
# 计算最终期权价格
a1 = (log(Sx / X) + (r + v ** 2 / 2) * T2) / (v * sqrt(T2))
a2 = a1 - v * sqrt(T2)
b1 = (log(Sx / I) + (r + v ** 2 / 2) * t1) / (v * sqrt(t1))
b2 = b1 - v * sqrt(t1)
value = Sx * norm.cdf(b1) + Sx * mcdf(a1, -b1, -sqrt(t1 / T2)) - X * exp(-r * T2) * mcdf(a2, -b2, -sqrt(t1 / T2)) - (X - d) * exp(-r * t1) * norm.cdf(b2)
return value
6. 近似法
美式期权允许到期前任何时间行权,其定价需考虑提前行权的最优实际。精确解需依赖数值方法(如二叉树、有限差分法),但计算成本法,而以下两种近似方法可以显著简化美式期权定价的计算。
Barone-Adesi & Whaley 近似法
Barone-Adesi and Whaley (BAW) 模型(1987)提出了一种半解析近似方法,将美式期权价格
C
A
(
P
A
)
C_A(P_A)
CA(PA)分解为欧式期权价格
C
E
(
P
E
)
C_E(P_E)
CE(PE)与提前行权溢价
ϵ
c
(
ϵ
p
)
\epsilon_c(\epsilon_p)
ϵc(ϵp)之和。
C
A
=
C
E
+
ϵ
c
P
A
=
P
E
+
ϵ
p
\begin{aligned} C_A = C_E+\epsilon_c \\ P_A = P_E+\epsilon_p \ \end{aligned}
CA=CE+ϵcPA=PE+ϵp
当无股息或持有成本较高时( b ≥ r b\ge r b≥r),美式看涨期权提前行权无意义,价格等于欧式期权价格。(类似于5, 股息d大于因提前行权所损失的行权价利息收益时,才值得行权。)
场景 | 是否行权 | 期权价值 |
---|---|---|
b ≥ r b \ge r b≥r | 行权无意义 | 欧式期权价格 |
b < r , S < S k b < r,\quad S<S_k b<r,S<Sk | 不行权 | 欧式期权价格+溢价项 |
b < r , S ≥ S k b < r,\quad S \ge S_k b<r,S≥Sk | 立即行权 | 标的资产价格-行权价 |
溢价项的计算如下所示:
ϵ
c
=
S
k
Q
2
(
1
−
e
−
(
b
−
r
)
T
N
(
d
1
(
S
k
)
)
)
⋅
(
S
S
k
)
Q
2
ϵ
p
=
−
S
k
Q
1
(
1
−
e
−
(
b
−
r
)
T
N
(
−
d
1
(
S
k
)
)
)
⋅
(
S
S
k
)
Q
1
\begin{aligned} \epsilon_c &= \frac{S_k}{Q_2}(1-e^{-(b-r)T}N(d_1(S_k))) \cdot (\frac{S}{S_k})^{Q_2} \\ \epsilon_p &= -\frac{S_k}{Q_1}(1-e^{-(b-r)T}N(-d_1(S_k))) \cdot (\frac{S}{S_k})^{Q_1} \end{aligned}
ϵcϵp=Q2Sk(1−e−(b−r)TN(d1(Sk)))⋅(SkS)Q2=−Q1Sk(1−e−(b−r)TN(−d1(Sk)))⋅(SkS)Q1
其中的
d
1
(
S
k
)
=
(
l
o
g
(
S
k
X
)
+
(
b
+
σ
2
/
2
)
T
)
/
(
σ
T
)
d_1(S_k)=(log(\frac{S_k}{X})+(b+\sigma^2/2)T)/(\sigma \sqrt{T})
d1(Sk)=(log(XSk)+(b+σ2/2)T)/(σT),
Q
1
Q_1
Q1,
Q
2
Q_2
Q2的计算如下所示:
Q
2
=
1
2
[
(
1
−
2
b
σ
2
)
+
(
1
−
2
b
σ
2
)
2
+
8
r
σ
2
(
1
−
e
−
r
T
)
]
Q
1
=
1
2
[
(
1
−
2
b
σ
2
)
−
(
1
−
2
b
σ
2
)
2
+
8
r
σ
2
(
1
−
e
−
r
T
)
]
\begin{aligned} Q_2 &= \frac{1}{2}[(1-\frac{2b}{\sigma^2})+ \sqrt{(1-\frac{2b}{\sigma^2})^2+\frac{8r}{\sigma^2(1-e^{-rT})}}] \\ Q_1 &= \frac{1}{2}[(1-\frac{2b}{\sigma^2})- \sqrt{(1-\frac{2b}{\sigma^2})^2+\frac{8r}{\sigma^2(1-e^{-rT})}}] \end{aligned}
Q2Q1=21[(1−σ22b)+(1−σ22b)2+σ2(1−e−rT)8r]=21[(1−σ22b)−(1−σ22b)2+σ2(1−e−rT)8r]
临界价格计算:
【不知道啊,还不太明白的呢】
Python代码:
from math import exp,sqrt
from scipy.stats import norm
def BAWAmercianCallApprox(S,X,T,r,b,v):
if b >= r : # 提前行权无意义
return GBlackScholes(S,X,T,r,b,v,"call")
else:
Sk = Kc(X, T, r, b, v) # 美式期权提前行权临界价格
n = 2 * b / v ** 2
K = 2 * r / (v ** 2 * (1 - exp(-r * T)))
d1 = (log(Sk / X) + (b + v ** 2 / 2) * T) / (v * sqrt(T))
Q2 = (-(n - 1) + sqrt((n - 1) ** 2 + 4 * K)) / 2
a2 = (Sk / Q2) * (1 - exp((b - r) * T) * norm.cdf(d1))
if S < Sk : # 美式期权价格 = 欧式价格 + 溢价项
return GBlackScholes(S,X,T,r,b,v,"call") + a2 * (S / Sk) ** Q2
else: # 立即行权,价格等于内在价值S-X
return S - X
def BAWAmercianPutApprox(S,X,T,r,b,v):
Sk = Kp(X, T, r, b, v)
n = 2 * b / v ** 2
K = 2 * r / (v ** 2 * (1 - exp(-r * T)))
d1 = (log(Sk / X) + (b + v ** 2 / 2) * T) / (v * sqrt(T))
Q1 = (-(n - 1) - sqrt((n - 1) ** 2 + 4 * K)) / 2
a1 = -(Sk / Q1) * (1 - exp((b - r) * T) * norm.cdf(-d1))
if S > Sk:
return GBlackScholes(S, X, T, r, b, v,"put") + a1 * (S / Sk) ** Q1
else:
return X - S
Bjerksund & Stensland 近似法
Bjerksund & Stensland (1993)提出了美式期权定价近似方式,通过构建临界行权边界(Excercise Boundary),在计算效率和精度之间获得平衡。相比于BAW模型,Bjerksund & Stensland更精细地处理股息对行权边界的影响。
核心思想:
- 临界行权边界:定义一个随时间变化的标的资产阈值 S ∗ ( t ) S^*(t) S∗(t),当标的价 S > S ∗ ( t ) S>S^*(t) S>S∗(t)时,立即执行最优策略。
- 分段函数近似:将期权生命周期划分为不同阶段(如股息支付前后),分别计算边界条件。
美式看涨期权价格公示如下:
C
A
(
S
,
T
)
=
{
α
(
S
,
β
)
,
S
≥
S
∗
(
T
)
ϕ
(
S
,
T
)
,
S
<
S
∗
(
T
)
C_A(S,T)=\begin{cases} \alpha(S,\beta), & S \geq S^*(T) \\ \phi(S,T), & S < S^*(T) \end{cases}
CA(S,T)={α(S,β),ϕ(S,T),S≥S∗(T)S<S∗(T)
(1)临界价格:
S
∗
(
T
)
=
X
1
−
e
−
r
T
N
(
l
o
g
(
β
/
X
)
+
(
r
−
σ
2
/
2
)
T
σ
T
)
S^*(T) = \frac{X}{ 1-e^{-rT}N(\frac{log(\beta / X)+(r-\sigma^2/2)T}{ \sigma \sqrt{T}}) }
S∗(T)=1−e−rTN(σTlog(β/X)+(r−σ2/2)T)X
β
\beta
β是调整参数,通过优化得到。
β
=
(
1
2
−
b
σ
2
)
+
(
b
σ
2
−
1
2
)
2
+
2
r
σ
2
\beta= (\frac{1}{2}-\frac{b}{\sigma^2}) + \sqrt{(\frac{b}{\sigma^2}-\frac{1}{2})^2+\frac{2r}{\sigma^2}}
β=(21−σ2b)+(σ2b−21)2+σ22r
(2)立即行权价值(
S
≥
S
∗
S \ge S^*
S≥S∗)
α
(
S
,
β
)
=
S
−
X
\alpha(S,\beta)= S-X
α(S,β)=S−X
(3) 继续持有价值 (
S
<
S
∗
S < S^*
S<S∗)
ϕ
(
S
,
T
)
=
e
−
r
T
[
F
(
T
)
N
(
d
1
)
−
X
N
(
d
2
)
]
+
α
(
S
,
β
)
(
S
β
)
λ
\phi(S,T) = e^{-rT}[F(T)N(d_1)-XN(d_2)]+\alpha(S,\beta)(\frac{S}{\beta})^{\lambda}
ϕ(S,T)=e−rT[F(T)N(d1)−XN(d2)]+α(S,β)(βS)λ
- F ( T ) = S e ( r − q ) T F(T) = Se^{(r-q)T} F(T)=Se(r−q)T (远期价格,q为股息率。)
- d 1 = l o g ( β / X ) + ( r − σ 2 / 2 ) T σ T , d 2 = d 1 − σ T d1=\frac{log(\beta / X)+(r-\sigma^2/2)T}{ \sigma \sqrt{T}},d2=d1-\sigma \sqrt{T} d1=σTlog(β/X)+(r−σ2/2)T,d2=d1−σT
Python代码
def BSAmercianApprox(S0,K,T,r,b,sigma,option):
if option == "call":
value = BSAmercianCallApprox(S0,K,T,r,b,sigma)
elif option == "put":
# 将PUT视为行权价为S0,标的价为 K的看涨期权
# 调整持仓成本为r-b(因看跌期权的行权逻辑与看涨相反)
value = BSAmercianCallApprox(K,S0,T,r-b,-b,sigma)
else:
value = None
return value
def BSAmercianCallApprox(S0,K,T,r,b,sigma):
# b:持仓成本(b=r-q,q为标的资产股息率)
if b >= r: # 行权无意义(持仓成本高或无股息)
value = GBlackScholes(S0,K,T,r,b,sigma,"call")
else:
#
Beta = (1/2 - b/sigma**2) + sqrt((b/sigma**2 - 1/2)**2 + 2 * r/sigma**2)
BInfinity = Beta / (Beta - 1) * K
B0 = max(K, r/(r-b) * K)
ht = -(b * T + 2 * sigma * sqrt(T)) * B0 / (BInfinity - B0)
I = B0 + (BInfinity - B0) * (1 - exp(ht))
alpha = (I - K) * I ** (-Beta)
if S0 >= I:
value = S0 - K
else:
value = alpha * S0 ** Beta - alpha * phi(S0,T,Beta,I,I,r,b,sigma) + phi(S0,T,1,I,I,r,b,sigma) - phi(S0,T,1,K,I,r,b,sigma) - K * phi(S0,T,0,I,I,r,b,sigma) + K * phi(S0,T,0,K,I,r,b,sigma)
return value
def phi(S0,T,gamma,H,I,r,b,sigma):
lamda = (-r + gamma * b + 0.5 * gamma * (gamma - 1) * sigma ** 2) * T
d = -(log(S0/H) + (b + (gamma - 0.5) * sigma ** 2) * T) / (sigma * sqrt(T))
kappa = 2 * b / sigma ** 2 + (2 * gamma - 1)
value = exp(lamda)* S0 ** gamma * (norm.cdf(d, 0, 1) - (I/S0)**kappa * norm.cdf(d - 2 * log(I / S0) / (sigma * sqrt(T)), 0, 1))
return value
7. Miltersen & Schwartz商品期权模型(高斯情形)
Miltersen & Schwartz (1998) 引入了便利收益(Convenience Yield)和存储成本(Storage Cost)的随机性,拓展了传统的BS框架。其高斯情形假设相关风险因素服从联合正态分布。
二、奇异期权
1. 高管股票期权(Executive stock options)
Executive Stock Options(高管股票期权) 是公司授予高级管理人员(如CEO、CFO等)的一种长期激励工具,允许他们在特定时间内以预定价格(行权价)购买公司股票的权利。行权价,通常为期权授予当天的股票市场价格。若未来的股票价格高于行权价,高管可买入股票并卖出获利(差利=市价-行权价),但若股价长期低于行权价,期权将毫无价值。该期权授予条件通常与业绩目标(如利润增长、股价表现)挂钩,确保高管利益与公司长期发展一致。此外,该期权的行权期需满足时间条件(如分4年逐步解锁)。
高管离职:
当高管在期权到期前(T年内)离职,通常会导致期权作废,失去行权权利,因此高权股票期权的价值需考虑未离职概率的调整。调整公式如下所示:
修正后的期权价值
=
标准期权价值
∗
未离职概率
修正后的期权价值 = 标准期权价值 * 未离职概率
修正后的期权价值=标准期权价值∗未离职概率
假定高管离职是随机事件X,服从参数为
λ
\lambda
λ的泊松(Poisson)分布。例如,
λ
=
0.2
\lambda=0.2
λ=0.2表示平均每年有20%的概率发生离职。那么在时间T内发生k次离职事件的概率为:
P
(
k
)
=
(
λ
T
)
k
e
−
λ
T
k
!
P(k) = \frac{(\lambda T)^k e^{-\lambda T}}{k!}
P(k)=k!(λT)ke−λT
当k=0的时候(即T时间内未发生离职):
P
(
0
)
=
(
λ
T
)
0
e
−
λ
T
0
!
=
e
−
λ
T
P(0) = \frac{(\lambda T)^0 e^{-\lambda T}}{0!} = e^{-\lambda T}
P(0)=0!(λT)0e−λT=e−λT
因此,
e
−
λ
T
e^{-\lambda T}
e−λT表示高管在期权有效期T年内未离职的概率。这样的调整反映了期权因人员流失导致的潜在价值损失,使定价更贴近现实风险。
Python代码实现
from math import exp, sqrt, factorial, log
from scipy.stats import norm
def GBlackScholes(S, X, T, r, b,v, option = 'call'):
d1 = (log(S / X) + (b + v ** 2 / 2) * T) / (v * sqrt(T))
d2 = d1 - v * sqrt(T)
if option == 'call':
return S * exp((b - r) * T) * norm.cdf(d1) - X * exp(-r * T) * norm.cdf(d2)
elif option == 'put':
return X * exp(-r * T) * norm.cdf(-d2) - S * exp((b - r) * T) * norm.cdf(-d1)
else:
return np.nan
def Executive(S0,K,T,r,b,sigma,lamda,option="call"):
"""
计算高管期权的价格。
参数:
S0 (float): 标的资产初始价格
K (float): 期权行权价格
T (float): 期权到期时间(年)
r (float): 无风险利率
b (float): 持仓成本率
sigma (float): 标的资产波动率
lamda (float): 高管离职率
option (str): 期权类型,'call' 表示看涨期权,'put' 表示看跌期权
"""
return exp(-lamda * T) * GBlackScholes(S0, K, T, r, b, sigma,option)
2. 远期启动期权(Forward start options)
远期启动期权,与普通期权的不同之处在于,其生效时间不是在合约签订时立即开始,而是在未来的某个特定日期(即启动日期)才开始生效。在启动日期之前,不具有实际的行权权利等。从启动日期开始,期权才按照常规的期权规则运行,持有者有权在到期日或之前按照约定的行权价格买卖标的资产。
特性 | 普通期权 | 远期启动期权 |
---|---|---|
生效时间 | 立即生效 | 未来特定日期生效 |
行权价去顶 | 当前设定固定行权价 | 通常基于未来生效日的市场价格 |
使用场景 | 当前风险对冲或投机 | 未来资金/风险规划、延迟激励 |
成本 | 立即支付全额期权费 | 可能更低(因生效延迟) |
举个例子:采购咖啡豆
背景设定:
- 角色:咖啡烘焙商
- 需求:3个月后需采购10,000磅咖啡豆,担心价格上涨。
- 当前价格:9美元/磅 (2024年1月1日)
- 市场预测:
1个月后(2024年2月1日)可能涨至10美元/磅(远期启动期权的生效日)。
3个月后(2024年4月1日)可能涨至12美元/磅或跌至9美元/磅。
三种方案:
1. 直接三个月后购买(无对冲)
- 操作:不采取任何对冲,3个月后按市价采购。
- 成本:完全暴露于价格波动风险。
2. 普通看涨期权
- 操作:购买行权价9美元(当前市价)、三个月后到期的看涨期权、权利金为0.5美元/磅
- 成本:立即支付总权利金0.5*10,000=5000美元。立即锁定行权价,但权利金较高。
3. 远期启动看涨期权
- 购买一个月后(2月1日)生效、行权价为生效日市价的看涨期权,权利金为0.3美元/磅
- 成本:立即支付总权利金0.3*10,000=3000美元。行权价动态匹配未来市价,权利金较低。
** 情景分析(三个月后价格变化)**
1. 咖啡豆涨价至12美元/磅
方案 | 操作与成本 | 结果 |
---|---|---|
直接购买 | 按市价12美元/磅采购 → 成本12万美元(10,000磅 × 12美元)。 | 因未对冲,多支付3万美元(vs. 当前价9美元)。 |
普通期权 | 行权价9美元 → 行权后采购成本9万 + 权利金0.5万 = 9.5万美元。 | 节省2.5万美元(vs. 直接购买12万)。 |
远期启动期权 | 行权价10美元 → 行权后采购成本10万 + 权利金0.3万 = 10.3万美元。 | 节省1.7万美元(vs. 直接购买12万)。 |
2. 咖啡豆跌至9美元/磅
方案 | 操作 | 结果 |
---|---|---|
直接购买 | 按市价9美元/磅采购 → 成本9万美元。 | 无额外损失,但未利用下跌机会。 |
普通期权 | 无额外损失,但未利用下跌机会。 | 多支付0.5万美元权利金(vs. 直接购买)。 |
远期启动期权 | 放弃行权 → 按市价9万采购 + 损失权利金0.3万 = 总成本9.3万美元。 | 多支付0.3万美元权利金(vs. 直接购买)。 |
关键对比总结
维度 | 直接购买 | 普通期权 | 远期启动期权 |
---|---|---|---|
最大成本 | 12万美元(若涨至12美元) | 9.5万美元(权利金+行权) | 10.3万美元(权利金+行权) |
最小成本 | 9万美元(若价格持平) | 9.5万美元(权利金损失) | 9.3万美元(权利金损失) |
权利金成本 | 0 | 0.5万美元 | 0.3万美元 |
风险对冲效果 | 无 | 锁定最高成本9.5万美元 | 锁定最高成本10.3万美元 |
灵活性 | 无 | 行权价固定(9美元) | 行权价动态匹配(10美元) |
适用场景 | 价格下跌或稳定 | 强烈看涨,愿支付高成本锁定低价 | 价格波动大,需低成本动态对冲 |
远期启动期权定价
远期启动期权在未来的某个时间点(
t
1
t_1
t1)生效,而非立即生效。其行权价在生效日(
t
1
t_1
t1)根据标的资产(
S
t
1
S_{t_1}
St1)确定,通常为
K
=
α
⋅
S
t
1
K=\alpha \cdot S_{t_1}
K=α⋅St1(
α
\alpha
α为预设比例,如
α
=
1
\alpha=1
α=1表示平价期权)。对远期启动期权进行定价,首先要计算生效日剩余期限(
t
1
→
T
t_1 \to T
t1→T)的标准期权价值,再进行现值调整,将
t
1
t_1
t1时刻的期权价值贴现到0时刻。定价公式如下所示:
C = S 0 ∗ e ( b − r ) t 1 ⋅ C B S ( 1 , α , T − t 1 , r , b , σ ) P = S 0 ∗ e ( b − r ) t 1 ⋅ P B S ( 1 , α , T − t 1 , r , b , σ ) \begin{aligned} C &= S_0 * e^{(b-r)t_1} \cdot C_{BS}(1,\alpha,T-t_1,r,b,\sigma) \\ P &= S_0 * e^{(b-r)t_1} \cdot P_{BS}(1,\alpha,T-t_1,r,b,\sigma) \end{aligned} CP=S0∗e(b−r)t1⋅CBS(1,α,T−t1,r,b,σ)=S0∗e(b−r)t1⋅PBS(1,α,T−t1,r,b,σ)
其中:
- S 0 S_0 S0:标的资产当前价格。
- b b b:持仓成本率(如股票为r-q,q为股息率)
- r:无风险利率
- t 1 t_1 t1:生效日时间(年化)
- T T T:到期时间(年化)
- α \alpha α:行权价比例( K = α ⋅ S t 1 K=\alpha \cdot S_{t_1} K=α⋅St1)
- σ \sigma σ:标的资产波动率。
- C B S ( ⋅ ) C_{BS}(\cdot) CBS(⋅):标准Black-Scholes看涨期权定价公式
回顾标准Black-Sholes公式,可知, S t 1 ⋅ C B S ( 1 , α , T − t 1 , r , b , σ ) S_{t_1} \cdot C_{BS}(1,\alpha,T-t_1,r,b,\sigma) St1⋅CBS(1,α,T−t1,r,b,σ)和 C B S ( S t 1 , K , T − t 1 , r , b , σ ) C_{BS}(S_{t_1},K,T-t_1,r,b,\sigma) CBS(St1,K,T−t1,r,b,σ)的结果是完全一致。计算出生效日 t 1 t_1 t1的期权价值后,再将这个价值贴现到当前时间点,即 S t 1 ⋅ C B S ( 1 , α , T − t 1 , r , b , σ ) ⋅ e − r t 1 S_{t_1} \cdot C_{BS}(1,\alpha,T-t_1,r,b,\sigma) \cdot e^{-rt_1} St1⋅CBS(1,α,T−t1,r,b,σ)⋅e−rt1,就得到了当前时间点的期权价值。在风险中性定价框架下, S t 1 = S 0 ∗ e b t 1 S_{t_1} = S_0 * e^{bt_{1}} St1=S0∗ebt1,带入到式子中,可以得到最终看涨期权价值为 S 0 ∗ e ( b − r ) t 1 ⋅ C B S ( 1 , α , T − t 1 , r , b , σ ) S_0 * e^{(b-r)t_1} \cdot C_{BS}(1,\alpha,T-t_1,r,b,\sigma) S0∗e(b−r)t1⋅CBS(1,α,T−t1,r,b,σ)。
Python代码:
from math import exp, sqrt, log
from scipy.stats import norm
def GBlackScholes(S, X, T, r, b,v, option = 'call'):
d1 = (log(S / X) + (b + v ** 2 / 2) * T) / (v * sqrt(T))
d2 = d1 - v * sqrt(T)
if option == 'call':
return S * exp((b - r) * T) * norm.cdf(d1) - X * exp(-r * T) * norm.cdf(d2)
elif option == 'put':
return X * exp(-r * T) * norm.cdf(-d2) - S * exp((b - r) * T) * norm.cdf(-d1)
else:
return np.nan
def forwardStartOption(S0,alpha,t1,T,r,b,sigma,option="call"):
"""
计算远期启动期权的价格
:param S0: 标的资产当前价格
:param alpha: 与行权价格相关的参数
:param t1: 从当前时刻到期权启动时刻的时间间隔(年)
:param T: 期权的到期时间(从当前时刻开始计算,年)
:param r: 无风险利率
:param b: 成本率
:param sigma: 标的资产价格的波动率
:param option: 期权的类型,'call' 或 'put'
:return: 远期启动期权的价格
"""
return S0 * exp((b - r) * t1) * GBlackScholes(1, alpha, T - t1, r, b, sigma,option)
3. Time switch Options
Time switch期权,是一种路径依赖型(收益与价格路径有关,而飞仅到期时的价格)奇异期权,其收益取决于标的资产价格在期权有效期内达到或超过某一预订水平(执行价格)的累积时间或次数。
核心机制:
- 触发条件:设定一个价格阈值(如执行价)。当标的资产价格高于或低于该阈值时,开始累积收益。
- 按时间计息:通常以固定金额(如每天一定数额)计算收益。例如,价格每维持在阈值上方一天,买方获得固定支付,总收益为所有触发天数的累计值。
定价逻辑
行权概率
在风险中性测度下,标的资产价格服从:
S
t
=
S
0
e
(
b
−
σ
2
2
)
t
+
σ
W
t
S_t = S_0 e^{(b-\frac{\sigma^2}{2})t+\sigma W_t}
St=S0e(b−2σ2)t+σWt
触发条件(如看涨期权)为:
S
t
>
K
⟺
W
t
>
l
o
g
(
K
/
S
0
)
+
(
b
−
σ
2
/
2
)
t
σ
t
S_t > K \iff W_t > \frac{log(K/S_0)+(b-\sigma^2/2)t}{\sigma \sqrt{t}}
St>K⟺Wt>σtlog(K/S0)+(b−σ2/2)t
触发概率为:
P
(
S
t
>
K
)
=
Φ
(
l
o
g
(
K
/
S
0
)
+
(
b
−
σ
2
/
2
)
t
σ
t
)
P(S_t > K) = \Phi(\frac{log(K/S_0)+(b-\sigma^2/2)t}{\sigma \sqrt{t}})
P(St>K)=Φ(σtlog(K/S0)+(b−σ2/2)t)
即Black-Sholes模型中
N
(
d
)
N(d)
N(d)(如果是看跌期权,则是
N
(
−
d
)
N(-d)
N(−d))。
定价公式(Pechtl 1995)
将到期时间T分割成多个小的时间间隔,基于几何布朗运动,计算在时间
i
Δ
t
i \Delta t
iΔt时资产价格超过K的风险中性概率。
C
=
A
e
−
r
T
∑
i
=
1
n
N
(
l
o
g
(
K
/
S
0
)
+
(
b
−
σ
2
/
2
)
i
Δ
t
σ
i
Δ
t
)
Δ
t
+
Δ
t
A
e
−
r
T
m
P
=
A
e
−
r
T
∑
i
=
1
n
N
(
−
l
o
g
(
K
/
S
0
)
−
(
b
−
σ
2
/
2
)
i
Δ
t
σ
i
Δ
t
)
Δ
t
+
Δ
t
A
e
−
r
T
m
\begin{aligned} C &= Ae^{-rT}\sum^{n}_{i=1}N ( \frac{log(K/S_0)+(b-\sigma^2/2)i\Delta t}{\sigma \sqrt{i\Delta t}} ) \Delta t + \Delta t Ae^{-rT}m \\ P &= Ae^{-rT}\sum^{n}_{i=1}N ( \frac{-log(K/S_0)-(b-\sigma^2/2)i\Delta t}{\sigma \sqrt{i\Delta t}} ) \Delta t + \Delta t Ae^{-rT}m \\ \end{aligned}
CP=Ae−rTi=1∑nN(σiΔtlog(K/S0)+(b−σ2/2)iΔt)Δt+ΔtAe−rTm=Ae−rTi=1∑nN(σiΔt−log(K/S0)−(b−σ2/2)iΔt)Δt+ΔtAe−rTm
Python代码
def TimeSwitchOption(S0,K,a,T,m,dt,r,b,sigma,option="call"):
"""
计算Time switch期权的价格
:param S0: 标的资产当前价格
:param K:行权价格
:param a: 累积金额
:param T: 期权的到期时间(从当前时刻开始计算,年)
:param m:已满足的时间单位
:param dt:时间步长
:param r: 无风险利率
:param b: 成本率
:param sigma: 标的资产价格的波动率
:param option: 期权的类型,'call' 或 'put'
:return: 期权的价格
"""
n = T / dt
Sum = 0
if option == "call":
Z = 1
elif option == "put":
Z = -1
for i in range(1,int(n)+1):
d = (log(S0 / K) + (b - sigma ** 2 / 2) * i * dt) / (sigma * sqrt(i * dt))
Sum = Sum + norm.cdf(Z * d) * dt
return a * exp(-r * T) * Sum + dt * a * exp(-r * T) * m
4. 任选期权(Chooser option)
任选期权,赋予持有者在未来某个特定时间点 t 1 t_1 t1(选择期)决定期权类型(看涨Call或看跌Put)的权利。在选择之后,该期权将作为普通期权继续存在,直至到期日 T 2 T_2 T2。
示例
假设某股票现价100美元,执行价均为100美元,选择日在3个月后,到期日在6个月后:
- 情景1:选择日股价涨至110美元,持有者可能选择看涨期权,预期继续上涨。
- 情景2:选择日股价跌至90美元,持有者可转为看跌期权,从下跌中获利。
简单任选期权定价(Rubinstein 1991)
在
t
1
t_1
t1时刻,如果执行价格高于标的资产价格,看涨期权的价值将高于看跌期权的价值,持有者将选择看涨期权,此时期权的价值应该等于看涨期权的价值;相反,如果执行价格低于标的资产价格,看跌期权的价值将高于看涨期权的价值,持有者将选择看跌期权,此时期权的价值应该等于看跌期权的价值。因此,在
t
1
t_1
t1时刻,期权的价值应该为:
V
t
1
=
m
a
x
(
C
B
S
(
S
t
1
,
K
,
T
2
−
t
1
)
,
P
B
S
(
S
t
1
,
K
,
T
2
−
t
1
)
)
V_{t_1} = max(C_{BS}(S_{t_1},K,T_2-t_1),P_{BS}(S_{t_1},K,T_2-t_1))
Vt1=max(CBS(St1,K,T2−t1),PBS(St1,K,T2−t1))
利用看涨-看跌平价关系, C B S ( S t 1 , K , T 2 − t 1 ) − P B S ( S t 1 , K , T 2 − t 1 ) = S t 1 e b ( T 2 − t 1 ) − K e − r ( T 2 − t 1 ) C_{BS}(S_{t_1},K,T_2-t_1)-P_{BS}(S_{t_1},K,T_2-t_1)=S_{t_1}e^{b(T_2-t_1)}-Ke^{-r(T_2-t_1)} CBS(St1,K,T2−t1)−PBS(St1,K,T2−t1)=St1eb(T2−t1)−Ke−r(T2−t1),可以推导出:
V t 1 = C B S ( S t 1 , K , T 2 − t 1 ) + m a x ( 0 , K e − r ( T 2 − t 1 ) ) − S t 1 e b ( T 2 − t 1 ) ) V_{t_1} = C_{BS}(S_{t_1},K,T_2-t_1) + max(0,Ke^{-r(T_2-t_1))}-S_{t_1}e^{b(T_2-t_1)}) Vt1=CBS(St1,K,T2−t1)+max(0,Ke−r(T2−t1))−St1eb(T2−t1))
这意味着任选期权等价于:
- 一份普通看涨期权(到期日 T 2 T_2 T2,执行价为K)
- 一份看跌期权(到期日 t 1 t_1 t1,执行价为 K e ( b + r ) ( T 2 − t 1 ) Ke^{(b+r)(T_2-t_1)} Ke(b+r)(T2−t1))
因此,任选期权的总价值可以表示为:
V 0 = C B S ( S 0 , K , T 2 ) + P B S ( S 0 , K e ( b + r ) ( T 2 − t 1 ) , t 1 ) V_{0} = C_{BS}(S_{0},K,T_2)+P_{BS}(S_0,Ke^{(b+r)(T_2-t_1)},t1) V0=CBS(S0,K,T2)+PBS(S0,Ke(b+r)(T2−t1),t1)
其中调整后的执行价 K e ( b + r ) ( T 2 − t 1 ) Ke^{(b+r)(T_2-t_1)} Ke(b+r)(T2−t1)是为了抵消时间价值差异。【这点我也不是很明白为什么】
Python代码:
def SimpleChooser(S0,K,t1,T2,r,b,sigma):
d = (log(S0 / K) + (b + sigma ** 2 / 2) * T2) / (sigma * sqrt(T2))
y = (log(S0 / K) + b * T2 + sigma ** 2 * t1 / 2) / (sigma * sqrt(t1))
return S0 * exp((b - r) * T2) * norm.cdf(d) - K * exp(-r * T2) * norm.cdf(d - sigma * sqrt(T2)) - S0 * exp((b - r) * T2) * norm.cdf(-y) + K * exp(-r * T2) * norm.cdf(-y + sigma * sqrt(t1))
def ComplexChooser(S0,Xc,Xp,T,Tc,Tp,r,b,sigma):
I = CriticalValueChooser(S0, Xc, Xp, T, Tc, Tp, r, b, sigma)
d1 = (log(S0 / I) + (b + sigma ** 2 / 2) * T) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
y1 = (log(S0 / Xc) + (b + sigma ** 2 / 2) * Tc) / (sigma * sqrt(Tc))
y2 = (log(S0 / Xp) + (b + sigma ** 2 / 2) * Tp) / (sigma * sqrt(Tp))
rho1 = sqrt(T / Tc)
rho2 = sqrt(T / Tp)
return S0 * exp((b - r) * Tc) * mcdf(d1,y1,rho1) - Xc * exp(-r * Tc) * mcdf(d2,y1-sigma*sqrt(Tc),rho1) - S0 * exp((b - r) * Tp) * mcdf(-d1, -y2, rho2) + Xp * exp(-r * Tp) * mcdf(-d2, -y2 + sigma * sqrt(Tp), rho2)
三、利率期权
1. 利率互换期权 (Swaption)【欧式】
利率互换期权(Swaption),它赋予持有者在未来特定日期(或一段时间内)按照约定的条件进行利率互换交易的权利。利率互换本身是双方交换现金流的一种合约,通常一方支付固定利率,另一方支付浮动利率。
工具 | 利率互换 | Swaption | 利率上限/下限期权 |
---|---|---|---|
义务/权利 | 必须执行互换 | 买方可选择是否行权 若买方行权,卖方必须履行互换 | 当市场利率触及条件时,获得补偿。 若买方行权,必须支付差额 |
成本 | 无前期费用 | 需支付期权费 | 需支付期权费,费用较高 |
使用场景 | 利率方向明确时,完全锁定利率 | 利率方向不明确时,保留利率有利变动的收益 | 单边风险对冲或投机 |
互换期权分为两种类型:支付方互换期权(Payer Swaption)和接收方互换期权(Receiver Swaption)。支付方期权允许持有者进入支付固定利率、收取浮动利率的互换,而接收方则相反。
利率互换期权示例
场景:
公司 A:计划在 6 个月后发行一笔 5 年期浮动利率债券(利率 = LIBOR+2%),但担心未来 LIBOR 上升导致融资成本增加。
银行 B:作为金融机构,向公司 A 出售利率互换期权,收取权利金。
合约条款:
名义本金:1 亿元
行权利率:固定利率 4.5%(即公司 A 可选择以 4.5% 的固定利率支付利息)
期限:6 个月后至债券到期(共 5 年)
权利金:公司 A 支付银行 B 100 万元(作为获得期权的费用)
情景一:市场利率上升(LIBOR>4.5%)
假设:6 个月后 LIBOR 升至 5%。
公司 A 的选择:行使期权,将浮动利率(LIBOR+2%=7%)转换为固定利率 4.5%。
实际支付:
公司 A 向银行 B 支付固定利率 4.5% → 利息 = 1 亿 ×4.5%=450 万元 / 年。
银行 B 向公司 A 支付浮动利率 LIBOR=5% → 利息 = 1 亿 ×5%=500 万元 / 年。
净额结算:银行 B 需向公司 A 支付差额 50 万元(500 万 - 450 万)。
最终结果:
公司 A 实际融资成本 = 原浮动利率(LIBOR+2%=7%) - 银行支付的差额 50 万元 → 相当于固定利率 4.5%。
情景二:市场利率下降(LIBOR<4.5%)
假设:6 个月后 LIBOR 降至 3%。
公司 A 的选择:放弃行权,继续支付浮动利率(LIBOR+2%=5%)。
实际支付:
公司 A 直接向债券投资者支付浮动利息 500 万元(1 亿 ×5%)。
银行 B 无需支付,仅保留权利金 100 万元。
最终结果:
公司 A 融资成本为 5%,低于行权利率 4.5%,节省了成本。
利率互换期权价值计算
远期互换利率,具体参看另外的CSDN 【还没写嗷,不着急】
互换期权的收益结构
- 若期权到期时,远期互换利率
年金因子
利率互换期权(Swaption)的定价公式通常基于Black模型
Swaption的价值为“期权行权后的净收益现值”乘以“年金因子”。对于期权行权后的净收益现值,
V
P
=
A
⋅
e
−
r
T
⋅
(
F
⋅
N
(
d
1
)
−
X
⋅
N
(
d
2
)
)
V
R
=
A
⋅
e
−
r
T
⋅
(
X
⋅
N
(
−
d
2
)
−
F
⋅
N
(
−
d
1
)
)
\begin{aligned} V_{P}&=A \cdot e^{-r T} \cdot (F \cdot N(d_1)-X \cdot N(d_2)) \\ V_{R}&=A \cdot e^{-r T} \cdot (X \cdot N(-d_2)-F \cdot N(-d_1)) \\ \end{aligned}
VPVR=A⋅e−rT⋅(F⋅N(d1)−X⋅N(d2))=A⋅e−rT⋅(X⋅N(−d2)−F⋅N(−d1))
其中,A是年金因子,
A
=
1
−
1
(
1
+
F
/
m
)
m
−
t
1
F
/
m
A = \frac{1-\frac{1}{(1+F/m)^{m-t_1}}}{F/m}
A=F/m1−(1+F/m)m−t11。n年金因子表示每支付1单位固定利率所对应的现值总和。
远期利率:
Python代码:
from math import log, sqrt, exp
from scipy.stats import norm
def Swaption(CallPutFlag , t1 , m , F , X , T ,r , v ):
"""
计算利率互换期权的价值。
参数:
Flag (str): 期权类型,'Payer' 表示支付方互换期权(Payer swaption),
'Receiver' 表示接收方互换期权(Receiver swaption)。
t1 (float): 利率互换的期限(以年为单位)。
m (int): 每年的复利次数。
F (float): 远期互换利率。
X (float): 行权利率。
T (float): 期权的到期时间(以年为单位)。
r (float): 无风险利率。
v (float): 远期利率的波动率。
"""
d1 = (log(F / X) + v ** 2 / 2 * T) / (v * sqrt(T))
d2 = d1 - v * sqrt(T)
if CallPutFlag == "Payer": #'Payer swaption
value = ((1 - 1 / (1 + F / m) ** (t1 * m)) / F) * exp(-r * T) * (F * norm.cdf(d1) - X * norm.cdf(d2))
elif CallPutFlag == "Receiver": # 'Receiver swaption
value = ((1 - 1 / (1 + F / m) ** (t1 * m)) / F) * exp(-r * T) * (X * norm.cdf(-d2) - F * norm.cdf(-d1))
return value