第2节 二叉树计算欧式和美式期权价格

  • 2.1 简介
  • 2.2 二叉树计算期权价格算法
  • 2.3 计算过程 Python 代码实现
  • 2.4 相关说明
    • 2.4.1 计算例子
    • 2.4.2 树形定价收敛情况

1.1 简介

考虑期权为股票期权,二叉树是指股票价格在期限内可能的变化路径的图形。

考虑时间段为0至T,对于步数为N的二叉树,在t=0,Δt,...,(N−1)Δtt=0,\; \Delta t, ...,(N-1)\Delta tt=0,Δt,...,(N−1)Δt 的时间节点上股票价格有概率ppp由当前价格StS_tSt​变为uStuS_tuSt​,有概率(1−p)(1-p)(1−p)变为dStdS_tdSt​。其中Δt=TN\Delta t = \frac{T}{N}Δt=NT​, u和d分别为上升和下降幅度。当二叉树的步数足够多时,股票价格的最后分布将为对数正态分布。

John Hull的《期权、期货及其他衍生产品》中说明了当我们要求没有无风险套利空间,选取p=erΔt−du−dp=\frac{e^{r\Delta t}-d}{u-d}p=u−derΔt−d​时,期权在当前节点的价格为期权在分叉后价格期望的贴现后价格。此外我们需要选取的uuu和ddd会让股票价格的波动率与几何布朗运动:
dSS=rdt+σdz\frac{dS}{S} = r dt + \sigma dzSdS​=rdt+σdz
相符合。即考虑下列等式,

pu+(1−p)d=erΔt,p(u−1)2+(1−p)(d−1)2−[p(u−1)+(1−p)(d−1)]2=σ2Δt.pu+(1-p)d = e^{r\Delta t}, \;\; p(u-1)^2+(1-p)(d-1)^2-[p(u-1)+(1-p)(d-1)]^2 = \sigma^2\Delta t .pu+(1−p)d=erΔt,p(u−1)2+(1−p)(d−1)2−[p(u−1)+(1−p)(d−1)]2=σ2Δt.
让d=1/ud=1/ud=1/u,我们会得到一个重合的树形。这时忽略Δt\Delta tΔt的32\frac{3}{2}23​阶小量后会有
u=eσΔt,d=e−σΔt.u=e^{\sigma\sqrt{\Delta t}}, \;\; d = e^{-\sigma\sqrt{\Delta t}}.u=eσΔt​,d=e−σΔt​.

下面左图和右图分别为一步和多步二叉树分叉过程,多步二叉树中每一个节点的分叉过程都是相同的。

2.2 二叉树计算期权价格算法

欧式期权价格

  1. 根据给定的股票价格的波动率σ\sigmaσ和无风险利率rrr,按照上图中公式计算出u,d,u,\;d,u,d,和ppp,其中Δt\Delta tΔt为每一步步长T/NT/NT/N。
  2. 计算出股票价格在树形末端每个节点的价格,如上右图右侧。
  3. 根据期权类型(看涨或看跌),以及期权的执行价格KKK计算出期权在树形末端的价格分布。
  4. 用期权价格的递推关系计算出前一层节点上期权价格的期望值。期权价格的递推关系为
    fi,j=e−rΔt(pfi+1,j+1+(1−p)fi+1,j).f_{i,j} = e^{-r\Delta t}(pf_{i+1,j+1}+(1-p)f_{i+1,j})\;.fi,j​=e−rΔt(pfi+1,j+1​+(1−p)fi+1,j​).
    其中fi,jf_{i, j}fi,j​为期权在iΔti\Delta tiΔt时刻,第jjj层(由下往上数,从0开始)的价格。
  5. 重复过程4,直到计算出根节点处期权的价格f0,0f_{0,0}f0,0​。

美式期权的价格

重复欧式期权价格的计算过程1~3,然后在递推上一层期权价格时考虑可以在该节点执行的情况,具体为:

  1. 根据给定的股票价格的波动率σ\sigmaσ和无风险利率rrr,按照上图中公式计算出u,du,\;du,d和ppp。
  2. 计算出股票价格在树形末端每个节点的价格。
  3. 根据期权类型(看涨或看跌),以及期权的执行价格KKK计算出期权在树形末端的价格分布。
  4. 计算出前一层节点上期权价格的期望值。此时需要考虑可以在该节点执行期权,假设期权为看涨期权,则其价格的递推关系为
    fi,j=max⁡[Si,j−K,e−rΔt(pfi+1,j+1+(1−p)fi+1,j)].f_{i,j} = \max{\left[S_{i, j}-K,\;e^{-r\Delta t}(pf_{i+1,j+1}+(1-p)f_{i+1,j})\right]}\;.fi,j​=max[Si,j​−K,e−rΔt(pfi+1,j+1​+(1−p)fi+1,j​)].
    其中fi,jf_{i, j}fi,j​为期权在iΔti\Delta tiΔt时刻,第jjj层的价格,Si,j\;S_{i,j}Si,j​为该处的股票价格。
  5. 重复过程4,计算出根节点处期权的价格f0,0f_{0,0}f0,0​。

