MATLAB筆記:利率期限結構

利率期限結構時關於市場上資金需求價格和期限之間的關係,是為不含權利率型產品進行定價的基礎,依據無套利技術,利用當前的利率期限結構 為新的產品進行定價。這種技術的前提是具備一個足夠完善的市場,能夠給出準確的利率期限結構。這點中國市場是不具備的。國內常採用的是SHIBOR,但是並未得到市場的廣泛接受。在書中主要介紹了BDT、HW和BK模型。

在投資過程中經常面臨的一項風險是再投資風險,存在再投資風險的原因是由於付息債券在到期前的現金流需要再投資,而再投資的收益率和市場當時的利率水平有關,依此,用到期收益率並不能很好地描述這種再投資風險,因此引入了零息債券的概念。零息債券是指發行後在到期時一次性還本付息的債券,這種債券不面臨再投資風險。

在有了不同時期的零息債券收益率之後,將這些不同期限的零息債券收益率用曲線連接起來,便構成利率期限結構曲線。

示例:2003年8月15日觀察到的美國國債交易市場數據如表所示,根據息票率、市場交易價格和債券到期日畫出市場利率曲線圖。

第一步,將價格數據換算成到期收益率數據。

settle=8-15-2003;yield=bndyield(price,couponrate,settle,maturity);

結果如下:

第二步,將收益率轉化成零息票利率集。

clear;clc;couponrate=[0.03 0.02125 0.015 0.065 0.05625 0.02375 0.0625 0.0325 0.03 0.0325 0.055 0.06 0.065 0.0575 0.05 0.05 0.04875 0.04375 0.03875 0.0425];%對應債券的息票率price=[101.0544 100.9254 99.8942 109.0934 108.438 99.7848 111.7184 101.0841 99.1692 99.271 109.7707 112.145 114.9084 110.3894 105.2934 104.7607 103.4391 99.2806 95.0288 97.7693];%對應債券的價格yield=[0.008819 0.011913 0.015716 0.018478 0.021407 0.024498 0.027175 0.029606 0.031997 0.034098 0.035299 0.037227 0.038827 0.040317 0.041708 0.042906 0.043859 0.044730 0.045246 0.045299];%收益率time=0.5:0.5:10;%構建現金流時間點,相對時間間隔0.5年time(1,2)=0.5 %由於計息方式不同,後續循環要用到zbt(1,1)=yield(1,1);zbt(1,2)=yield(1,2)*2;for i=3:20 intfactor=1+0.5*zbt(1,1:(i-1)); %計算相應周期折現率 cashflowdate=-2*time(1,1:(i-1)); %對應計息周期數目,半年計息disfact=sum(intfactor.^cashflowdate); %折現因子的和sim=1/(2*time(i));zbt(i)=2*((100+100*couponrate(i)*0.5)/(price(i)-100*couponrate(i)*0.5*disfact))^sim-2;endzbt(1,2)=zbt(1,2)/2; %調整回zbt(1,2)真實值,計息方式不同導致time(1,2)=1;plot(time,zbt,r)

運行程序,得到如圖所示的利率期限結構曲線。

利率期限結構計算函數

MATLAB提供了兩個函數zbtyield和zbtprice,可以根據市場數據直接計算利率期限結構。

[ZeroRates,CurveDates]=zbtprice(Bonds,Prices,Settle,Outputcompounding), Bonds是一個矩陣,N*6或N*2。Prices為債券價格向量, Settle為結算日期,OutputCompounding為可選的利率計息頻次,不同於Period,默認為2。輸入變數為ZeroRates零息票利率集和CurveDates對應日期。舉例:

couponrate=[0.03 0.02125 0.015 0.065 0.05625 0.02375 0.0625 0.0325 0.03 0.0325 0.055 0.06 0.065 0.0575 0.05 0.05 0.04875 0.04375 0.03875 0.0425];price=[101.0544 100.9254 99.8942 109.0934 108.438 99.7848 111.7184 101.0841 99.1692 99.271 109.7707 112.145 114.9084 110.3894 105.2934 104.7607 103.4391 99.2806 95.0288 97.7693];maturity=cfdates(8-15-2003,8-15-2013);bonds=[maturity,couponrate][zerorates dates]=zbtprice(bonds,price,8-15-2003);plot(dates,zerorates,r);dateaxis(x)

遠期利率計算

遠期利率是指,在當前約定未來某個時間段內,按照約定利率拆入或者拆除一定量資金,一般交易所產品經過標準化後,變數只有未來某段時期的遠期利率FRA。FRA的確定並不是對未來利率的預測,而是根據當前利率期限結構進行套利活動導致的套利均衡,其定價應滿足無套利均衡關係,即:

e^{r_{t1}*T_{1} }* e^{r_{FRA}*(T_{2}-T_{1} )}=e^{r_{t2}*T_{2}} 化簡後得:

在MATLAB中使用zero2fwd計算。

[ForwardRates,CurveDates]=zero2fwd(ZeroRates,CurveDats,Settle,Compounding, Basis)。舉例:

美國國債市場2008-4-24日的利率期限結構數據,以及一天前,一周前和一個月以前的歷史交易數據,如表所示。請計算不同的FRA,給出套利策略。

第一步需要對利率的一個整體走勢和行狀做出判斷,從而將數據圖表化。

bonds=[0.25 1.19 1.17 1.19 1.2; 0.5 1.62 1.57 1.53 1.5; 2 2.38 2.19 2.1 1.77; 3 2.29 2.13 2.04 1.64; 5 3.09 2.95 2.89 2.6; 10 3.82 3.73 3.73 3.5; 30 4.54 4.49 4.52 4.3];plot(bonds(:,1),bonds(:,2),k+--); hold on;plot(bonds(:,1),bonds(:,3),k*--); hold on;plot(bonds(:,1),bonds(:,4),kx--);hold on;plot(bonds(:,1),bonds(:,5),ko--);hold on;legend(當前利率期限結構,昨天利率期限結構,上周利率期限結構,上月利率期限結構);

