债券专题二:可转债估值-二叉树模型

news2025/1/20 16:23:24

  1. 模型背景  

    由于可转债自身的属性较多,因此对其定价的难度也会加大,在诸多影响因素中,未来的股价占比最高。由于股价的不可预测性,导致了可转债的定价在实际交易中作用非常有限。随着可转债发行数量和规模的增大,越来越多的机构参与到其中,这也使得越来越多的人开始研究可转债定价,可转债的投机属性降低。随着量化投资的火爆,越来越多的可转债影响因素被标准化,推动了可转债模型定价的迭代的发展。基于市场扩容和技术进步,可转债定价有效性在逐渐加大。目前常见的可转债估值模型有3种:BS模型,二叉树模型,蒙特卡罗模型。本文主要分享二叉树模型的估值逻辑,并复现其代码。

2. 模型公式

3. 模型代码

import numpy as np


class Convertible_Bond(object):
    def __init__(self, T, vol, market, st, rate, r, coupon, r_, dt, up, down, lp):
        self.T = T  # 期限
        self.vol = vol  # 波动率
        self.market = market  # 面值
        self.st = st  # 股票价格
        self.rate = rate  # 转换比率
        self.r = r  # 无风险利率
        self.coupon = coupon  # 票息
        self.r_ = r_  # 信用利差
        self.dt = dt  # 赎回间隔
        self.up = up  # 上涨空间
        self.down = down  # 下跌空间
        self.lp = lp  # 赎回价格

    # 计算风险中性概率
    def risk_p(self):
        a = np.e ** (self.r * self.dt)
        return (a - self.down) / (self.up - self.down)

    # 计算到期价值
    def expire_value(self, expire_price):
        # expire_price:到期股票价格
        # 计算到期转换价值
        change_value = expire_price * self.rate + self.market * self.coupon
        # 计算含票息的价值
        coupon_value = self.market * (1 + self.coupon)
        V = max(change_value, coupon_value)
        return V

    # 计算每一个节点的连续价值
    def continuous_value(self, expire_up, expire_down):
        # expire_down:下一节点下跌对应的可转债到期价值
        # expire_up:下一节点上涨对应的可转债到期价值
        b = np.e ** (-(self.r + self.r_) * self.dt)
        risk_p = self.risk_p()
        coupon_v = self.market * self.coupon
        H = b * (risk_p * expire_up + (1 - risk_p) * expire_down) + coupon_v
        return H

    # 计算当前的节点价值
    def really_value(self, expire_price, H):
        # 计算提前兑付值,假设在赎回时获得票息收入
        C = self.market * self.coupon
        K = self.market + C
        V = max(self.rate * expire_price + C, min(H, K))
        return V

4. 模型实例 

 某可赎回可转债要素如下:(为简化起见,模型暂不考虑部分可转债的特性,使用两步长的最基础的可转债作为案例。)

可赎回-可转债要素
期限2年波动率20%
面值100股票价格100
转换比例0.8利率3%
票息率3%信用利差1%
赎回条款只在第一年上涨比例1.2214
赎回价格100下跌比例0.8187

 首先,对函数进行传参,同时计算s1到s5的值:

if __name__ == '__main__':
    T, vol, market, st, rate, r = 2, 0.2, 100, 100, 0.8, 0.03
    coupon, r_, dt, up, down, lp = 0.03, 0.01, 1, 1.2214, 0.8187, 100
    model = Convertible_Bond( T, vol, market, st, rate,
                              r, coupon, r_, dt, up, down, lp)
    # 分别计算股票s1,到s5的值
    s1 = round(st*up,2)
    s2 = round(st*down,2)
    s3 = round(s1*up,2)
    s4 = round(s1*down,2)
    s5 = round(s2*down,2)

计算得到的结果为:

然后,根据 s3,s4,s5的值可以计算出对应节点债券的到期价值:

