第5节 树形计算亚式期权价格
第5节 树形计算亚式期权价格
- 5.1 简介
- 5.2 树形计算亚式期权价格算法
- 5.3 计算算法Python代码实现(平均价格看涨期权)
- 5.4 计算例子
- 5.5 相关说明
- 5.5.1 历史平均股价的极大和极小值
- 5.5.2 期权价格的递推
5.1 简介
- 亚式期权
亚式期权的价格由股票价格在期权有效期内的平均价格决定。特别地,对亚式平均价格看涨期权,在执行时刻期权价格为max(Save−K,0)\max(S_{ave}-K, 0)max(Save−K,0)。其中KKK为约定的执行价,SaveS_{ave}Save为历史股价平均值。对于亚式平均价格看跌期权,在执行时其价格为max(K−Save,0)\max(K-S_{ave}, 0)max(K−Save,0)。 - 亚式期权具体分类
- 平均价格期权
如上文所述,平均价格看涨和看跌期权在执行时刻的价格分别为 max(Save−K,0)\max(S_{ave}-K, 0)max(Save−K,0)和 max(K−Save,0)\max(K-S_{ave}, 0)max(K−Save,0)。 - 平均执行价格期权
对于平均执行价格期权,其看涨和看跌期权在执行时刻的价格分别为 max(ST−Save,0)\max(S_T-S_{ave}, 0)max(ST−Save,0) 和 max(Save−ST,0)\max(S_{ave}-S_T, 0)max(Save−ST,0),其中STS_TST为执行时刻TTT时的股票价格。 - 美式/欧式期权
平均价格期权或者平均执行价格期权,都可以是美式或者欧式。如果期权为美式,则持有者有权在期权有效期内任一时刻选择执行期权。
- 平均价格期权
5.2 树形计算亚式期权价格算法
我们依旧首先建立一个描述股价变化的二叉树。然后确定对于每个节点,到达该节点所有可能路径的股价平均值的极大和极小值,在极大和极小值之间等间距地插入一点数量数值点。然后根据亚式期权具体类型确定叶子层每个节点上历史平均股价极大和极小值之间所有数值点对应的期权价格。再逐层递推回根节点处。递推时每个平均股价对应的期权价格的计算需要用到插值法。这里用固定一定数量的数值点而不是所有可能的历史路径平均股价是因为所有可能的路径平均股价的数量可能非常大。
算法具体为:
- 根据给定的相关参数计算出二叉树分叉参数p,u,d,p,\, u,\, d,p,u,d,并建立股价变化树形。
u=eσΔt,d=1u,p=erΔt−du−d.u = e^{\sigma \sqrt{\Delta t}}, \;\; d=\frac{1}{u}, \;\; p =\frac{e^{r\Delta t}-d}{u-d} .u=eσΔt,d=u1,p=u−derΔt−d. - 计算并保存树形上每个节点处历史路径平均股价的极大值Save_maxS_{ave\_max}Save_max和极小值Save_minS_{ave\_min}Save_min,
Save_max=1i+1[S01−uj+11−u+S0ujd1−di−j1−d],Save_min=1i+1[S01−di−j+11−d+S0di−ju1−uj1−u].S_{ave\_max} = \frac{1}{i+1}\left[S_0\frac{1-u^{j+1}}{1-u}+S_0u^jd\frac{1-d^{i-j}}{1-d}\right], \\ S_{ave\_min} = \frac{1}{i+1}\left[S_0\frac{1-d^{i-j+1}}{1-d}+S_0d^{i-j}u\frac{1-u^j}{1-u}\right] .Save_max=i+11[S01−u1−uj+1+S0ujd1−d1−di−j],Save_min=i+11[S01−d1−di−j+1+S0di−ju1−u1−uj].
其中S0S_0S0为初始股价,iii为节点所在层数(根节点为0),jjj为节点在该层的位置(最低股价处对应0)。然后在极大和极小值之间插入固定数量的数值点。 - 在树形叶子层,根据期权具体类型,计算出所有历史平均股价数值点对应的期权价格并保存下来。
- 往上一层递推。计算出该层每个节点的每个可能的历史平均股价数值点对应的期权价格。考虑一个具体的平均股价数值点,该点在股价下一步上升或下降后分别对应于下一层一个节点的一个历史平均股价数值,但该价格不一定是在已计算出的数值点中,所以一般需要使用插值法求出数值点对应的期权价格。然后对股价上升或下降后对应数值所对应期权价格进行加权平均并贴现,即为当前层考虑节点的一个平均股价数值点对应的期权价格。
- 重复过程4,直到计算出根节点处期权的价格。
如果期权为美式,则在过程4中需要考虑在每个节点的每个历史平均股价数值点处应不应该执行期权,其它部分的过程不变。
5.3 计算算法 Python 代码实现(平均价格看涨期权)
import mathE = math.eclass Tree_asian_option:def __init__(self, r, sigma, S_0, K, T, steps, points):""" 初始化实例,points为每个节点处历史平均股票价格数值点的数量。"""self.r = rself.sigma = sigmaself.S_0 = S_0self.K = Kself.T = Tself.steps = stepsself.points = pointsself.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.call_price = Noneself.tree = list()self.build_tree()def get_max_min_ave(self, i, j):""" 计算(i,j)节点处历史路径平均股票价格的极大和极小值。"""u, d, S_0 = self.u, self.d, self.S_0max_ave = S_0*(1-u**(j+1))/(1-u)+S_0*(u**j)*d*(1-d**(i-j))/(1-d)max_ave /= 1+imin_ave = S_0*(1-d**(i-j+1))/(1-d)+S_0*(d**(i-j))*u*(1-u**j)/(1-u)min_ave /= 1+ireturn (max_ave, min_ave)def interpolation(self, x, ref_list):""" 线性插值,ref_list 为维度为 points x 2 的数组,默认ref_list按ref_list[i][0]的大小由小到大排序。"""left, right = 0, len(ref_list)-1pos = 0# 如果在范围外,则返回边界值。实际上我们考虑的树形上不会出现这种情况。if x > ref_list[right][0]:return ref_list[right][1]if x < ref_list[left][0]:return ref_list[left][1]# 二分法查找出x在{ref_list[i][0]}中的位置。while left < right:pos = int((left+right)/2)if x == ref_list[pos][0]:return ref_list[pos][1]if x > ref_list[pos][0]:left = pos+1else:right = pos-1if x > ref_list[left][0]:pos = left+1else:pos = left# 线性插值。result = (ref_list[pos][1]-ref_list[pos-1][1])/(ref_list[pos][0]-ref_list[pos-1][0])result *= (x-ref_list[pos-1][0])result += ref_list[pos-1][1]return resultdef build_tree(self):S_0, steps, points = self.S_0, self.steps, self.pointsu, d, p = self.u, self.d, self.pself.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**(lvl-j))node["F_S"] = list()max_ave, min_ave = self.get_max_min_ave(lvl, j)for k in range(points):node["F_S"].append([(max_ave-min_ave)/(points-1)*k+min_ave, None])row.append(node)self.tree.append(row)returndef calculate_call_price(self):""" 计算欧式平均价格看涨期权的价格。"""r, S_0, K = self.r, self.S_0, self.Ksteps, points = self.steps, self.pointsdt, u, d, p = self.dt, self.u, self.d, self.pa = E**(-r*dt)# 边界条件。for node in self.tree[-1]:for k in range(points):node["F_S"][k][1] = max(0, node["F_S"][k][0]-K)# 递推回根节点。for lvl in range(steps-1, -1, -1):for j in range(lvl+1):node = self.tree[lvl][j]for k in range(points):new_ave_u = (node["F_S"][k][0]*(lvl+1)+self.tree[lvl+1][j+1]["S"])/(lvl+2)new_ave_d = (node["F_S"][k][0]*(lvl+1)+self.tree[lvl+1][j]["S"])/(lvl+2)option_price_u = self.interpolation(new_ave_u, self.tree[lvl+1][j+1]["F_S"])option_price_d = self.interpolation(new_ave_d, self.tree[lvl+1][j]["F_S"])node["F_S"][k][1] = a*p*option_price_u+a*(1-p)*option_price_dself.call_price = self.tree[0][0]["F_S"][0][1]return
5.4 计算例子
当无风险利率为0.1,股价波动率为0.4,股价初始值为50。考虑一平均价格看涨期权,执行时间为1年后,执行价格为50。我们使用步数为60步的二叉树,每个节点的历史股价平均值由100个等间隔数值代替。计算如下:
print("r = 0, sigma = 0.4, S_0 = 50, K = 50, T = 1, steps = 60, points = 100 .\n")
tree_obj = Tree_asian_option(0.1, 0.4, 50, 50, 1, 60, 100)
tree_obj.calculate_call_price()
print("欧式平均价格看涨期权价格为:{0:.5f}".format(tree_obj.call_price))
r = 0, sigma = 0.4, S_0 = 50, K = 50, T = 1, steps = 60, points = 100 .欧式平均价格看涨期权价格为:5.57973
5.5 相关说明
5.5.1 历史平均股价的极大和极小值
对于第iii层,第jjj个节点(i,j)(i,j)(i,j),不考虑上升或下降的次序,股价到达该节点一共经历了jjj次上升,(i−j)(i-j)(i−j)次下降。到达该节点的路径的平均股价的极大情况对应于一条股价先上升jjj次后下降(i−j)(i-j)(i−j)次的路径。到达该节点的平均股价的极小情况,对应于一条先下降(i−j)(i-j)(i−j)次后上升jjj次的路径。
Save_max=1i+1[S01−uj+11−u+S0ujd1−di−j1−d],Save_min=1i+1[S01−di−j+11−d+S0di−ju1−uj1−u].S_{ave\_max} = \frac{1}{i+1}\left[S_0\frac{1-u^{j+1}}{1-u}+S_0u^jd\frac{1-d^{i-j}}{1-d}\right], \\ S_{ave\_min} = \frac{1}{i+1}\left[S_0\frac{1-d^{i-j+1}}{1-d}+S_0d^{i-j}u\frac{1-u^j}{1-u}\right] .Save_max=i+11[S01−u1−uj+1+S0ujd1−d1−di−j],Save_min=i+11[S01−d1−di−j+1+S0di−ju1−u1−uj].
5.5.2 期权价格的递推
节点(i,j)(i, j)(i,j)在代码中对应self.tree[i][j]
,是一个dict()
型变量。其中有元素"S"和"F_S","S"对应的值为当前节点股价Si,jS_{i,j}Si,j。"F_S"对应一个二维list()
变量,存储平均股价数值点和对应期权价格共N=N=N= points 对。"F_S"对应的list相当于以离散的数值点的方式描述了一个历史平均股价到期权价格的函数。
考虑一个平均股价数值点Save(k)=kN−1(Save_max−Save_min)+Save_minS_{ave}(k) = \frac{k}{N-1}(S_{ave\_max}-S_{ave\_min})+S_{ave\_min}Save(k)=N−1k(Save_max−Save_min)+Save_min,我们需要计算其对应期权价格。由于股价由当前节点有ppp的概率上升,(1−p)(1-p)(1−p)的概率下降,如果股价上升,则历史平均股价将变为1i+2(Save(k)×(i+1)+uSi,j)\frac{1}{i+2}(S_{ave}(k)\times(i+1)+uS_{i,j})i+21(Save(k)×(i+1)+uSi,j),可以使用下一层的节点(i+1,j+1)(i+1,j+1)(i+1,j+1)的"F_S"数组进行插值计算出期权价格。股价若下降,历史平均股价变为1i+2(Save(k)×(i+1)+dSi,j)\frac{1}{i+2}(S_{ave}(k)\times(i+1)+dS_{i,j})i+21(Save(k)×(i+1)+dSi,j),可以使用下一层的节点(i+1,j)(i+1,j)(i+1,j)的"F_S"数组进行插值计算出期权价格。当前节点的Save(k)S_{ave}(k)Save(k)对应的期权价格即为以上两个期权价格加权平均并贴现后的值。
参考资料:
- 《期权、期货及其他衍生产品》,John C. Hull 著,王勇、索吾林译 。
第5节 树形计算亚式期权价格相关推荐
- 第4节 树形计算可转换债券价格
第4节 树形计算可转换债券价格 4.1 简介 4.2 计算可转换债券价格算法 4.3 Python代码实现计算 4.4 计算示例 4.1 简介 可转换债券是一种由公司发行的债券.此种债券的持有者在债券 ...
- 蒙特卡洛计算亚式期权以及希腊字母计算
文章目录 一.涉及内容 3. 运行效果 三.第一题(hw1_1.py) 1. 缺失值填补: 2. 六个月调整投资组合: 3. 计算日收益率及日平均收益(用于估计每只股票日期望收益): 4. 协方差矩阵 ...
- 第7节 蒙卡模拟计算路径依赖型期权价格
第7节 蒙卡模拟计算路径依赖型期权价格 7.1 简介 7.2 蒙卡模拟计算回望/亚式期权算法 7.3 算法 Python 代码实现 7.4 计算示例 7.5 相关说明 7.5.1 由均匀分布产生正态分 ...
- 第2节 二叉树计算欧式和美式期权价格
第2节 二叉树计算欧式和美式期权价格 2.1 简介 2.2 二叉树计算期权价格算法 2.3 计算过程 Python 代码实现 2.4 相关说明 2.4.1 计算例子 2.4.2 树形定价收敛情况 1. ...
- 计算机短路计算基本原理,第八章第五节短路计算计算机算法.doc
第八章第五节短路计算计算机算法 短路计算的计算机算法 前面介绍的用对称分量法计算不对称故障的计算步骤是很简明的.图8-57所示为计算简单故障(短路或断线)的计算程序原理框图. 下面对图8-57所示的框 ...
- 蒙特卡罗亚式期权定价matlab,[转载]亚式期权定价-——蒙特卡罗方法介绍(二)...
亚式期权是典型的路径依赖性期权,期权的支付有两种:固定亚式期权与浮动亚式期权,指的是到期时支付分别为: (1) max(股价路径的某种平均-K,0) ,K为某一固定敲定价格 (2)max(股价路径的某 ...
- 期权专题7:亚式期权--限售股估值模型
目录 1.模型简介 2. 模型公式 3.代码实现 3.1 计算波动率和收盘价 3.2 计算剩余期限 3.3 计算限售估值 3.4 完整代码 4. 案例实战 5.参数影响 免责声明:本文由作者参考相关资 ...
- 软考-架构师-第五章-系统性能评价 第二节 性能计算(读书笔记)
版权声明 主要针对希赛出版的架构师考试教程<系统架构设计师教程(第4版)>,作者"希赛教育软考学院".完成相关的读书笔记以便后期自查,仅供个人学习使用,不得用于任何商业 ...
- 【投资】实际计算跨式期权
期权有非常多的交易对,在实际交易中仅以肉眼.脑子计算每个期权的盈亏情况是很难快速完成的,大多数普通人的情况是刚计算完其中一个,价格就波动了,形成了新的买一卖一价,更别说算完全部的内容了,因此借助计算机 ...
最新文章
- Redis源码解析——字典基本操作
- matlab ktrlink,大神们,怎么设置滑动滑动条然后出来的图形也跟着变化?
- 【渝粤题库】陕西师范大学200731 计算机组成原理
- java代码_Java 代码实现排序算法
- 含隐变量模型求解——EM算法
- 小黑小波比.Ubuntu14.04安装ffmpeg以及使用ffmpeg
- vue运行报错:Cannot find module 'webpack/bin/config-yargs'
- 点击area不出现黑框_一切小黑屋,都能被黑框玻璃门治愈 | 附安装法则
- JavaEE学习总结(十四)— 人工智能微博
- ps计算机设置在哪,在哪里设置PS对称渐变工具
- 一般python程序员的工资_【Python程序员工资|Python程序员待遇怎么样】-看准网
- python石头剪刀布游戏代码输入格式随机数种子设置为0_Python模拟石头剪刀
- 净重新分类指数NRI的计算
- high sierra php,macOS High Sierra 上测试 Apache 和 PHP 站点
- Linux系统忘记密码的解决办法
- Win10同时安装两个版本的JDK并随时切换,JDK8和JDK11手把手教学
- AI之AutoML:autosklearn/Auto-Sklearn(基于scikit-learn库的自动化的机器学习工具)的简介、安装、使用方法之详细攻略
- 对接第三方系统实操经验分享
- UEFI原理与编程实践--EFI System Table中的输入输出
- PhotoShop如何去除图片上的污点、水印