文章

QuantLib 金融计算——原理之利率互换的分析

介绍 QuantLib 中如何实现与利率互换相关的计算。

以下文字源自我对源代码的理解,如有不同意见,欢迎留言讨论或发邮件(xuruilong100@163.com

QuantLib 金融计算——原理之利率互换的分析

两类分析

利率互换的分析分为两大类:

  • 正向分析:对存续合约估值、计算敏感性等;
  • 逆向分析:根据最新合约的报价推算利率期限结构。

在 QuantLib 中,正向分析的功能由若干具体的利率互换类提供,例如 VanillaSwapOvernightIndexedSwap,他们都是 Swap 的派生类。通常来说,根据某个期限结构构造一个定价引擎,再将引擎配置到互换对象上就可以进行正向分析了。

逆向分析的本质其实是 Bootstrap,这部分功能则需要借助由特定的“辅助类”实现,这些辅助类通常以 XXXRateHelper 的形式命名,例如 SwapRateHelper(对应 VanillaSwap)和 OISRateHelper(对应 OvernightIndexedSwap)。互换的辅助类通常会持有一个对应类型的互换对象,以此来拥有定价的功能,进而测算出理论报价与市场报价的差距。

互换分析的计算任务

从业务的角度看,利率互换的分析可以被分解为若干计算任务(特别是在正向分析中),而从程序涉及的角度看,这些计算任务可以抽象成为特定的类,这些类以组件的形式相互协作,共同完成分析计算。

逆向分析所涉及的计算任务较少,因为关键计算可以委派给所持有的互换对象。

正向分析所设涉及的计算任务主要有如下两个:

  • 推算出固定端的现金流,通常也是最简单的任务,仅需要一个日期列表和一个期限结构(贴现用)即可。
  • 推算出浮动端的现金流,这项任务稍微复杂一些,需要一个日期列表和一或两个期限结构(用于推算浮动端利率和贴现因子),而确定浮动端利率的过程本身可能较复杂(例如在 OIS 或 FR007 互换中),可以视为一个子任务。

在 QuantLib 中,推算固定端现金流的功能由 FixedRateLeg 类提供。

推算浮动端现金流的功能则因具体的利率互换而不同,例如,对 VanillaSwap 来说要用 IborLeg,对 OvernightIndexedSwap 来说要用 OvernightLeg。这些 XXXLeg 的内部结构大同小异,他们通常会先根据日期列表生成出现金流列表,每一期的现金流由一个 XXXCoupon 对象表示,XXXCoupon 对象会配置一个 XXXCouponPricer 对象,用来最终确定浮动端的利率。

OvernightIndexedSwap 为例,OvernightLeg 会根据日期列表生成一个向量表示浮动端现金流,向量中的每个元素都是一个 OvernightIndexedCoupon 对象,OvernightIndexedCoupon 对象会自动为自己配置一个 OvernightIndexedCouponPricer 对象。OvernightIndexedCouponPricerswapLetRate 方法最终确定浮动端的利率。

不同 XXXCouponPricerswapLetRate 方法略有不同,OvernightIndexedCouponPricer 会计算计息区间内所有隔夜利率的复利利率,而 ArithmeticAveragedOvernightIndexedCouponPricer 则会计算隔夜利率的算数平均。

开放问题:如何实现 FR007 互换的相关分析?

搞懂了 QuantLib 如何处理利率互换之后,实现 FR007 互换的思路也就清晰了,就是要实现若干基本组件,例如 ChinaFixingRepoCouponChinaFixingRepoCouponPricer 等等,具体的代码编写可以参考 OvernightIndexedSwap 相关组件的实现。

本文由作者按照 CC BY 4.0 进行授权