接下来,根据b3到b5的到期价值,计算b1,b2节点上的连续价值H1,H2:

 随后,考虑可赎回性,根据s1,s2和H1,H2,计算b1,b2节点上的 节点价值1,V2:

紧接着,使用V1和V2的 值计算当前节点的连续价值H,根据H和s1计算当前节点可赎回债券的估值V:

本章节的完整代码为:

if __name__ == '__main__':
    T, vol, market, st, rate, r = 2, 0.2, 100, 100, 0.8, 0.03
    coupon, r_, dt, up, down, lp = 0.03, 0.01, 1, 1.2214, 0.8187, 100
    model = Convertible_Bond(T, vol, market, st, rate,
                             r, coupon, r_, dt, up, down, lp)
    # 分别计算股票s1,到s5的值
    s1 = round(st * up, 2)
    s2 = round(st * down, 2)
    s3 = round(s1 * up, 2)
    s4 = round(s1 * down, 2)
    s5 = round(s2 * down, 2)

    # 计算债券b3,b4,b5的值
    b3 = round(model.expire_value(s3), 2)
    b4 = round(model.expire_value(s4), 2)
    b5 = round(model.expire_value(s5), 2)

    # 计算H1和H2的值
    H1 = round(model.continuous_value(b3, b4), 2)
    H2 = round(model.continuous_value(b4, b5), 2)

    # 计算b1,b2节点上的节点价值
    V1 = model.really_value(s1, H1)
    V2 = model.really_value(s2, H2)

    # 计算当前节点的连续价值H
    H = round(model.continuous_value(V1, V2), 2)
    # 计算当前节点可转债的估值
    V = model.really_value(st, H)

 本期分享结束,有何问题欢迎随时交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP支持的伪协议

php.ini参数设置 在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。 allow_url_fopen:默认值是ON。允许url里的封装协议访问文件; allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件; 各协议的利用条件和方法 php:/…

notepad++打开文本文件乱码的解决办法

目录 第一步 在编码菜单栏下选择GB2312中文。如果已经选了忽略这一步 第二步 点击编码,红框圈出来的一个个试。我切换到UTF-8编码就正常了。 乱码如图。下面分享我的解决办法 第一步 在编码菜单栏下选择GB2312中文。如果已经选了忽略这一步 第二步 点击编码&#…

伦敦金和现货黄金是一回事吗?

想进入黄金市场的朋友,在网上一搜相关的讯息,可能就懵了。这个市场中好像有几个品种,又是伦敦金又是现货黄金什么的。很多新手投资者想知道,这些伦敦金、现货黄金分别是指什么,下面我们就来讨论一下。 实际上&#xff…

Open CASCADE学习|曲线向曲面投影

在三维空间中,将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现,但最常见的是使用数学和几何库,如OpenCASCADE,来处理这些计算。 在OpenCASCADE中,投影曲线到曲面通常涉及以下步骤:…

Vue项目启动过程全记录(node.js运行环境搭建)

一、安装node.js并配置环境变量 1、安装node.js 从Node.js官网下载安装包并安装。然后在安装后的目录(如果是下载的压缩文件,则是解压缩的目录)下新建node_global和node_cache这两个文件夹。 node_global:npm全局安装位置 node_…

