Py学习  »  Python

【中金固收·可转债】说没用也有点用的转债定价:顺便聊聊转债研究员的Python技巧  20181122

中金固定收益研究 • 5 年前 • 1822 次点击  
作者
  分析员,SAC执业证书编号: S0080515120002

  联系人,SAC执业证书编号: S0080117080049

姬江帆分析员SAC执业证书编号  S0080511030008SFC CE Ref: BDF391


摘要

转债理论定价一直是个略显尴尬的话题。在没有真正进入转债市场时,几乎所有人最先了解到的都是其定价机制(尽管可能并不深入),毕竟这是最容易在学校里讲授的内容。但在真正来到这个市场之后,又很快发现理论上的定价其实并不重要。毕竟价格是交易出来的,不是模型跑出来的。而在转债只数不多的年代,投资者结构和供给形势——这些不可量化的因素,又很大程度上决定着转债的定价方式。这使得不少人在职业初期就绕过了定价模型的学习。

不过,过于轻视也有失偏颇。一方面,掌握定价模型有助于更快理解转债这一产品,而掌握了这一工具,也有助于分析市场。例如对于转债估值水平的衡量来说,最纵向可比的指标,依然是隐含波动率。无论如何改造溢价率、债底溢价率、YTM这些指标,都无法将其纵向可比性抬高到与隐含波动率相同的水平。再如评价这种对正股、债底的敏感性,除了印象流以外,由定价模型衍生出的敏感系数计算也是有价值的工具。再比如转债市场的情景分析时,有Monte-Carlo模拟模型总比没有更好。另一方面,市场也在变化,转债已经基本走出小众市场的范畴,年金、社保、QFII、权益投资者等等群体都已经加入到这一市场。未来理性、可量化的成分将肉眼可见地变多,此时定价模型的戏份也会提高。因此,我们在此对转债常用的定价模型及其实现方法进行介绍,并顺带聊一聊转债研究员可能会用到的Python技巧。当然,这里并非Python入门介绍,我们仅对一些需要解释的技巧进行讲解。

Black-Sholes模型是转债定价模型中最简单也最方便使用的一个。其思路是将转债拆分成债底 + 期权,并对两步分进行分别定价。其中债底用传统的贴现方法就可以得到,期权部分则是只考虑转股权,而且是将转股期权简化为一个欧式看涨期权。

二叉树模型在实战中有些高不成、低不就。显然在理论上讲,二叉树可以解决提前转股的问题。但就A股的转债定价而言,真的需要这样的设定吗?有实战经验的投资者知道,基本上转债的转股都发生在赎回触发之后(也有不带赎回条款的,是到期决定转股与否,博汇接近于这样的处理,还有14宝钢EB)。日常可能出现零星的负溢价,从而诱导投资者小批量转股。而以二叉树模型的设定,外加A股转债有票息、实际无分红(因为分红之后转股价会调整),基本不会出现期权价值小于当场转股的可能(数学上亦可证明)。因此,这一理论上的优势,结合实战经验考虑,也显得有些多此一举。同时,这个模型对于赎回压制、回售保护也无法给出很好的刻画。而该模型的低不就就显得更加明显,相比BS公式其运行速度不在同一量级。总之,这些特性使得二叉树模型在A股转债领域的实际应用价值降低。

模拟法是最精巧也最慢的定价模型。经典的计算过程是:1)模拟股价;2)计算到期日的转债价值; 3)从到期日开始逆推转债在其他日期的价值,此时需要额外的两个工作,一是用最小二乘法预估继续持有转债的价值(从而与直接转股进行对比,做出决策),二是看转债过去N日的路径,若触发赎回、回售条款,则进行相应处理;4)将每一条模拟路径下的转债价值汇总,求均值。但结合实战经验考虑,实际可以更加简单。

Monte-Carlo模拟法应用的场合?由于计算慢,对计算机消耗大,一般太讲究实效性的场合不会用。但其最大的优点在于能够考虑赎回条款对转债估值的压制,以及回售条款的保护性。它让投资者可能更加合理地考虑某些假设情况下转债的走势(跟涨能力、保护性),因此我们常用它来给转债做情景分析。

无论什么模型,自身的局限性自不必说。但仅就其有用的方面来讲,上述内容还远未完成(虽然篇幅已经不小)。不仅包括隐含波动率的计算、其他敏感系数的计算、情景分析的应用这些明面上的内容。实际算法还有很大的优化空间,但为表述清晰我们也不在此深入讨论。此外,我们在实际分析市场的过程中,还会考虑转债稀释以及转股给市场带来的冲击,不同品种下修倾向的假设,限于可以留在未来讨论。


Black-Scholes模型

Black-Sholes模型是转债定价模型中最简单也最方便使用的一个。其思路是将转债拆分成债底 + 期权,并对两步分进行分别定价。其中债底用传统的贴现方法就可以得到,期权部分则是只考虑转股权,而且是将转股期权简化为一个欧式看涨期权。

