【定价】二叉树(CRR)欧式/美式期权定价的原理及Python实现

二叉树一种常用的期权定价方法,相比BSM模型,这个方法适用范围更广,可以为美式期权等一些其他品种定价。该方法是保持波动率不变的条件下,将价格路径做简化,根据简化的路径做分析和计算。

本文首先介绍使用二叉树为期权定价的原理,然后给出为欧式期权和美式期权定价的程序。

使用二叉树进行期权定价,主要包含两步:1.从左到右生成二叉树。2.根据生成的二叉树,从右向左计算期权价值。

一.从左向右生成二叉树

期权定价的已知条件有:股票当前价格S0,执行价格K,到期时间T,无风险利率r,股票价格波动率σ。

生成二叉树要知道三个参数:股票价格上涨到的比率u,股票价格下跌到的比率d,股票价格上涨的概率p。所以第一步要根据已知条件计算需要的三个参数。

本部分讨论一步二叉树的情况,多步二叉树是多次进行一步二叉树操作。

1.计算p

p的计算可以使用无套利方法,也可以使用风险中性定价方法。风险中性定价方法简单,所以使用该方法计算p。

所谓风险中性定价,就是假设所有投资者都是风险中性的,即当投资风险增长时,投资者并不需要额外的预期回报率。

在该条件下,股票的价格会以无风险利率的平均速度增长。所以,经过一段时间Δt

后,有

。所以

2.计算u和d

计算u和d的依据是波动率吻合,即二叉树表现出的波动率等于σ。我们知道股票价格在Δt时间区间上收益的标准差为

或者说收益的方差为

在Δt的时间区间上,收益率为u-1的概率为p,为d-1的概率为1-p。根据方差计算公式

可得

。将前面得到的p的公式代入可得

方程中有两个未知数u和d,是无法进行求解的。John Hull的书中,没有解的过程,只是提到了用泰勒展开式。

我查了John C. COX,Stephen A. ROSS,Mark RUBINSTEIN的论文,到解方程的时候,只是来了句A little algebra shows we can accomplish this by letting u和p等于某个值。

网上查到的其他资料,一般是会假设ud=1的条件作为另一个方程。可以做这种假设的原因,应该是波动率吻合即可,u和d的关系不影响定价。因为从BSM的公式可以看出,影响期权价格的标的变动因素只有波动率。

所以,可以假设一种简单的关系ud=1。在这个假设下,波动率能够吻合,并且有比较好的特性:经过u和d后股票价格不变。

解这两个方程可得

经过前面计算,若股票当前价格S0,执行价格K,到期时间T,无风险利率r,股票价格波动率σ已知,在Δt的时间间隔后,股票价格上升下降的比例u、d,上升概率p都能得到。因此,可以一步步的往后构造二叉树了。

二.从右向左计算期权价格

本部分讨论看涨期权,看跌期权原理相同。

1.欧式期权

欧式期权不会提前行权,情况较为简单。定价需要经过两步:1.计算叶子节点的期权价值。2.向前加权平均并折现,得到前一层节点的期权价值。3.重复2步至0时刻。

多步二叉树非叶子节点上的股票价格在这一步其实是没用的。得到期末叶子结点的期权价值后,不断往前加权平均并折现,就得到了每个节点上的期权价格。

2.美式期权

美式期权可能提前行权,要在欧式期权的基础上加一步是否提前行权的判断。定价过程变为:1.计算叶子节点的期权价值。2.向前加权平均并折现,得到前一层节点的期权价值。3.判断在该节点是否提前行权,若提前行权的话,将提前行权的期权价值更新为本节点的期权价值。4.不断重复2和3步至0时刻。

判断是否提前行权,需要先计算提前行权的收益。提前行权的收益为本节点上股票的预期价格减执行价格。如果收益大于期权价值,说明提前行权获利更多,因此会提前行权;反之则不会。

三.程序实现

本部分主要参考《Python金融衍生品大数据分析》,我主要做了两块改动:1.书上没有讲美式期权的二叉树定价程序,我自己实现了下。2.书上的程序逻辑有些不符合我的习惯,做了些改动。尤其是在向前加权平均并折现的逻辑,变量使用有些乱,不易理解,我改成了容易理解的形式。

1.二叉树的实现

这块的核心是用什么数据结构构建二叉树,书上用的是矩阵来实现,这种方式巧妙、简洁。

首先生成了两个矩阵mu和md。通过后边可以知道,生成这两个矩阵就是为得到u和d的幂次矩阵。

mu矩阵
md矩阵

然后用mu-md,得到新的mu矩阵。新的mu和前面的md就是u和d的幂次矩阵。

新的mu矩阵

二叉树在矩阵中位于对角线右上方。通过画出二叉树,我们就很清楚的看明白为什么mu可以作为u的幂次矩阵了。

在矩阵中画出二叉树

但是S0乘以u的mu次幂只是考虑了股价上涨的二叉树,S0乘以d的md次幂只是考虑股价下跌的二叉树。S0乘以u的mu次幂再乘以d的md次幂,你能得到目标二叉树了,如下图。

构建的二叉树

2.程序解释

不对程序做过多解释了,稍微说明一下美式期权定价程序的最后一部分,代码如下:

这块是从矩阵右下角往左上角逐步计算。矩阵的最后一列是叶子节点,所以需要自右向左逐列更新矩阵,从而得到各节点上期权的价值。第一,更新是从叶子节点的前一层开始的,直到更新至第1列,矩阵左上角的位置就是期权价值。第二,并不是更新一列的所有行,一列中只是更新至和列数相同的行数,因为对角线以下的行,二叉树是用不到的。第三,加权平均并折现得到的期权价值,要和提前行权得到的收益比较,取较大者。

最后绘制一下欧式期权二叉树方法和BSM模型的比较,可以看到步数足够多后,二叉树和BSM计算的价格相等。背后的原理应该是二项分布的极限是正态分布,即步数足够多时,沿二项分布路径得到的股票价格,是趋向于正态分布的。

CRR模型和BSM模型的对比

源代码:https://github.com/ququcai/option

微信公众号:曲曲菜

知乎专栏:AI和金融模型

原创作品,未标明作者不得转载。

作者公众号二维码

推荐阅读更多精彩内容