第3节 树形计算回望期权价格
3.1 简介
- 回望式期权
回望期权是一种价格依赖于股票历史价格极值的期权。如果回望期权为只能在到期日执行的欧式回望期权,其价格有解析解。不过这里我们主要使用二叉树法对回望期权当前价格进行数值计算。
对于浮动回望看涨期权,其到期时价值为 max ( S T − S m i n , 0 ) \max(S_T-S_{min}, \;0) max(ST−Smin,0), 其中 S T S_T ST为执行时间 T T T时刻股价, S m i n S_{min} Smin为有效期内股票的历史最低价格。类似地,浮动回望看跌期权到期时价值为 max ( S m a x − S T , 0 ) \max(S_{max}-S_T, \; 0) max(Smax−ST,0),其中 S m a x S_{max} Smax为期权有效期内股票的历史最高价格。
- 回望期权具体分类
- 浮动/固定回望期权
浮动回望看涨期权的收益等于最后的股价超出期限内股票最低价的差价,浮动回望看跌期权的收益等于有效期内股票最高价格超出股票最后价格的差价。固定回望期权和普通期权相似,对于固定回望看涨期权,其收益为期限内股票最高价格超出约定执行价格的差价,对于固定回望看跌期权,收益为约定执行价格大于期限内股票最低价格的价差。 - 欧式/美式回望期权
无论浮动或是固定回望期权,都可以是欧式或美式。如果期权为美式期权,则持有者有权选择在有效期内任意时刻执行期权。
- 浮动/固定回望期权
3.2 树形计算回望期权价格算法
以欧式浮动回望看涨期权为例,我们先简单描述一下计算过程。首先还是建立一个股价变化的树形。对于普通欧式期权的二叉树定价,我们知道在树形每个节点,节点上的股价都对应于一个期权价格。但是在回望看涨期权的情况下,不是每个股价对应于一个期权价格,而是节点上每个可能的历史最低股价对应于一个期权价格,所以每个节点需要计算和保存在该处所有可能的股票历史最低价格。然后计算出树形末端执行时刻期权在每个节点每个历史最低股价对应的价格,往回递推出根节点处回望期权的价格。递推计算是用每个节点处每个历史最低价格,可能到达的下一层的节点的对应历史最低价格所对应的期权价格,进行加权平均和贴现。
算法具体为:
- 根据给定的相关参数计算出二叉树分叉参数 p p p, u u u, d d d。并建立股价变化树形。
u = e σ Δ t , d = 1 / u , p = e r Δ t − d u − d . u = e^{\sigma\sqrt{\Delta t}}, \;\; d = 1/u, \;\; p = \frac{e^{r\Delta t}-d}{u-d} . u=eσΔt,d=1/u,p=u−derΔt−d. - 从根节点处开始一层一层计算,在每层每个节点处计算出所有可能的历史最低股价并保存下来。
- 在树形叶子层计算出每个节点每个可能的历史最低股价所对应的期权价格并保存下来。
- 往上一层递推,计算出该层每个节点的每个可能的历史最低股价对应的期权价格。具体在每个节点,其每个可能的历史最低股价都对应一类历史路径,在该类历史路径情况下,股票在下一步价格上升或下降都分别对应于下一层一个节点的一个历史最低股价。 所以该节点的一个历史最低股价对应的期权价格,可以通过对股价上升或下降后到达的下一层节点的历史最低股价所对应的期权价格进行加权平均并贴现。
- 重复过程4,直到计算出根节点处期权价格。
对于美式回望看涨期权,在过程4中需要考虑在每个节点的每个历史最低股价的情景下应不应该执行期权,其它部分的过程不变。
3.3 计算算法 Python 代码实现
import math
E = math.e
class Tree_lookback_option:
def __init__(self, r, sigma, S_0, T, steps, strike_price=None, option_type="european"):
""" 初始化实例。
"""
self.r = r
self.sigma = sigma
self.S_0 = S_0
self.T = T
self.steps = steps
self.option_type = option_type
self.dt = self.T/self.steps
self.u = E**(self.sigma*self.dt**0.5)
self.d = 1/self.u
self.p = (E**(self.r*self.dt)-self.d)/(self.u-self.d)
# 如果strike_price为 None,则期权为浮动回望期权,否则期权为固定回望期权(执行价格为strike_price)。
self.strike_price = strike_price
self.call_price = None
self.put_price = None
# 构建一个树形
self.tree = list()
self.build_tree()
def build_tree(self):
""" 构建股票价格变化树形,并计算出每个节点所包含的所有可能的历史股票价格的极值。
"""
# 简化参数名称。
S_0, steps = self.S_0, self.steps
u, d, p = self.u, self.d, self.p
self.tree = list()
for lvl in range(steps+1):
row = list()
for j in range(lvl+1):
node = dict()
node["S"] = S_0*(u**j)*(d**