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

  • 4.1 简介
  • 4.2 计算可转换债券价格算法
  • 4.3 Python代码实现计算
  • 4.4 计算示例

4.1 简介

可转换债券是一种由公司发行的债券。此种债券的持有者在债券有效期内有权利将债券转换成一定数量的该公司的股票,一个单位的债券可转换的股票的数量为转换率。同时这种债券在有效期内一般都是可以被公司以一定价格赎回的,赎回一单位该债券的价格为赎回价。如果公司将要赎回债券,债券的持有者可以选择将债券转换为股票,即债券被转换的优先级高于债券被赎回。
       
计算可转换债券的价格时不能忽略公司有可能违约。一种相对简单的计算可转换债券价格的方法是基于假设公司股票价格的变化服从几何布朗运动,可以使用一个树形描述股价变化过程,并且在每个Δt\Delta tΔt的时间段内该公司有1−e−λΔt1-e^{-\lambda \Delta t}1−e−λΔt的概率会违约。其中λ\lambdaλ为风险中性违约概率密度。如果公司违约,则在该时刻可转换债券的价格变为债券面值乘以回收率。

4.2 计算可转换债券价格算法

  1. 根据给定参数构建一个公司股价变化的二叉树,其中分叉参数为(由于有概率违约,所以和普通二叉树模型不同):
    u=e(σ2−λ)Δt,d=1u,pu=erΔt−de−λΔtu−d,pd=ue−λΔt−erΔtu−d.u=e^{\sqrt{(\sigma^2-\lambda)\Delta t}}, \;\; d = \frac{1}{u}, \;\; p_u = \frac{e^{r\Delta t}-de^{-\lambda\Delta t}}{u-d}, \;\; p_d = \frac{ue^{-\lambda\Delta t}-e^{r\Delta t}}{u-d}.u=e(σ2−λ)Δt​,d=u1​,pu​=u−derΔt−de−λΔt​,pd​=u−due−λΔt−erΔt​.
  2. 计算出叶子层每个节点的股价对应的可转换债券的价格Bi,jB_{i,j}Bi,j​,具体为Bi,j=max⁡(Si,j×转换率,债券面值)B_{i,j} = \max(S_{i,j}\times转换率,债券面值)Bi,j​=max(Si,j​×转换率,债券面值)。其中iii为层数,jjj为节点位于该层的位置(由低股价到高股价)。
  3. 计算前一层每个节点的股价对应的可转换债券的价格。首先计算不考虑债券被转换或赎回的情况,债券价格的期望
    Bi,j′′=e−rΔt[puBi+1,j+1+pdBi+1,j+p违约×面值×回收率],p违约=1−pu−pd.B_{i,j}^{\prime\prime} = e^{-r\Delta t}[p_uB_{i+1, j+1}+p_dB_{i+1, j}+p_{违约}\times 面值\times 回收率],\;\; p_{违约} = 1-p_u-p_d .Bi,j′′​=e−rΔt[pu​Bi+1,j+1​+pd​Bi+1,j​+p违约​×面值×回收率],p违约​=1−pu​−pd​.
    如果该价格大于公司可以赎回的价格,那么公司将会赎回,所以
    Bi,j′=min⁡(Bi,j′′,赎回价).B_{i,j}^\prime = \min(B_{i,j}^{\prime\prime}, \;赎回价).Bi,j′​=min(Bi,j′′​,赎回价).
    持有者可以选择在公司赎回前转换债券为股票,所以该节点债券最终价格为
    Bi,j=max⁡(Bi,j′,转换率×Si,j)=max⁡[min⁡(Bi,j′′,赎回价),转换率×Si,j].B_{i,j} = \max(B_{i,j}^\prime,\; 转换率\times S_{i,j}) = \max\left[\min(B_{i,j}^{\prime\prime},\; 赎回价),\; 转换率\times S_{i,j}\right].Bi,j​=max(Bi,j′​,转换率×Si,j​)=max[min(Bi,j′′​,赎回价),转换率×Si,j​].
  4. 重复步骤3,直到计算出根节点处的可转换债券价格。

4.3 Python代码实现计算

import mathE = math.eclass Tree_convertible_bond:def __init__(self, r, sigma, S_0, T, lbd, conversion_ratio, callback_price, par_value, recycle_ratio, steps):self.r = rself.sigma = sigmaself.S_0 = S_0self.T = Tself.lbd = lbdself.conversion_ratio = conversion_ratioself.callback_price = callback_priceself.par_value = par_valueself.recycle_ratio = recycle_ratioself.steps = stepsself.dt = self.T/self.stepsself.u = E**(((self.sigma*self.sigma-self.lbd)*self.dt)**0.5)self.d = 1/self.uself.p_u = (E**(self.r*self.dt)-self.d*E**(-self.lbd*self.dt))/(self.u-self.d)self.p_d = (self.u*E**(-self.lbd*self.dt)-E**(self.r*self.dt))/(self.u-self.d)self.p_default = 1-self.p_u-self.p_dself.bond_price = Noneself.tree = Noneself.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["S"] = self.S_0*(self.u**j)*(self.d**(lvl-j))node["B"] = Nonerow.append(node)self.tree.append(row)returndef calculate_bond_price(self):tree = self.treer, steps = self.r, self.stepsconversion_ratio, callback_price = self.conversion_ratio, self.callback_pricerecycle_ratio, par_value = self.recycle_ratio, self.par_valuedt, u, d = self.dt, self.u, self.d p_u, p_d, p_default = self.p_u, self.p_d, self.p_default# Discount factor.a = E**(-r*dt)# Boundary condition.for node in tree[-1]:node["B"] = max(node["S"]*conversion_ratio, par_value)# Iteratively calculate back to root node.for lvl in range(steps-1, -1, -1):for j in range(lvl+1):tree[lvl][j]["B"] = a*p_u*tree[lvl+1][j+1]["B"]+a*p_d*tree[lvl+1][j]["B"]tree[lvl][j]["B"] += a*p_default*par_value*recycle_ratiotree[lvl][j]["B"] = max(min(tree[lvl][j]["B"], callback_price), tree[lvl][j]["S"]*conversion_ratio)self.bond_price = tree[0][0]["B"]return

