以下文字源自我对源代码的理解,如有不同意见,欢迎留言讨论或发邮件(
xuruilong100@163.com
)
QuantLib 金融计算——原理之利率互换的分析
两类分析
利率互换的分析分为两大类:
- 正向分析:对存续合约估值、计算敏感性等;
- 逆向分析:根据最新合约的报价推算利率期限结构。
在 QuantLib 中,正向分析的功能由若干具体的利率互换类提供,例如 VanillaSwap
和 OvernightIndexedSwap
,他们都是 Swap
的派生类。通常来说,根据某个期限结构构造一个定价引擎,再将引擎配置到互换对象上就可以进行正向分析了。
逆向分析的本质其实是 Bootstrap,这部分功能则需要借助由特定的“辅助类”实现,这些辅助类通常以 XXXRateHelper
的形式命名,例如 SwapRateHelper
(对应 VanillaSwap
)和 OISRateHelper
(对应 OvernightIndexedSwap
)。互换的辅助类通常会持有一个对应类型的互换对象,以此来拥有定价的功能,进而测算出理论报价与市场报价的差距。
互换分析的计算任务
从业务的角度看,利率互换的分析可以被分解为若干计算任务(特别是在正向分析中),而从程序涉及的角度看,这些计算任务可以抽象成为特定的类,这些类以组件的形式相互协作,共同完成分析计算。
逆向分析所涉及的计算任务较少,因为关键计算可以委派给所持有的互换对象。
正向分析所设涉及的计算任务主要有如下两个:
- 推算出固定端的现金流,通常也是最简单的任务,仅需要一个日期列表和一个期限结构(贴现用)即可。
- 推算出浮动端的现金流,这项任务稍微复杂一些,需要一个日期列表和一或两个期限结构(用于推算浮动端利率和贴现因子),而确定浮动端利率的过程本身可能较复杂(例如在 OIS 或 FR007 互换中),可以视为一个子任务。
在 QuantLib 中,推算固定端现金流的功能由 FixedRateLeg
类提供。
推算浮动端现金流的功能则因具体的利率互换而不同,例如,对 VanillaSwap
来说要用 IborLeg
,对 OvernightIndexedSwap
来说要用 OvernightLeg
。这些 XXXLeg
的内部结构大同小异,他们通常会先根据日期列表生成出现金流列表,每一期的现金流由一个 XXXCoupon
对象表示,XXXCoupon
对象会配置一个 XXXCouponPricer
对象,用来最终确定浮动端的利率。
以 OvernightIndexedSwap
为例,OvernightLeg
会根据日期列表生成一个向量表示浮动端现金流,向量中的每个元素都是一个 OvernightIndexedCoupon
对象,OvernightIndexedCoupon
对象会自动为自己配置一个 OvernightIndexedCouponPricer
对象。OvernightIndexedCouponPricer
的 swapLetRate
方法最终确定浮动端的利率。
不同 XXXCouponPricer
的 swapLetRate
方法略有不同,OvernightIndexedCouponPricer
会计算计息区间内所有隔夜利率的复利利率,而 ArithmeticAveragedOvernightIndexedCouponPricer
则会计算隔夜利率的算数平均。
开放问题:如何实现 FR007 互换的相关分析?
搞懂了 QuantLib 如何处理利率互换之后,实现 FR007 互换的思路也就清晰了,就是要实现若干基本组件,例如 ChinaFixingRepoCoupon
和 ChinaFixingRepoCouponPricer
等等,具体的代码编写可以参考 OvernightIndexedSwap
相关组件的实现。