国债期货matlab,Matlab和国债期货的那些事儿~(四)——关键利率法在利率风险管理中的运用...

第二部分 使用国债期货进行利率风险管理的若干问题

从本章开始,我们的问题基本会围绕使用国债期货对冲利率风险或者如何优化久期管理来展开。内容安排如下,第四章介绍关键利率法,涉及关键利率久期的计算以及对冲方法,同时也会给出在Matlab上的实现。第五章和第六章会分别介绍回归分析法、主成分分析法在管理利率风险上的运用。作为第二部分的结束,第七章将讨论国债期货的负凸性,为后面第三部分国债期货的定价做铺垫。

关键利率法在利率风险管理中的运用

本节将介绍关键利率法及其在利率风险管理中的运用。首先我们来复习一下固定收益的一些基本概念。[1]掌握清楚这些概念后,将对理解接下来的章节有非常大的帮助。然后引入关键利率久期和关键利率基点价值的概念以及计算方法。最后谈谈使用关键利率法如何对冲利率风险和在Matlab上的实现。(想直接查看代码的读者可跳至第3部分)

本文内容:

一般我们使用基点价值(DV01)来衡量债券价格关于利率的敏感性。但是所有学过金融学的或者对金融多少有点了解的朋友都知道,利率有很多种,而且利率还有期限结构。当我们假设某只债券的价格可以表示成P(r)的时候,实际上是假设了只有单一的因素会影响到债券价格的变化。然而利率期限结构的存在暗示了,有时候利率的变化不仅仅是指单纯大小的改变,还有利率曲线陡峭化和平坦化等形式的改变。因此在我们使用单一的符号r来表示利率时,一定要记住,我们是在假设单一因素表示的利率期限结构。

回到主题本身,我们定义基点价值如下

a4c26d1e5885305701be709a3d33442f.png

公式 1

如何理解这个公式?我们都知道Δ用来表示变化量,比如ΔP就表示债券价格的变化。那么Δy自然就表示利率的变化量。等等,我们刚刚强调了利率有很多种,同时变化也有很多种。那么业界以及一般的教科书都把y定义为收益率,那么Δy就表示该债券收益率的变动。因此公式

1表示的是债券收益率每一单位的变化所引起的债券价格的变化。由于利率的变化量是用基点来表示的,一个基点表示0.01%。所以更准确的来说,公式

1表示该债券收益率一个基点的变化所引起的债券价格变化,因而也称基点价值。

当然,如果令Δy趋向于0,我们就可以得到基点价值的导数表示

a4c26d1e5885305701be709a3d33442f.png

公式 2

由于大部分市场参与者都使用基于收益率的基点价值,因此在没有强调对象的前提下,基点价值一般就是指基于收益率的基点价值。

除了使用基点价值来衡量债券价格对利率的敏感程度以外,我们还会使用久期(Duration)来衡量利率一个单位变化引起债券价格的变化率,也即

a4c26d1e5885305701be709a3d33442f.png

公式 3

如果用导数来表示就是

a4c26d1e5885305701be709a3d33442f.png

公式 4

使用久期是非常方便的。如果已知债券收益率变动一个百分点的情况下,我们可以很容易地得到债券价格的变化大小

a4c26d1e5885305701be709a3d33442f.png

公式 5

那么对于组合来说,利率变动一个百分点的时候,组合价值的变化就可以表示成

a4c26d1e5885305701be709a3d33442f.png

其中ω表示某债券i在组合中所占的权重。

从上面的公式很容易得到久期和基点价值的关系

a4c26d1e5885305701be709a3d33442f.png

接下来我们将进入本节的主线。前面提到利率由很多种,利率的变化也有很多种模式。一般来说,我们使用基于收益率的基点价值或者久期来衡量债券价格的风险。熟悉收益率概念的朋友都清楚,每个债券的收益率原则上是不能等同的。然而当我们把焦点重新放在公式

6上面时,我们发现竟然把基于单个债券的收益率按照线性方法加总了。实际上公式

6是在假设任意的债券i收益率变动1个百分点,其余所有的债券都同方向变动1个百分点。因此当我们使用公式

6来计算组合对利率的风险暴露时,是在假设整体收益率曲线发生平行的上下移动。[2]而这种情况在现实中发生的概率基本为零。所以公式

6仅仅具有理论上的意义,实际应用中却具有非常大的缺陷——它无法反映利率期限结构变化的风险。

