概述
对期权定价时,一种有用并且很流行的方法是构造二叉树(binomial tree)。这里的二叉树是指代表期权期限内可能会出现的股票价格变动路径的图像。
上图是两步期权定价二叉树示意图。
两种主要的二叉树模型分别是JR(Jarrow-Rudd)二叉树模型和CRR(Cox-Ross-Rubinstein)二叉树。
r为无风险利率,σ为股价波动率。该模型的优点是上升和下降的概率是固定的,不因波动率的变化发生改变,不足是二叉树的形状不再对称而是往上倾斜,中心线上的标的资产价格不再等于初始中心值。
期权二叉树定价通常采用倒退定价法,首先得到每个结点的资产价格,然后在二叉树模型中采用倒推定价法,从树型结构图的末端T时刻开始往回倒推,为期权定价。需要注意的是,如果是美式期权,就要在树型结构的每一个结点上,比较在本时刻提前执行期权和继续再持有到下一个时刻再执行期权,选择其中价值较大者作为本结点的期权价值。
算法实现
下面将给出一个基于Python类的二叉树算法实现,把整个程序拆成三个互相独立的功能模块:
二叉树框架:树的框架结构,包括节点数以及基本参数的保存;
二叉树类型描述:具体数算法的参数,例如上例中的 Jarrow Rudd树;
偿付函数:到期的偿付形式,即为Payoff Function。
二叉树框架(Binomial Tree)
这个类负责二叉树框架的构造,也是基本的二叉树算法的调用入口。它有三个成员:
构造函数(__init__
)
负责接受用户定义的具体参数,例如:spot等;真正二叉树的构造方法,由私有方法_build_lattice
以及传入参数treeTraits共同完成;
树构造细节(_build_lattice
)
接手具体的树构造过程,这里需要依赖根据treeTraits获取的参数例如:up, down。
树回溯(roll_back
)
从树的最茂盛枝叶节点向根节点回溯的过程。最终根节点的值即为期权的价值。这里它要求的参数是一个pay_off
函数。
import numpy as np
import math
from scipy.stats import norm
import seaborn as sns
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15) #添加字体,显示中文
# 设置基本参数
ttm = 2.0 # 到期时间,单位年
tSteps = 250 # 时间方向步数
r = 0.03 # 无风险利率
d = 0.02 # 标的股息率
sigma = 0.2 # 波动率
strike = 100.0 # 期权行权价
spot = 100.0 # 标的现价
option_style = 'call' # 看跌期权('put') or 看涨期权('call')
# 二叉树框架