第2节 二叉树计算欧式和美式期权价格
第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 二叉树计算期权价格算法
欧式期权价格
- 根据给定的股票价格的波动率σ\sigmaσ和无风险利率rrr,按照上图中公式计算出u,d,u,\;d,u,d,和ppp,其中Δt\Delta tΔt为每一步步长T/NT/NT/N。
- 计算出股票价格在树形末端每个节点的价格,如上右图右侧。
- 根据期权类型(看涨或看跌),以及期权的执行价格KKK计算出期权在树形末端的价格分布。
- 用期权价格的递推关系计算出前一层节点上期权价格的期望值。期权价格的递推关系为
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开始)的价格。 - 重复过程4,直到计算出根节点处期权的价格f0,0f_{0,0}f0,0。
美式期权的价格
重复欧式期权价格的计算过程1~3,然后在递推上一层期权价格时考虑可以在该节点执行的情况,具体为:
- 根据给定的股票价格的波动率σ\sigmaσ和无风险利率rrr,按照上图中公式计算出u,du,\;du,d和ppp。
- 计算出股票价格在树形末端每个节点的价格。
- 根据期权类型(看涨或看跌),以及期权的执行价格KKK计算出期权在树形末端的价格分布。
- 计算出前一层节点上期权价格的期望值。此时需要考虑可以在该节点执行期权,假设期权为看涨期权,则其价格的递推关系为
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为该处的股票价格。 - 重复过程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))
得:
参考资料:
- 《期权、期货及其他衍生产品》,John C. Hull 著,王勇、索吾林译 。
第2节 二叉树计算欧式和美式期权价格相关推荐
- 第8节 蒙卡模拟计算美式期权价格(a)
第8节 蒙卡模拟计算美式期权价格(a) 8.1 简介 8.2 最小二乘法计算美式期权价格 8.3 算法Python代码实现 8.4 计算示例 8.5 相关说明 8.5.1 美式看涨期权不会被提前行使 ...
- 第9节 蒙卡模拟计算美式期权价格(b)
第9节 蒙卡模拟计算美式期权价格(b) 9.1 简介 9.2 参数化执行边界算法 9.3 算法Python代码实现 9.4 计算示例 9.5 参考资料 9.1 简介 使用蒙卡模拟计算美式期权价格除了最 ...
- 第5节 树形计算亚式期权价格
第5节 树形计算亚式期权价格 5.1 简介 5.2 树形计算亚式期权价格算法 5.3 计算算法Python代码实现(平均价格看涨期权) 5.4 计算例子 5.5 相关说明 5.5.1 历史平均股价的极 ...
- matlab二叉树计算期权价格,[转载]期权二叉树定价——SAS/IML初步 (一)
IML是SAS里的交互式矩阵语言产品,基本上与matlab差不多,但IML是可以与sas的DATA互动,所以多了一些特点.更多关于IML基本语句与用法参阅SAS/help文档. proc IML ; ...
- 数据结构树二叉树计算节点_查找二叉树中叶节点的数量 数据结构
数据结构树二叉树计算节点 Algorithm: 算法: One of the popular traversal techniques to solve this kind of problems i ...
- 第4节 树形计算可转换债券价格
第4节 树形计算可转换债券价格 4.1 简介 4.2 计算可转换债券价格算法 4.3 Python代码实现计算 4.4 计算示例 4.1 简介 可转换债券是一种由公司发行的债券.此种债券的持有者在债券 ...
- 设计师:设计师知识储备之室内设计风格图文介绍大全(中式风格、清新风格、现代简约、现代风格、后现代风格、田园风格-中式田园-欧式田园-美式田园-美式乡村风格)之详细攻略
设计师:设计师知识储备之室内设计风格图文介绍大全(中式风格.清新风格.现代简约.现代风格.后现代风格.田园风格-中式田园-欧式田园-美式田园-美式乡村风格)之详细攻略 目录
- 软考-架构师-第五章-系统性能评价 第二节 性能计算(读书笔记)
版权声明 主要针对希赛出版的架构师考试教程<系统架构设计师教程(第4版)>,作者"希赛教育软考学院".完成相关的读书笔记以便后期自查,仅供个人学习使用,不得用于任何商业 ...
- 计算机短路计算基本原理,第八章第五节短路计算计算机算法.doc
第八章第五节短路计算计算机算法 短路计算的计算机算法 前面介绍的用对称分量法计算不对称故障的计算步骤是很简明的.图8-57所示为计算简单故障(短路或断线)的计算程序原理框图. 下面对图8-57所示的框 ...
最新文章
- 如何查看仅一个用户提交的git日志?
- Java面试题!Java获取异常堆栈信息
- Spark On K8S与Spark On YARN方案相比之劣势
- 2020年全国儿童青少年总体近视率为52.7%,比上年上升2.5%播
- WPF学习笔记(三)
- Java Long类shortValue()方法与示例
- ROS + OpenCV
- [Python] L1-037. A除以B 团体程序设计天梯赛GPLT
- 旧电脑 软路由 openwrt 自定义安装ipk 操作记录
- gcj编译java_怎样用gcj编译java程序
- python3自动发送邮件并添加附件
- 【报告分享】小红书品牌营销手册2021-小红书(附下载)
- 雷电2接口_有关雷电4 的一切信息
- 《Android开发卷——设置圆形头像,Android截取圆形图片》
- Nacos百度网盘下载
- 新教师计算机培训心得体会,教师培训心得体会
- Mp4文件播放原理分析
- JavaScript 在元素前后添加元素
- 想在Word中查找所有中文(西文)怎么办?
- 机床的轴越多越好吗,五轴机床到底应该怎么选?