2.3 计算过程 Python 代码实现

import numpy as np
import mathE = math.eclass Binomial_tree_sim:def __init__(self, r, sigma, S_0, K, T, steps, option_type="european", call_or_put="call"):""" 用输入参数初始化树。"""self.r = rself.sigma = sigmaself.S_0 = S_0self.K = Kself.T = Tself.steps = stepsself.option_type = option_typeself.call_or_put = call_or_put# 计算出树形分叉参数self.dt = self.T/self.stepsself.u = E**(self.sigma*self.dt**0.5)self.d = 1/self.uself.p = (E**(self.r*self.dt)-self.d)/(self.u-self.d)# 将会得到的结果self.tree = Noneself.option_price = None# 计算出一个树形self.build_tree()def build_tree(self):""" 计算出股票价格在树形上每个节点的价格。"""self.tree = list()for lvl in range(self.steps+1):row = list()for j in range(lvl+1):node = dict()node["stock_price"] = self.S_0*self.u**(j)*self.d**(lvl-j)node["option_price"] = Nonerow.append(node)self.tree.append(row)returndef calculate_option_price(self):""" 计算给定类型期权的价格。"""# 简化参数名称。r, K, steps = self.r, self.K, self.stepsdt, p = self.dt, self.p# 计算出期权在树形末端的价格。for node in self.tree[-1]:# 如果是看涨期权。if self.call_or_put == "call":node["option_price"] = max(node["stock_price"]-K, 0)# 如果是看跌期权。else:node["option_price"] = max(K-node["stock_price"], 0)# 如果是欧式期权。if self.option_type == "european":# 递推出树形根节点期权的价格。for lvl in range(steps-1, -1, -1):for j in range(len(self.tree[lvl])):self.tree[lvl][j]["option_price"] = E**(-r*dt)*(p*self.tree[lvl+1][j+1]["option_price"]+\(1-p)*self.tree[lvl+1][j]["option_price"])# 如果是美式期权,过程同欧式期权,计算节点价格时考虑需不需要在该节点执行。else:for lvl in range(self.steps-1, -1, -1):for j in range(len(self.tree[lvl])):self.tree[lvl][j]["option_price"] = E**(-r*dt)*(p*self.tree[lvl+1][j+1]["option_price"]+\(1-p)*self.tree[lvl+1][j]["option_price"])# 考虑要不要这时执行。if self.call_or_put == "call":self.tree[lvl][j]["option_price"] = max(self.tree[lvl][j]["option_price"], \self.tree[lvl][j]["stock_price"]-K)else:self.tree[lvl][j]["option_price"] = max(self.tree[lvl][j]["option_price"], \K-self.tree[lvl][j]["stock_price"])self.option_price = self.tree[0][0]["option_price"]return

2.4 相关说明

2.4.1 计算例子

考虑一个期限在3年后,执行价格为10的期权。当前股票价格为10,无风险利率为10,股票价格波动率为0.2 。使用10步二叉树,可以如下计算出各种期权价格。

tree_obj = Binomial_tree_sim(0.05, 0.2, 10, 10, 3, 10, option_type="european", call_or_put="call")
tree_obj.calculate_option_price()
print("欧式看涨期权价格为: {:0.4f}".format(tree_obj.option_price))tree_obj = Binomial_tree_sim(0.05, 0.2, 10, 10, 3, 10, option_type="european", call_or_put="put")
tree_obj.calculate_option_price()
print("欧式看跌期权价格为:{:0.4f}".format(tree_obj.option_price))tree_obj = Binomial_tree_sim(0.05, 0.2, 10, 10, 3, 10, option_type="american", call_or_put="call")
tree_obj.calculate_option_price()
print("美式看涨期权价格为:{:0.4f}".format(tree_obj.option_price))tree_obj = Binomial_tree_sim(0.05, 0.2, 10, 10, 3, 10, option_type="american", call_or_put="put")
tree_obj.calculate_option_price()
print("美式看跌期权价格为:{:0.4f}".format(tree_obj.option_price))

输出结果为:

欧式看涨期权价格为: 2.0585
欧式看跌期权价格为:0.6656
美式看涨期权价格为:2.0585
美式看跌期权价格为:0.8563

2.4.2 树形定价收敛情况

依旧考虑上面参数的欧式看涨期权,我们可以用解析公式计算出期权价格应该为2.0924。然后我们可以调整树形定价步数,将得到的期权价格和解析解数值进行比较。

X = np.arange(10, 210, 10)
Y = np.array([])
for steps in X:tree_obj = Binomial_tree_sim(0.05, 0.2, 10, 10, 3, steps, option_type="european", call_or_put="call")tree_obj.calculate_option_price()Y = np.append(Y, [tree_obj.option_price])figure = plt.figure()
ax1 = figure.add_subplot(1, 1, 1)line1, = ax1.plot(X, Y, '-s', color="blue", linewidth=1.5)
line2, = ax1.plot(X, len(X)*[2.0924], '-', color="red", linewidth=1)ax1.set_xlabel("steps")
ax1.set_ylabel("price")
ax1.set_title("option price vs tree depth")
ax1.axis((10, 200, 2.04, 2.1))