为了更好地度量利率期限结构引起的风险,我们不妨考虑多因子模型。而其中一种方法就是关键利率法。关键利率法是建立在对市场现象的观察基础上,加入一些简单假设条件而得到的一种快速计算利率风险暴露的方法。第一,所有的市场参与者都广泛认同这样的一个事实:利率期限结构上的利率变化虽然不是完全相关,但相邻区域的利率变动还是较一致的。第二,作为利率风险对冲的工具是非常有限的,同时构造大量的利率影响因子有些不切实际。[3]所以不妨假设若干利率(被称作关键利率)的变化可以代表整体期限结构的变化。第三,假设曲线上任一期限的关键利率变动对附近期限的利率变动影响是线性的。

因此关键利率法的精髓简单来说,就是假设可以通过较少的利率变动就可以描述期限结构的所有变化。首先我们跳过选取关键利率的步骤,假设关键利率是1、5、10和30年期即期利率。根据关键利率的假设,每个关键利率变动一个基点所引起的即期利率期限结构改变如图所示

a4c26d1e5885305701be709a3d33442f.png

如图所示,每个关键利率的变动只会影响临近的一个利率,并且对中间期限的影响都是线性的。比如,5年期即期利率向上变动一个基点,只会对1~5和5~10年期之间的即期利率造成影响,并且随着距离越远,影响趋于0。另外,对于1年期关键即期利率以下的期限,影响也是1个基点。30年期以上期限的即期利率,影响同样也是1个基点。通过这样简单的假设,保证了上述四个关键利率对某个利率的影响保持在1个基点以内。这样的安排可以使得一个基点的风险价值可以分配到四个不同的关键利率上。

相信很多人看到这里,都会认为关键利率法极其简单粗暴,对利率期限结构的变动做出非常强的假设。这样的假设可能与实际市场的情况不同,但这样假设后给计算带来的便捷性以及可操作性是其最大的优点。(换个说法来说,这样的做法比简单给不同期限分配久期风险更优。)

在给定关键利率以及利率期限结构变动的假设后,我们可以计算单只债券或者投资组合在不同利率期限结构上的基点价值或者关键利率久期。我们用下标k表示期限k,那么对应即期利率yk的关键利率基点价值为

a4c26d1e5885305701be709a3d33442f.png

公式 8

如果写成导数的形式,那么DV01k就可以写作

a4c26d1e5885305701be709a3d33442f.png

公式 9

相应的,有关键利率久期

a4c26d1e5885305701be709a3d33442f.png

公式 10

下面本文以一只10年期国债[4]演示关键利率久期或者基点价值的计算过程。表格 1是它的条款信息

表格 1

2014年记账式附息(二十一期)国债基本信息

债券全称

2014年记账式附息(二十一期)国债

银行间代码

140021.IB

票面利率

4.13%

付息频率

年付息2次

上市日期

2014-9-24

期限

10年

同时表格 2给出2015年4月30日的国债即期利率曲线和到期收益率曲线(两者可互相推导)

表格 2

中债登2015-4-30国债即期利率和到期收益率曲线

期限

到期收益率

即期利率

0d

1.2797

2.4235

1m

2.4358

2.4235

2m

2.6238

2.6124

3m

2.7044

2.6954

6m

2.7856

2.7856

9m

2.6782

2.6751

1y

2.694

2.6934

2y

2.9479

2.9518

3y

3.1561

3.1659

4y

3.2256

3.2367

5y

3.2533

3.2641

6y

3.3173

3.3322

7y

3.3503

3.3668

8y

3.3503

3.3647

9y

3.3503

3.3631

10y

3.3503

3.3618

15y

3.6393

3.7133

20y

3.9633

4.1574

30y

4.1218

4.3662

40y

4.1928

4.4697

50y

4.2466

4.5870

利用表格 1和表格 2,可以计算“14附息国债21的”关键利率久期。为方便理解,下面使用表格的方式演示。

表格

3 演示如何计算140021.IB关于1年期即期利率的关键利率久期

CashFlow (1)

Date (2)

Time (3)

ZeroRate (4)

DiscountRate (5)

Delta (6)

+0.01% (7)

-0.01% (8)

2.065

2015/9/24

0.4027

2.7483

0.9891

0.0100%

0.9891

0.9891

2.065

2016/3/24

0.8989

2.6855

0.9763

0.0100%

0.9763

0.9763

2.065

2016/9/24

1.4036

2.7967

0.9618

0.0090%

0.9618

0.9618

2.065

2017/3/24

1.8996

2.9249

0.9463

0.0078%

0.9463

0.9463

2.065

2017/9/24