第二步,利用上述數據,作出4個不同日期的FRA結構圖

curvedates=datenum([07-23-2008;10-24-2008;04-23-2010;04-23-2011;04-23-2013;04-23-2018;04-23-2028]);%注意日期輸入前方的0不能省略,如07-23-2008不可寫成7-23-2008fwdone=zero2fwd(bonds(:,2),curvedates,04-23-2008);fwdtwo=zero2fwd(bonds(:,3),curvedates,04-23-2008);fwdthree=zero2fwd(bonds(:,4),curvedates,04-23-2008);fwdfour=zero2fwd(bonds(:,5),curvedates,04-23-2008);%分別求出來對應的FRA值plot(curvedates,fwdone,k+--); hold on;plot(curvedates,fwdtwo,k*--); hold on;plot(curvedates,fwdthree,kx--); hold on;plot(curvedates,fwdfour,ko--); hold on;legend(當前FRA期限結構,昨天FRA期限結構,上周FRA期限結構,上月FRA期限結構);

第三步,得出套利策略。

根據FRA期限結構圖,應當完成兩步套利:買入FRA2-3年期,賣出FRA3-5年期。圖中可以看到最近一個月來,在2y-3y的時點處,曲線有一二大的向下凸出,但是凸出在逐漸回歸,這意味著套利的作用使得市場回歸均衡。利率期限結構曲線之所以會有凸出,原因在於美國次貸危機導致的流動性和信用風險。利率曲線的上移意味著市場認為當前利率水平過低,將來很可能面臨一系列的加息。

利率期限結構的表示

在MATLAB中使用一個struct型數據對利率期限結構進行描述,在MATLAB中使用函數intenvset來創建描述利率期限結構的struct型數據。

[RateSpec,RateSpecOld]=intenvset(RateSpec,Argumant1,Value1,Argument2,Value2,...) Argument是利率期限結構struct型數據RateSpec的域名,Value是對應域的取值,不做贅述。舉例:

已知利率期限結構如下:

0.19 0.62 1.38 1.29 2.09 2.82 3.54

對應的期限分別為2008-6-3、2008-9-3、2010-6-3、2011-6-3、2013-6-3、2018-6-3和2038-6-3.請利用intenvset函數構建相應的利率期限結構。

在MATLAB的M文件編輯器中輸入如下命令:

clear;clc;Compounding=2;Rates=[0.0119 0.0162 0.0238 0.0229 0.0309 0.0382 0.0454];EndDates=[2008-6-3;2008-9-3;2010-6-3;2011-6-3;2013-6-3;2018-6-3;2038-6-3];EndDates=datenum(EndDates);StartDates=[2008-6-2;2008-6-2;2008-6-2;2008-6-2;2008-6-2;2008-6-2;2008-6-2];StartDates=datenum(StartDates);ValuationDate=[2008-6-2];ValuationDate=datenum(ValuationDate);Basis=0;EndMonthRule=1;[RateSpec,RateSpecOld]=intenvset(Compounding,Compounding,Rates,Rates,EndDates,EndDates,StartDates,StartDates,Basis,Basis,ValuationDate,ValuationDate,EndMonthRule,EndMonthRule);

運行M文件再在Command Window中輸入whos,可得到如下結果:

債券定價技術

bondbyzero是利用利率期限結構對債券進行定價的函數。

Price=bondbyzero(RateSpec,CouponRate,Settle,Maturity,Period,Basis,EndMonthRule...)。舉例:

當前時間為2008-6-3,為債券結算日,債券到期日為2015-3-1,息票率為8%,求債券價格。

price=bondbyzero(RateSpec,0.08,2008-6-3,2015-3-1)

輸出Price=128.695。可見根據當前利率期限結構得到的上述債券的價格為128.695。

現金流定價技術

1. 根據利率期限結構為現金流進行定價

在這裡所要定價的現金流是不規則的,需要制定現金里的量和現金流的日期,在對不規則付息債券,或者有提前償債條款(sinking fund)的債券進行定價時常使用此方法。

Price=cfbyzero(RateSpec,CFlowAmounts,CFlowDates,Settle)舉例:

當前日期2008-6-3,現金流為

10 15 6 7

對應現金流發生日期

2008-10-3 2010-1-1 2012-1-6 2014-3-30

在MATLAB的M文件編輯器中輸入:

cfamounts=[10 15 6 7];cfdates=[2008-10-03;2010-01-01;2012-01-06;2014-03-30];cfdates=datenum(cfdates);price=cfbyzero(RateSpec,cfamounts,cfdates,datenum(2008-6-3))

price=35.7341。

2. 按照利率期限結構為固定和浮動息票率票據進行定價

Price=fixedbyzero(RateSpec,CouponRate,Settle,Maturity)

Price=fixedbyzero(RateSpec,CouponRate,Settle,Maturity,Reset,...,Basis,Principal) Reset為年付息次數。

Price=floatbyzero(RateSpec,Spread,Settle,Maturity)

Price=floatbyzero(RateSpec,Spread,Settle,Maturity,Reset,...,Basis,Principal) Spread為基點價差。


推薦閱讀:

【債券日評】20160714市場重歸糾結,等待進一步數據
央行官網首次發布國債收益率曲線意味著什麼?會帶來哪些影響?
國內債券是不是一個好的理財手段?該不該買一些國內的債券?
債券「北向通」漸行漸近,銀行間市場雄心隱現
【債券日評】20170111 當我談債券投資時我談些什麼

TAG:MATLAB | 金融 | 债券 |