Python 字符串格式化输出

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 前言 字符串格式化是编程中一个常见的需求,它可以们将不同类型的数据(如数字、文本、日…

【ansible】认识ansible,了解常用的模块

目录 一、ansible是什么? 二、ansible的特点? 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步:配置主机清单 第二步:完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1:comma…

Shiro反弹shell和权限绕过含工具包

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、前言 反序列化漏洞原理和Shiro反序列化漏洞原理请参…

AI绘画图生图怎么用?

AI绘画图生图是指利用人工智能技术,将一张已有的图片转化为另一张具有艺术风格的新图片的过程。这种技术可以应用于多个领域,如室内设计等。 在使用AI绘画图生图功能时,用户需要选择一张参考图片,然后设置生成图片的风格、尺寸、数…

svg之全局组件,配合雪碧图解决vue2的svg优化问题

这里是vue2中的svg的完整解决方案的另一篇。 <template><svg :class"svgClass"><use :xlink:href"#${name}"></use></svg> </template><script>export default {name: icon,props: {name: {type: String,requi…

Bonjour Print Services

Bonjour Print Services &#xff08;apple mobile&#xff09; https://download.csdn.net/download/spencer_tseng/88845785

C++ 离散化 算法 (详解)+ 例题

1、性质 把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的空间效率。通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的压缩。 适用范围&#xff1a;数的跨度很大&#xff0c;用的数很稀疏 例如&#xff1a;值域…

Java实现Dfs算法(基本讲解)

目录 一、Dfs算法的概念 二、Dfs算法的设计步骤 三、Dfs算法模板 四、Dfs算法经典例题 &#xff08;1&#xff09;全排列 &#xff08;2&#xff09;N皇后 一、Dfs算法的概念 Depth First Search 即 DFS&#xff0c;意为深度优先搜索&#xff0c;是所有的搜索手段之一。它…

[Flink03] Flink安装

本文介绍Flink的安装步骤&#xff0c;主要是Flink的独立部署模式&#xff0c;它不依赖其他平台。文中内容分为4块&#xff1a;前置准备、Flink本地模式搭建、Flink Standalone搭建、Flink Standalong HA搭建。 演示使用的Flink版本是1.15.4&#xff0c;官方文档地址&#xff1…

Shellcode免杀对抗(C/C++)

Shellcode C/C免杀&#xff0c;绕过360安全卫士、火绒安全、Defender C/C基于cs/msf的上线 首先是测试一下shellcode上线&#xff0c;主要是俩种方法 测试环境 攻击机&#xff1a;kali2023 靶机&#xff1a;win10 msf方法 首先是启动msf msfconsole 然后msf生成一个sh…

每日一题——LeetCode1460.通过翻转子数组使两个数组相等

方法一 哈希Map 用两个Map集合分别统计target和arr里出现的元素和出现的次数&#xff0c;在比较两个Map集合看是否出现的元素和次数都相同 var canBeEqual function(target, arr) {let map1 new Map();let map2 new Map();for (let item of target) {map1.set(item, (map1…

2.18号c++

1.菱形继承 1.1 概念 菱形继承又称为钻石继承&#xff0c;是由公共基类派生出多个中间子类&#xff0c;又由多个中间子类共同派生出汇聚子类。汇聚子类会得到多份中间子类从公共基类继承下来的数据成员&#xff0c;会造成空间浪费&#xff0c;没有必要。 问题&#xff1a; …

洛夫克拉夫特“克苏鲁神话”艺术风格探索(二)

三、多元的叙事风格 洛夫克拉夫特的克苏鲁神话作为当时独特的文学创造&#xff0c;有独特的叙事特征[8]。 一是侦探小说不稳定的叙事。最有名气的早期侦探小说是爱伦坡的《莫格街凶杀案》&#xff0c;并产生了“疑案”的经典设定&#xff0c;两次世界大战期间的侦探小说批评认…

【超级干货】ArcGIS_空间连接_工具详解

帮助里对空间连接的解释&#xff1a; 根据空间关系将一个要素的属性连接到另一个要素。 目标要素和来自连接要素的被连接属性写入到输出要素类。 如上图所示&#xff0c;关键在于空间关系&#xff0c;只有当两个要素存在空间关系的时候&#xff0c;空间连接才有用武之地。 一…

【.NET Core】深入理解async 和 await 理解

【.NET Core】深入理解async 和 await 理解 文章目录 【.NET Core】深入理解async 和 await 理解一、概述二、async异步执行机制理解三、async与await应用3.1 async与await简单应用3.2 带有返回值async与await应用 四、async和await中常见问题总结4.1 当方法用async标识时&…