2.4033

3.0374

0.9301

0.0065%

0.9301

0.9301

2.065

2018/3/24

2.8994

3.1436

0.9135

0.0053%

0.9135

0.9135

2.065

2018/9/24

3.4031

3.1942

0.8978

0.0040%

0.8978

0.8978

2.065

2019/3/24

3.8992

3.2293

0.8826

0.0028%

0.8826

0.8826

2.065

2019/9/24

4.4031

3.2476

0.8678

0.0015%

0.8678

0.8678

2.065

2020/3/24

4.8996

3.2613

0.8534

0.0003%

0.8534

0.8534

2.065

2020/9/24

5.4033

3.2913

0.8383

0.0000%

0.8383

0.8383

2.065

2021/3/24

5.8995

3.3251

0.8232

0.0000%

0.8232

0.8232

2.065

2021/9/24

6.4032

3.3460

0.8086

0.0000%

0.8086

0.8086

2.065

2022/3/24

6.8994

3.3632

0.7944

0.0000%

0.7944

0.7944

2.065

2022/9/24

7.4031

3.3660

0.7811

0.0000%

0.7811

0.7811

2.065

2023/3/24

7.8993

3.3649

0.7683

0.0000%

0.7683

0.7683

2.065

2023/9/24

8.4031

3.3641

0.7555

0.0000%

0.7555

0.7555

2.065

2024/3/24

8.8995

3.3633

0.7432

0.0000%

0.7432

0.7432

102.065

2024/9/24

9.4032

3.3626

0.7308

0.0000%

0.7308

0.7308

PV

106.6647

106.6647

106.6647

KeyDur

0.1946

在表格 3中,(1)(2)(3)列利用了表格 1的信息,(4)(5)利用表格

2的信息。(6)列利用了前面对关键利率变动的假设得出的变化量。(7)(8)分别表示1年期关键即期利率上升1个基点和下降1个基点的情形。最后一行的PV和KeyDur分别指现值和数值计算的关键利率久期值。[5]

得到所有关键利率对应的关键久期以后,进行对冲的思路也是极其简单的。方法同前面的国债期货对冲久期的类似,需计算国债CTD券的关键利率久期,然后计算对冲比率。

回顾下本系列第三章的公式

a4c26d1e5885305701be709a3d33442f.png

计算对冲比率的方法是一致的,只不过现在所有的变量都使用矩阵的形式,这里就不详细说了。

现在本文的重心转向Matlab对关键利率法的支持。这里要特别介绍的是bndkrdur这个函数。[6]这个函数可以计算不同插值方法得到的关键利率久期。默认是使用线性('linear'),同时支持三次曲线('cubic')和样条('pchip')。区别只是在于生成关键利率变化时所引起的曲线变化量不同。

下面来具体看看范例。

第一步是设定关键利率和相关参数,给出即期利率曲线

% 设定关键利率

KeyRates = [1,5,10,30];

% 设定期限结构生成方式:‘linear'(default), 'cubic',

'pchip'

InterpMethod = 'linear';

% 设定参考日,结算日定为下一个交易日

RefDate = datenum('2015/04/30','yyyy/mm/dd');

Settle = RefDate +1;

% 给出参考日即期利率曲线

% 更多信息可以登录中债登网站查询

%

数据来源于和讯网,只能查询到收益率曲线,所以要转换成即期利率曲线

ParRates = 1e-2 *

[1.2797,2.4358,2.6238,2.7044,2.7856,2.6782,2.694,2.9479,...

3.1561,3.2256,3.2533,3.3173,3.3503,3.3503,3.3503,3.3503,3.6393,...

3.9633,4.1218,4.1928,4.2466]';

CurveDates =

daysadd(datestr(Settle,'dd-mmm-yyyy'),[0,30,30*2,30*3,30*6,...

30*9,360,360*2,360*3,360*4,360*5,360*6,360*7,360*8,360*9,360*10,...

360*15,360*20,360*30,360*40,360*50],1);

[ZeroRates, ZeroDates] =

pyld2zero(ParRates,CurveDates,Settle);

ZeroData = [ZeroDates ZeroRates];

第二步是利用即期利率曲线计算债券组合的关键利率久期

% 债券组合基本信息

PortfolioCoupons = 1e-2*[3.02,3.46,3.39,4.03,3.96,4.13];

PortfolioMaturity =

datenum({'7-May-2019','11-Jul-2020','23-Aug-2022',...

'24-May-2060','16-Aug-2040','24-Sep-2024'});

PortfolioValue = 100000000;

