1. 引言
数理金融,又称金融数学,数学金融学和分析金融学,是金融数学专业本科生的一门专业核心课程。该课程是利用数学工具研究金融,进行数学建模、理论分析、数值计算等定量分析,以求找到金融动内在规律并用以指导实践。主要介绍资产定价的无套利定价和均衡定价原理,以及以此为依据的固定收益证券定价、风险资产定价和衍生产品定价模型。而债券是一种典型的固定收益证券,债券的定价、久期与凸度的计算一直是该课程的重点,本文旨在介绍利用MATLAB编程计算债券的久期和凸度。
2. 久期和凸度的概念及计算公式
2.1. 久期的定义及计算公式 [1]
麦考利久期实际上是债券现金流的加权平均期限,其中权重是各期现金流的现值在债券价格中的比重。久期的计算公式如下:
(1)
其中,D是麦考利久期;P是债券的价格;
是债券第t期现金流的现值,T是债券的到期时间。
2.2. 凸度的概念及计算公式 [2]
由于债券价格收益率曲线是凸形的,利益久期估计债券价格波动时,实际上是利用切线作为价格的近似,误差较大。为了更加准确的估计债券价格波动,引入凸度的概念。凸度越大,表示债券价格收益率曲线越弯曲,意味着用久期度量债券的价格波动产生的误差越大。同时利用久期和凸度估计债券价格波动会更加准确。凸度的计算公式如下:
(2)
2.3. 凸度的性质 [3]
1) 给定收益率和期限,票面利率越大,凸度就越小。
2) 给定收益率和久期,票面利率越小,凸度就越小。
3) 含有隐含期权的债券的凸度通常为负,即利率下降,价格会以减速度上升。
3. Matlab程序和例题
3.1. 久期的计算
3.1.1. 已知债券价格编程计算久期
Matlab2016的Financial Toolbox 提供了函数bnddurp,用于已知债券的期限与价格计算久期 [4] [5]。
调用格式参考如下:
[ModD, YearD] = bnddurp(x, y, z, m, n, k)
主要输入参数:
· x:债券净价;y:票面利率;z:结算日;m:到期日
· n:年付息次数,默认的值为2,其它可选值为0、1、2、3、4、6、12
· k:(可选项)债券的天数计算方法,默认的值为0 (实际值/实际值),常见的选项如下:
0:实际值/实际值;1) 30/360;2) 实际值/360;3) 实际值/365
主要输出参数:
· ModD:修正的麦考利久期
· YearD:麦考利久期
[例1]设三种债券的净价分别为105.67元、98.82元和95.45元,面值为100元,每年付息均为5元,交割日期为2017年1月1日,到期日为2020年6月30日,每年付息两次,计息的方式是实际值/实际值,求三种证券的久期和修正久期。
解:计算程序如下:
x=[105.67;98.82;95.45];
y=0.05;
z='01-Jan-2017';
m='30-Jun-2020';
n=2;
k=0;
[ModD, YearD] = bnddurp( x, y, z, m, n, k)
运行结果如下:
ModD =
3.2068
3.1645
3.1426
YearD =
3.2593
3.2495
3.2443
3.1.2. 已知收益率编程计算久期
Matlab2016的 Financial Toolbox提供了bnddury函数,用于给定债券的期限和收益率,计算久期 [6] [7]。
调用的参考格式如下:
[ModD,YearD] = bnddury(x, y, z, m, n, k)
主要输入参数:
· x:债券的到期收益率;y:票面利率;z:结算日;m:到期日
· n:年付息次数,默认的值为2,其它可选值为0、1、2、3、4、6、12
· k:(可选项)债券的天数计算方法,默认的值为0 (实际值/实际值),常见的选项具体如下:
0:实际值/实际值;1) 30/360;2) 实际值/360;3) 实际值/365
主要的输出参数:
· ModD:修正久期
· YearD:久期
[例2]设三种债券的到期收益率分别为3.2710%、5.3746%和6.4747%,面值为100元,每年付息均为5元,交割日期为2017年1月1日,到期日为 2020年6月30日,每年付息两次,计息的方式是实际值/实际值,分别求三种债券的久期和修正久期。
解:运行的程序如下:
x=[0.032710;0.053746;0.064747];
y=0.05;
z='01-Jan-2017';
m='30-Jun-2020';
n=2;
k=0;
[ModD, YearD] = bnddury( x, y, z, m, n, k)
运行的结果如下:
ModD =
3.2068
3.1645
3.1426
YearD =
3.2593
3.2495
3.2443
3.2. 债券凸度的计算
3.2.1. 已知价格编程计算凸度
Matlab2016的Financial Toolbox提供了bndconvp函数,用于已知债券期限与价格,凸度的计算 [8] [9]。
调用的参考格式为:
YearC=bndconvp(x, y, z, m, n, k)
主要的输入参数:
· x:债券净价(不包括利息);y:票面利率;z:结算日;m:到期日
· n:年付息次数,默认的值为2,其它可选值为0、1、2、3、4、6、12
· k:(可选项)债券的天数计算方法,默认的值为0 (实际值/实际值),常见的选项如下:
0:实际值/实际值;1) 30/360;2) 实际值/360;3) 实际值/365
主要输出参数:
YearC:债券凸度
[例3] 设三种债券的净价分别为105.67元、98.82元和95.45元,面值为100元,每年付息均为5元,交割日期为2017年1月1日,到期日为2023年6月30日,每年付息两次,计息的方式为实际值/实际值,分别求三种债券的凸度。
解:运行的程序如下:
x=[105.67;98.82;95.45];
y=0.05;
z='01-Jan-2017';
m='30-Jun-2023';
n=2;
k=0;
YearC= bndconvp(x, y, z, m, n, k)
运行的结果如下:
YearC =
36.2102
35.4973
35.1272
3.2.2. 根据收益率计算凸度
Matlab2016的 Financial Toolbox 提供了bndconvy函数,用于已知债券的期限和收益率,计算债券的凸度 [10] [11]。
调用的参考格式:
YearC=bndconvy(x, y, z, m, n, k)
主要的输入参数:
· x:债券的到期收益率;y:票面利率;z:结算日;m:到期日
· n:年付息次数,默认的值为2,其它可选值为0、1、2、3、4、6、12
· k:债券的天数计算方法,默认的值为0 (实际值/实际值),常见的选项如下:
0:实际值/实际值1) 30/360;2) 实际值/360;3) 实际值/365
主要的输出参数:
YearC:债券凸度
[例4]设三种债券的到期收益率分别为3.2710%、5.3746%和6.4747%,面值为100元,每年付息均为5元,交割日期为 2017年1月1日,到期日为2023年6月30日,每年付息两次,计息的方式为实际值/实际值,分别求三种证券的凸度。
解:运行程序如下:
x=[0.032710;0.053746;0.064747];
y=0.05;
z='01-Jan-2017';
m='30-Jun-2023';
n=2;
k=0;
YearC= bndconvy(x, y, z, m, n, k)
运行结果如下:
YearC =
44.0113
43.1144
42.6562
4. 结语
数理金融这门课内容多而难,计算公式多而复杂,大多数计算用笔无法完成,因此需要学生具备较好的编程能力,熟练掌握一种计算软件。这就需要任课教师讲解理论的同时,教会学生使用软件编程解决计算问题,才能切实有效提高学生的实践动手能力,增强毕业生的就业竞争力。
基金项目
国家级大学生创新创业训练计划项目(202010407038);国家自然科学基金项目(11801238);江西理工大学本科教学工程项目(XZG-16-01-05)。
NOTES
*通讯作者。