得:

参考资料:

  1. 《期权、期货及其他衍生产品》,John C. Hull 著,王勇、索吾林译 。

第2节 二叉树计算欧式和美式期权价格相关推荐

  1. 第8节 蒙卡模拟计算美式期权价格(a)

    第8节 蒙卡模拟计算美式期权价格(a) 8.1 简介 8.2 最小二乘法计算美式期权价格 8.3 算法Python代码实现 8.4 计算示例 8.5 相关说明 8.5.1 美式看涨期权不会被提前行使 ...

  2. 第9节 蒙卡模拟计算美式期权价格(b)

    第9节 蒙卡模拟计算美式期权价格(b) 9.1 简介 9.2 参数化执行边界算法 9.3 算法Python代码实现 9.4 计算示例 9.5 参考资料 9.1 简介 使用蒙卡模拟计算美式期权价格除了最 ...

  3. 第5节 树形计算亚式期权价格

    第5节 树形计算亚式期权价格 5.1 简介 5.2 树形计算亚式期权价格算法 5.3 计算算法Python代码实现(平均价格看涨期权) 5.4 计算例子 5.5 相关说明 5.5.1 历史平均股价的极 ...

  4. matlab二叉树计算期权价格,[转载]期权二叉树定价——SAS/IML初步 (一)

    IML是SAS里的交互式矩阵语言产品,基本上与matlab差不多,但IML是可以与sas的DATA互动,所以多了一些特点.更多关于IML基本语句与用法参阅SAS/help文档. proc IML ; ...

  5. 数据结构树二叉树计算节点_查找二叉树中叶节点的数量 数据结构

    数据结构树二叉树计算节点 Algorithm: 算法: One of the popular traversal techniques to solve this kind of problems i ...

  6. 第4节 树形计算可转换债券价格

    第4节 树形计算可转换债券价格 4.1 简介 4.2 计算可转换债券价格算法 4.3 Python代码实现计算 4.4 计算示例 4.1 简介 可转换债券是一种由公司发行的债券.此种债券的持有者在债券 ...

  7. 设计师:设计师知识储备之室内设计风格图文介绍大全(中式风格、清新风格、现代简约、现代风格、后现代风格、田园风格-中式田园-欧式田园-美式田园-美式乡村风格)之详细攻略

    设计师:设计师知识储备之室内设计风格图文介绍大全(中式风格.清新风格.现代简约.现代风格.后现代风格.田园风格-中式田园-欧式田园-美式田园-美式乡村风格)之详细攻略 目录

  8. 软考-架构师-第五章-系统性能评价 第二节 性能计算(读书笔记)

    版权声明 主要针对希赛出版的架构师考试教程<系统架构设计师教程(第4版)>,作者"希赛教育软考学院".完成相关的读书笔记以便后期自查,仅供个人学习使用,不得用于任何商业 ...

  9. 计算机短路计算基本原理,第八章第五节短路计算计算机算法.doc

    第八章第五节短路计算计算机算法 短路计算的计算机算法 前面介绍的用对称分量法计算不对称故障的计算步骤是很简明的.图8-57所示为计算简单故障(短路或断线)的计算程序原理框图. 下面对图8-57所示的框 ...

最新文章

  1. 如何查看仅一个用户提交的git日志?
  2. Java面试题!Java获取异常堆栈信息
  3. Spark On K8S与Spark On YARN方案相比之劣势
  4. 2020年全国儿童青少年总体近视率为52.7%,比上年上升2.5%播
  5. WPF学习笔记(三)
  6. Java Long类shortValue()方法与示例
  7. ROS + OpenCV
  8. [Python] L1-037. A除以B 团体程序设计天梯赛GPLT
  9. 旧电脑 软路由 openwrt 自定义安装ipk 操作记录
  10. gcj编译java_怎样用gcj编译java程序
  11. python3自动发送邮件并添加附件
  12. 【报告分享】小红书品牌营销手册2021-小红书(附下载)
  13. 雷电2接口_有关雷电4 的一切信息
  14. 《Android开发卷——设置圆形头像,Android截取圆形图片》
  15. Nacos百度网盘下载
  16. 新教师计算机培训心得体会,教师培训心得体会
  17. Mp4文件播放原理分析
  18. JavaScript 在元素前后添加元素
  19. 想在Word中查找所有中文(西文)怎么办?
  20. 机床的轴越多越好吗,五轴机床到底应该怎么选?

热门文章

  1. vue脚手架资源、图片路径
  2. 在html 中插入优酷视频
  3. 图文讲解Zabbix 分布式监控平台添加服务监控项(http,nginx,mysql)
  4. 推荐个比较好用的协同办公软件,帮助你高效办公
  5. 业精于勤毁于嬉,行成于思毁于随
  6. Markdown里的图片并排显示
  7. 如何用php下载文件?
  8. 【UE4从零开始 027】插槽 Slot
  9. 【强化学习】Asynchronous Advantage Actor-Critic(A3C)
  10. Pixi的基本使用(5)--寻宝猎人