其优点自然是方便、快速,而且正是由于简单,其运行的稳定性也最高。因此其被常用在:

1、各类Monitor中,尤其是实时监控的Monitor,基本只有BS模型能够正常运行。

2、计算转债各敏感系数,最常用的如Delta,代表着在对正股的敏感性。但实际Delta和其他的希腊字母都有一个缺陷,就是其仅对计算的那一瞬时有效(而当股价变了,Delta也不再准确),虽然还可以用Gamma等进行补救,但缺陷依然存在。

3、投行或审计的项目中,由于历史久、名气大、实现容易,BS模型也最常被用在这些场合。

缺点自然就是太简单了,没有考虑赎回权、下修和回售的博弈,但在乎这些的人自然也不会选BS公式。

BS模型的实现:

首先是一些准备工作。要引用一些必要的包库,不多解释:


作为输入变量,我们的转债条款用一个Dict(字典)变量来表示,如下:


计算债底:这里至少先需要一个现金流处理函数和一个贴现函数。前者是把转债的票息条款翻译成现金流(这里用两个list变量,没有继续用字典),后者把这些现金流贴现得到债底值。先来做第一个函数:


为什么函数命名时,前面加了一个“_”?实际Python在公用函数和私有函数之间太明显的区分,一般前面加一个“_”代表这是一个私有函数。显然,这个函数未来只是BS模型的一环,我们也不准备给予其外部接口。

贴现现金流的函数,比较简单(为什么没用金融计算库?这个库对转债来说,其实不太友好)。其中,enumerate函数是python中非常实用的迭代器,在不得不开始“for”的时候,enumerate往往比“for i in range(xxx)”更实用,也更清晰


在上面准备好之后,计算债底的函数非常简单:


下面来准备期权部分。实际上,虽然数学上的重头戏在这一部分,但由于不用条款预处理等,实际上算期权比算债底简单得多。首先来准备BS公式(这个其实有现成的库,但由于太简单了,没必要引入那个库来拖时间):


一切准备就绪,下面用一个函数将上面的内容拼接起来,组成转债定价的函数。


内容非常容易理解,不多说。可以看到,最终可以直接算转债定价的函数非常简单,去掉嗦的注解实际只有8行。但前提是其中套了几个辅助函数,同时用了numpydatetime两个常用库。这也是Python中比较鼓励的形式,尽量简化每一个函数,并尽量使用现成的库。

几处细节:

1r是用无风险收益率还是用同等级\期限信用债收益率?教课书上是前者,实际要用后者。因为在期权定价推导的过程中,是假定买入期权 + 做空正股的对冲完成之后,这个组合没有风险,因此也应该有着无风险的收益率。但对于A股转债来说,这样的组合还是要承担债券发行人的信用风险的。一旦违约,连债底带转股期权都将不复存在。因此我们一般都用后者。

2、但同等条件下,r越高,期权价值越高,会不会导致信用偏弱的品种反而更有价值?不会,r对期权的影响远不如对债底的影响。

3 、为什么x(期权执行价)要等于转股价 * 到期赎回价 / 100 ?因为对于到期赎回价107元的转债来说,到期时如果平价没超过107元,投资者也不会转股。因此对于欧式期权来说,实际上转股价 * 到期赎回价 / 100才是期权执行价。

4、那到期赎回价高反而吃亏咯?当然不会,因为那将反映到债底上。



二叉树模型

二叉树是一种数值解法,需要先生成风险中性空间下的股价树,然后逐层倒推完成定价。而转债由于票息和本金的存在,也让这个稍稍复杂一些。模型推导不在此重复,优缺点也不再老生常谈,我们直接进入实现步骤。

BS公式不同,这里我们不妨先看看最终的函数:


可以看到基本和BS公式在结构上没有太大区别,但不再计算债底,而是先翻译转债的票息现金流。这些现金流的价值将在binomialTree这一步中一并计算。而这里的_cashFlowDictBS公式时写的_cashFlowCalc有点区别,后者的时间都是以年为单位的,这里转换成以天为单位的,方便其在Tree中计算(因为树中的每一层代表一天)。同时,为了引用方便,_cashFlowDict将返回一个字典变量,而非两个list。此外,为了方便在其他函数里调用,避免套if,我们还做了一个十分简单的cashFlowGenerator函数,该函数在有票息支付的日子里返回票息(或者本金),否则返回0.


下面看binomialTree函数:


步骤非常容易理解,这里又需要用到两个内部函数,分别是_underlyingTree_calcOptionTree。前者是生成股价数,后者是在树上计算转债定价。

  