4.4 计算示例

当无风险利率为0.05,公司股价波动率为0.3,股价初始值为50,考虑一到期日为9个月后的可转换债券。其转换率为2(1债券可以被持有人转换为2支股票),公司可以用113的价格提前赎回债券,债券的面值为100。此外假设该公司每年有0.01的概率会违约,如果违约债券的回收率为0.4,即价值变为40 。
       
对于这种情况,我们用一个10步的树形计算该可转换债券价格,具体结果如下:

tree_obj = Tree_convertible_bond(0.05, 0.3, 50, 0.75, 0.01, 2, 113, 100, 0.4, 10)
tree_obj.calculate_bond_price()
bond_price = tree_obj.bond_priceprint("r: 0.05,  sigma: 0.3,  S_0: 50,  T: 0.75,  lambda: 0.01,  conversion_ratio: 2,\n")
print("callback_price: 113,  par_value: 100,  recycle_ratio: 0.4,  steps: 10 . \n\n")
print("可转换债券价格为:", bond_price)

r: 0.05, sigma: 0.3, S_0: 50, T: 0.75, lambda: 0.01, conversion_ratio: 2,
callback_price: 113, par_value: 100, recycle_ratio: 0.4, steps: 10 .
可转换债券价格为: 106.61156436861458

参考资料:

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

第4节 树形计算可转换债券价格相关推荐

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

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

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

    第2节 二叉树计算欧式和美式期权价格 2.1 简介 2.2 二叉树计算期权价格算法 2.3 计算过程 Python 代码实现 2.4 相关说明 2.4.1 计算例子 2.4.2 树形定价收敛情况 1. ...

  3. html表单输入价格,在HTML中使用表格来计算总价格

    我该如何编写一个函数来计算用户选择的计算机组件的总价格,这是我迄今为止的,但现在我似乎被卡住了.有任何想法吗?我正在尝试为内存价格,硬盘价格和网络价格创建一个阵列.然后不知道该从哪里出发.在HTML中 ...

  4. 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折

    package com.itheima.test;import java.util.Scanner;public class Test1develop {public static void main ...

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

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

  6. 如何选择好公司和计算好价格

    学习完投资理论,当然就要把理论转化为实践,进入股票的实际操作阶段.由于我所接触的是一个系统的投资理论体系,为了复习,也为了练习,现在把第一步选择好公司,计算好价格的过程完整的记录下来,分享给大家,希望 ...

  7. python计算涨停价格

    计算涨停价格,只需要一个输入参数:昨日收盘价pre_close 涨停价格计算原理 limit_price = pre_close + pre_close * 0.1 对涨停价格limit_price做 ...

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

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

  9. Python百货公司促销,输入购物款数,计算打折价格

    #百货公司促销,输入购物款数,计算打折价格 g=int(input('请输入原价:')) if g>=5000:m=0.8 elif g>=3000:m=0.85 elif g>=2 ...

最新文章

  1. Android Activity 生命周期和LaunchMode 规则
  2. hadoop1.2.1伪分布模式配置
  3. linux 应用层编程之内核链表list的使用
  4. 【Tools】XMind8安装教程详解
  5. ubuntu问题解答集锦
  6. ABAP SAPGUI 里使用 F4 value help 选择时间
  7. 源码编译安装Nginx
  8. 微结构设计能力看国产CPU发展
  9. vue重复路由_解决vue路由name同名,路由重复的问题
  10. 上海淘财经网要道歉客户的信
  11. linux命令比较命令,Linux命令 比较文件
  12. docker 报错:x509: certificate has expired or is not yet valid
  13. 经过 8 万画作+人工注释训练,算法学会了赏析名画
  14. 4K工业级高清2进1出HDMI自动USB KVM多电脑切换器(MT-HK201)
  15. springboot启动时自动关闭问题 com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
  16. 在python中实现输出易经六十四卦
  17. 利用snowfall.jquery.js实现爱心满屏飞
  18. css 单行、两行 或 多行显示不下 省略号...表示实现
  19. bt5使用教程----渗透方面
  20. (邻接表/邻接矩阵)图的实现

热门文章

  1. js生成不重复的随机数
  2. 个人渗透技巧汇总(避坑)笔记
  3. 计算机考证直接考四级
  4. Microsoft.SqlServer.Management.Sdk.Sfc, Version=12.0.0.0, Culture=neutral, .....
  5. 初级算法_反转字符串
  6. 楚留香pc端连接服务器未响应,楚留香游戏pc端闪退怎么办_楚留香游戏中pc端闪退解决办法汇总...
  7. 【ACWing】1120. 埃及分数
  8. xp计算机管理员桌面文件没有权限,WinXP系统设置文件夹权限的操作方法
  9. 5G/NR PDSCH之时域资源分配
  10. linux shell教程(一)