以下文字源自我對源代碼的理解,如有不同意見,歡迎留言討論或發郵件(
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
相關組件的實現。