二叉树模型在实战中有些高不成、低不就。显然在理论上讲,二叉树可以解决提前转股的问题。但就A股的转债定价而言,真的需要这样的设定吗?有实战经验的投资者知道,基本上转债的转股都发生在赎回触发之后(也有不带赎回条款的,是到期决定转股与否,博汇接近于这样的处理,还有14宝钢EB)。日常可能出现零星的负溢价,从而诱导投资者小批量转股。而以二叉树模型的设定,外加A股转债有票息、实际无分红(因为分红之后转股价会调整),基本不会出现期权价值小于当场转股的可能(数学上亦可证明)。因此,这一理论上的优势,结合实战经验考虑,也显得有些多此一举。同时,这个模型对于赎回压制、回售保护也无法给出很好的刻画。而该模型的低不就就显得更加明显,相比BS公式其运行速度不在同一量级。总之,这些特性使得二叉树模型在A股转债领域的实际应用价值降低。

但改一改能不能更有用?能。如果结合经验考虑,转债在转股期内,平价如果达到150(震荡市或者熊市可能140)基本都会触发赎回条款,回售期内平价低于50也会触及回售条款。因此,如果把路径依赖的赎回、回售条款简化成平价突破150或跌破50触发的,二叉树也将具备一定处理附加条款的能力,成为穷人版的Monte-Carlo模拟模型。但由于缺乏严谨性,我们不在此展示实现方法(实际改一改_calcOptionTree的最后几行就可以)。



Monte-Carlo算法

模拟法是最精巧也最慢的定价模型。经典的计算过程是:1)模拟股价;2)计算到期日的转债价值;3)从到期日开始逆推转债在其他日期的价值,此时需要额外的两个工作,一是用最小二乘法预估继续持有转债的价值(从而与直接转股进行对比,做出决策),二是看转债过去N日的路径,若触发赎回、回售条款,则进行相应处理;4)将每一条模拟路径下的转债价值汇总,求均值。

但结合实战经验考虑,实际可以更加简单。这个模型最耗时耗力的步骤也在第三步,尤其是用最小二乘法预估继续持有转债的价值这里。但和二叉树模型一样,投资者知道,一般不触发赎回条款,投资者不会也没有必要转股。因此我们完全可以跳过这一步骤,只需要考虑该路径是否会提前触发赎回条款、回售条款,从而做相应的处理即可。

实现方法上,我们仍先展示最终的函数,再拆解中间的过程:


整个过程看起来和二叉树很像。其中,模拟股价这里,利用numpycumprod(累积相乘)效果会比用循环来逐日生成效果要好得多,没理由不用。这个模拟函数如下:


模拟好股价之后,开始逐条路径分析。实际上就是分析其会不会提前触发附加条款(这里只处理回售和赎回条款,对下修的处理需要进一步做假设,可以以后再讨论)。于是需要两个内部函数 _processRecall_processResell来分别判断赎回和回售条款各自的触发情况。所返回的isBeRecall, thisRowEndTime, thisRowValue三个变量,分别是是否触发(一个01的变量)、触发时间和触发后转债在该时间获得的现金流(对于赎回来说是假设立即转股,这个现金流就是平价,对于回售来说就是回售价)。这两个函数如下:


但为避免内部函数过长,提高维护和阅读难度,我们又做了三个小的辅助函数,分别是_sliceInMC_isResell以及_isRecall。其中_sliceInMC是将路径切片,拿出来分析条款的触发情况,只有一行(其实也没有必要写),但避免了丑陋的切片操作暴露在上级函数中。_isRecall_isResell是根据条款分析赎回、回售是否触发,是则返回1,否则返回0


最后,对于每条路径的现金流,除了条款触发(或者到期)之外,票息也需要考虑。但由于提前触发附加条款的可能性存在,票息、本金是否支付也将有变化。这里,我们还需要一个内部辅助函数,来计算每一条路径下现金流的现值,如下所示。至此Monte-Carlo模拟法已经完成。


Monte-Carlo模拟法应用的场合?由于计算慢,对计算机消耗大,一般太讲究实效性的场合不会用。但其最大的优点在于能够考虑赎回条款对转债估值的压制,以及回售条款的保护性。它让投资者可能更加合理地考虑某些假设情况下转债的走势(跟涨能力、保护性),因此我们常用它来给转债做情景分析。

写在最后:无论什么模型,自身的局限性自不必说。但仅就其有用的方面来讲,上述内容还远未完成(虽然篇幅已经不小)。不仅包括隐含波动率的计算、其他敏感系数的计算、情景分析的应用这些明面上的内容。实际算法还有很大的优化空间,但为表述清晰我们也不在此深入讨论。此外,我们在实际分析市场的过程中,还会考虑转债稀释以及转股给市场带来的冲击,不同品种下修倾向的假设,限于可以留在未来讨论。



报告原文请见201811 22日中金固定收益研究发表的研究报告《中金公司*杨冰,姬江帆:专题研究*说没用也有点用的转债定价:顺便聊聊转债研究员的Python技巧


相关法律声明请参照:

http://www.cicc.com/portal/wechatdisclaimer_cn.xhtml





今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/YDMinyZFqK
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26691
 
1822 次点击