美式期权
大约 4 分钟
美式期权
对于美式认购期权和认沽期权我们采用了二次近似的方法。
Barone-Adesi和Whaley的二次近似方法
现在我们讨论一种对美式期权价格进行近似的方法,该方法由Barone-Adesi和Whaley(1987年)提出(BAW)。这里假设商品具有连续支付。该近似方法的起点是(Black-Scholes)随机微分方程,适用于任何具有价格的衍生品的价值。
在这里,是决定条件性权益价格的(未知)公式。对于欧式期权,的值有一个已知解,即调整后的Black-Scholes公式。对于可能提前行权的美式期权,目前没有已知的解析解。
为了进行近似计算,BAW将美式期权价格分解为欧式期权价格和提前行权溢价。
在这里,表示提前行权溢价。BAW使用的关键是,也必须满足相同的偏微分方程。为了得到近似解,BAW将方程(12.1)转化为一个忽略了涉及的项,并得到了一个标准的线性齐次二阶方程,该方程有一个已知的解。
近似解的函数形式如下所示:
where
公式12.1:Barone Adesi Whaley对美式认购期权价值的函数形式
其中,满足以下方程:
在实施这个公式时,唯一的问题是找到临界值。这是一个经典问题,即找到方程的根。
这可以使用牛顿法来求解。我们首先找到一个初始的“种子”值。下一个估计值通过以下方式得到:
在每一步中,我们需要计算及其导数。
其中,是商品的Black-Scholes价值。下面代码展示了用于计算认购期权价格的这个公式的实现。
import math
from scipy.stats import norm
ACCURACY = 1.0e-6
def option_price_american_call_approximated_baw(S, X, r, b, sigma, time):
sigma_sqr = sigma * sigma
time_sqrt = math.sqrt(time)
nn = 2.0 * b / sigma_sqr
m = 2.0 * r / sigma_sqr
K = 1.0 - math.exp(-r * time)
q2 = ((-(nn - 1) + math.sqrt(pow((nn - 1), 2.0) + (4 * m / K))) * 0.5)
# seed value from paper
q2_inf = 0.5 * ((-(nn - 1) + math.sqrt(pow((nn - 1), 2.0) + 4.0 * m)))
S_star_inf = X / (1.0 - 1.0 / q2_inf)
h2 = (-(b * time + 2.0 * sigma * time_sqrt)) * (X / (S_star_inf - X))
S_seed = X + (S_star_inf - X) * (1.0 - math.exp(h2))
no_iterations = 0 # iterate on S to find S_star using Newton steps
Si = S_seed
g = 1
gprime = 1.0
while ((abs(g) > ACCURACY) and
(abs(gprime) > ACCURACY) and # to avoid exploding Newton's
(no_iterations < 500) and
(Si > 0.0)):
c = option_price_european_call_payout(Si, X, r, b, sigma, time)
d1 = (math.log(Si / X) + (b + 0.5 * sigma_sqr) * time) / (sigma * time_sqrt)
g = (1.0 - 1.0 / q2) * Si - X - c + (1.0 / q2) * Si * math.exp((b - r) * time) * norm.cdf(d1)
gprime = (1.0 - 1.0 / q2) * (1.0 - math.exp((b - r) * time) * norm.cdf(d1)) + (1.0 / q2) * math.exp((b - r) * time) * norm.pdf(d1) * (1.0 / (sigma * time_sqrt))
Si = Si - (g / gprime)
S_star = 0
if (abs(g) > ACCURACY):
S_star = S_seed # did not converge
else:
S_star = Si
C = 0
c = option_price_european_call_payout(S, X, r, b, sigma, time)
if (S >= S_star):
C = S - X
else:
d1 = (math.log(S_star / X) + (b + 0.5 * sigma_sqr) * time) / (sigma * time_sqrt)
A2 = (1.0 - math.exp((b - r) * time) * norm.cdf(d1)) * (S_star / q2)
C = c + A2 * pow((S / S_star), q2)
return max(C, c) # known value will never be less than Black-Scholes value
BAW还可以用于估值看跌期权,通过近似计算其价值。
同样地,可以通过迭代求解来进行估值,例如使用牛顿法,其中现在需要使用: