最近有读者问人民币 FR007 掉期的估值总是和系统上对不上,加上 RFR 代替 IBOR 后有新的 RFR 掉期出现,其估值方法中有很多细节。以上两种产品都可以叫做利率掉期。笔者想趁着写《金融工程》一书的利率掉期这章时,顺便给大家做一个估值利率掉期高度概览,并指出所有应该注意的细节,避免大家在复现结果或者验证模型时少走点坑。
先看定义:
利率掉期(Interest Rate Swap, IRS) 是指交易双方约定在未来的一定期限内,对约定的名义本金按照不同的计息方法交换利息的交易。
IRS 定义很广,除了大家最熟悉的固定端换浮动端(fixed-to-floating)的 IRS,还有
等等
IRS 的估值没有涉及任何复杂的模型,有的只是惯例和细节处理,不过不管是什么类型的 IRS,其现值公式总能表达成如下大繁至简的形式。
IRS 产品有两端,估值方法一样,因此我们把注意力放在一端,其现值就是未来所有现金流的折现并加总。
上面公式中 5 个变量分别代表:
让我们对以上五个变量从简单到复杂娓娓道来。
支付接收
PorR:IRS 支付端或接收端的标识符,支付端为 -1,接受端为 1。
拿一张彭博的 IRS 举例。
从上图红框可知,该 IRS 是接收固定端(PorR = 1),支付浮动端(PorR = -1)。
名义本金
Notionali:第 i 期的名义本金。
名义本金大多情况下是不变的,如下图红框所示,两端名义本金都是 1 千万美元。
之所以用下标 i 来代表第 i 期的名义本金 Notionali,是因为有三种类型的掉期的本金会随期变化的:
本金减少型掉期也称为摊销掉期,常见的摊销规则有 Linear Rate、Linear Amount 和 Constant。
Notionali = Notional × (1- i×rate)
Notionali = Notional - i×amount
Notionali = Notional - (Notional - c) × i/N
本金增加型掉期中常见规则有 Coupon Reinvestment 和 Real Coupon Reinvestment。两者都是将每期某一端的现金流 (cashflow) 按照一个比率 (a) 折算后加入下期本金。摊销可以设定在固定或浮动的某一端,i 期的本金和 i-1 期的本金应有如下关系:
Notionali = Notionali-1 + |a×cashflowi|
两者的区别是计算利息的方法:
Interesti = cashflowi
Interesti = (1 - a) × cashflowi
最后,如果对于跨货币掉期,那么两端的名义本金是按照不同货币来计价的。
总结:不管规则多复杂,最终可以得到每期的名义本金。
期限年限
YearFraci:第 i 期的期限年限
每一期都有起始日和终止日,两者之间的天数差是不变的,但是转成相应的年限有可能不一样,由日期计数惯例(Daycount Convention,DC)决定。
如下图红框所示,固定端的 DC 是 30I/360,而浮动端的 DC 是 ACT/360。
举个具体例子,起始日(date1)为 2019 年 11 月 30 日,终止日(date2)为 2020 年 5 月 31 日,它们的天数差为 183。
date1 = ql.Date(30, 11, 2019)
date2 = ql.Date(31, 5, 2020)
date2 - date1
183
ACT/360
该规则中,年限等于天数差除以 360,
tau = (date2 - date1) / 360
= 183/360 = 0.5083333
用 QuantLib 验证:
ql.Actual360().yearFraction(date1, date2)
0.5083333333333333
ACT/365
该规则中,年限等于天数差除以 365,
tau = (date2 - date1) / 365
= 183/365 = 0.5013699
用 QuantLib 验证:
ql.Actual365Fixed().yearFraction(date1, date2)
0.5013698630136987
ACT/ACT
该规则中,遇上闰年时,要分年计算年化天数。
tau = (2020.1.1 - date1) / 365
+ (date2 - 2020.1.1) / 366
= 32/365 + 151/366 = 0.50023954
用 QuantLib 验证:
ql.ActualActual().yearFraction(date1, date2)
0.5002395388876413
30/360
该规则中,设开始日为 YS.MS.DS(2019.11.30),结束日为 YE.ME.DE(2020.5.31)。先算虚拟的开始日 ds 和结束日 de:
我们有
ds = min(DS, 30) = 30
de = 30
带入年限计算公式得到
tau = (360*1+30*-6+0) / 360
= 180/360 = 0.5
用 QuantLib 验证:
ql.Thirty360().yearFraction(date1, date2)
0.5
其他的日期计数惯例总结于下图。
总结:计算期限年限只需起始日、终止日和 DC 三个参数。不同货币、固定浮动都有不同的 DC,比如 USD 固定端一般是 30/360,USD 浮动端一般是 ACT/360,GBP 固定和浮动端都是 ACT/365 等等。
折现因子
Discounti:第 i 期的折现因子
折现因子是从折现曲线(discount curve)中获取出来的。曲线上的期限称为标准期限(standard tenor),记作 {T1, T2, ..., Tn},而在估值时需要任何时点 t 上的折现因子。
从一组标准期限上的折现因子到任何时点上的折现因子的获取操作称为
插值方式(interpolation method)有很多种,
等等。
折现曲线可以由折现因子(discount factor)、零息利率(zero rate)和远期利率(forward rate)等形式展现。这些都可以作为插值变量(interpolation variable)。
下图的曲线插值方法是 piecewise constant,而插值变量是 continuous forward rate。
总结:在折现曲线上设置好插值方法和插值变量后,就能得到任何时点上的折现因子。
等效利率
Ratei:第 i 期的等效利率
一般可以把固定端看成浮动端的特殊情况,即浮动基准的计算利率为 0,利差为固定利率。
计算利率的获得要看利率重置的设置情况,以下分三种情况进行详细讨论:
1. 重置频率等于计息频率
这种情况最常见,利率重置频率与计息频率一致(如标准的 USD LIBOR,EUR EURIBOR,HKD HIBOR,CNY SHIBOR 利率掉期)。对每一期,计算利率 Rate 方法如下:
IRS, IBS, XBS, IBOR in-arrears 都属于此种情况
2. 重置频率高于计息频率
利率重置频率高于计息频率。假定重置频率如 Week 或 Day,而计息频率为 Month,Quarter,Semiannual 或 Annual(如 OIS, FR007 和 RFR swap)。
这样在每一期中有一组利率序列,按重置计算方法将利率序列 Ri, (i=0,1,⋯,n−1) 整合为一个数,即为计算利率。常见的整合方法有简单平均(simple average)和复利(compounding)两种。
OIS 和 FR007 用后者整合,而 RFR swap 用两者整合。
OIS 和 RFR Swap 的重置频率是 Day,工作日规则为顺延(following),一般 Δτk 对应 1 个工作日(1BD)。以 CNY OIS 举例,即平时为 1 天,周末为 3 天,真遇上国庆长假可能是 7 天,生成日期序列的公式如下:
τk = τk-1 + 1BD
FR007 Swap 的重置频率是 Week,工作日规则为不调整(unadjusted),一般 Δτk 对应 7 个日历日(7D),这样最后一个重置区间可能会小于 7 天。,生成日期序列的公式如下:
τk = StartDate + k×7D
FR007, OIS, RFR Swap 都属于此种情况
3. 重置频率低于计息频率
利率重置频率低计息频率此种情况比较少见。假定重置频率低,如 annual,计息频率高如 Month,Quarter,Semiannual。
簿记这种交易时,可以直接将重置频率与计息频率设值,这样在几个计息区间将取到同一天的相同的利率。利率的计算和情况 1 的单利一样。所以这种情况与情况 1 的不同仅在基准利率的获取上。
最后一图胜千言。