PortfolioWeight = 1e-2*[10,20,35,20,10,5];

% 计算关键利率久期

% 期限结构的插值方法有,'linear'(default),'cubic','pchip');

PortfolioBondKRD =

bndkrdur(ZeroData,PortfolioCoupons,Settle-1,...

PortfolioMaturity,'KeyRates',KeyRates,'InterpMethod','linear');

PortfolioKeyDuration = PortfolioWeight * PortfolioBondKRD;

% 设定对冲的目标

BenchmarkDuration = [1 1 1 1];

第三步,计算国债期货(同CTD)的关键利率久期

% CTD券信息 — 寻找CTD券的方法可参考前面的章节

% 目前国债期货仅有5年期和10年期的品种,1年期和30年期是杜撰的CTDCoupon = [3.77

3.54 4.11 7.5]'/100;

CTDMaturity =

datenum({'15-Aug-2016','16-Apr-2022','15-May-2025','27-Oct-2044'});

FutureExpDate =

{'12-Jun-2015','12-Jun-2015','11-Sep-2015','11-Sep-2015'};

RutureRefYield = 1e-2*[2.5,3,3,4];

CTDConversion = convfactor(FutureExpDate, CTDMaturity, CTDCoupon,

RutureRefYield, 2);

CTDPrice = [100.9699 101.1181 104.6949 106.7572]';

% 计算CTD券的关键利率久期

CTDKRD = bndkrdur(ZeroData,CTDCoupon,RefDate,...

CTDMaturity,'KeyRates',KeyRates);

CTDKRD = bndkrdur(ZeroData,CTDCoupon,RefDate,...

CTDMaturity,'KeyRates',KeyRates);

最后,计算对冲所需要的合约

% 合约的名义金额ContractSize =

[10000;10000;10000;10000];

NumContracts =

(bsxfun(@times,CTDPrice.*ContractSize./CTDConversion,CTDKRD))\...

(BenchmarkDuration - PortfolioKeyDuration)'*PortfolioValue;

最终结果为

ans =

为达到目标久期, 分别需持有头寸(正表示多头,负表示空头)

67 1 年期国债期货合约,

-37 5 年期国债期货合约,

-22 10 年期国债期货合约,

-33 30 年期国债期货合约。

在本章的最后,我们可以看看bndkrdur的核心代码。

% Compute key rate durations

for rateidx=1:nRates

……

ShiftRates =

interp1(KeyRates,KeyRateShift,CFTimes,InterpMethod,0);

if

rateidx==1

earlyidx = CFTimes < KeyRates(rateidx);

ShiftRates(earlyidx) = ShiftValue;

elseif

rateidx==nRates

lateidx = CFTimes > KeyRates(rateidx);

ShiftRates(lateidx) = ShiftValue;

end

……

for

bondidx=1:nBonds

……

DF_up(bondidx,notnanidx) =

zero2disc(UpRates(bondidx,notnanidx),...

CFlowDates(bondidx,notnanidx),CurveSettle,BondCompounding,Basis(bondidx));

DF_down(bondidx,notnanidx) =

zero2disc(DownRates(bondidx,notnanidx),...

CFlowDates(bondidx,notnanidx),CurveSettle,BondCompounding,Basis(bondidx));

end

……

% Compute duration

KeyRateDuration(:,rateidx) = (PV_down -

PV_up)./(2*ShiftValue*PV);

end

[1]在前面的章节时候,本人为了阐释Matlab的应用而选择重结论而轻逻辑的方式。现在回想起来,这样的建模思路是非常危险的。因此往后的章节中,我将尽全力地去解释这些概念以及他们当中的逻辑。

[2]

同时信用债和利率债的利差保持不变,即所有债券的收益率都同方向变动相同的单位。这样的假设过于极端,试想一下一只1年期国债收益率的变化怎么会完美等同于5年期国债收益率的变化。

[3]

试想一下,使用30个利率来衡量期限结构的变化,结果必然是会很精确。但这样的模型在实际应用中并没有多大用处,同时也是非常复杂的。

[4] 选用国债是因为不希望引入违约风险,那样需要引入对利差期限结构的假设。

[5]

这里计算关键利率久期是极不精确的。我能想到的影响计算结果的主要因素有,派发利息发生在非交易日和保留小数的位数。

[7] 关于关键利率法的理论说明可以参考下Tuckman和Serrat著的《Fixed Income

Securities》,这本书国内有中译版,名字叫固定收益证券。

你可能感兴趣的:(国债期货matlab)