债券久期
久期(Duration)是由Macaulay在1938年提出,又被称为Macaulay久期,用来评估债券的平均还款期限,计算公式为
D
=
∑
t
=
1
T
t
C
t
(
1
+
y
)
t
/
∑
t
=
1
T
C
t
(
1
+
y
)
t
D=\sum_{t=1}^Tt\frac{C_t}{(1+y)^t}/\sum_{t=1}^T\frac{C_t}{(1+y)^t}
D=t=1∑Tt(1+y)tCt/t=1∑T(1+y)tCt
方程符号表如下
符号 | 含义 |
---|---|
C t C_t Ct | 各期现金流,当 t < T t<T t<T时, C t = C C_t=C Ct=C;当 t = T t=T t=T时, C t = C + M C_t=C+M Ct=C+M |
t t t | 现金流支付的时间 |
y t y_t yt | 贴现率 |
T T T | 债券的有效期,在债券发行之前,有效期等于债券期限;债券发行之后,有效期小于期限 |
案例
面值为 100 100 100元,期限为 5 5 5年,年利率为 10 % 10\% 10%,贴现率为 9 % 9\% 9%,每半年付息一次的债券,求该债券的久期
解析
根据债券久期公式
{
M
=
100
C
=
100
∗
10
%
/
2
=
5
r
=
0.09
T
=
10
D
=
∑
t
=
1
T
t
C
t
(
1
+
y
)
t
/
∑
t
=
1
T
C
t
(
1
+
y
)
t
\left\{ \begin{aligned} &M=100 \\ &C=100*10\%/2=5\\ &r=0.09\\ &T=10 \end{aligned} \right.\\ D=\sum_{t=1}^Tt\frac{C_t}{(1+y)^t}/\sum_{t=1}^T\frac{C_t}{(1+y)^t}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧M=100C=100∗10%/2=5r=0.09T=10D=t=1∑Tt(1+y)tCt/t=1∑T(1+y)tCt
代码
#include<iostream>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
double bond_duration(const vector<double> &cf, const double &y){
double up=0.00;
double down=0.00;
for(int i=0; i<cf.size(); ++i){
up+=(i+1)*cf[i]/pow(1+y, i+1);
down+=cf[i]/pow(1+y, i+1);
}
return up/down;
}
int main(){
double M=100;
double r=0.10;
double y=0.09;
int years=5;
int tm=2;
vector<double> cf;
for(int i=0; i<tm*years; ++i){
if(i<tm*years-1) cf.push_back(M*r/tm);
else cf.push_back(M*r/tm+M);
}
cout<<"duration ="<<bond_duration(cf, y)<<endl;
return 0;
}
修正久期
久期(
D
D
D),到期收益率(
y
y
y)和债券价格(
P
P
P)之间的关系为
Δ
P
P
=
−
D
1
+
y
Δ
y
\frac{\Delta P}{P}=-\frac{D}{1+y}\Delta y
PΔP=−1+yDΔy
定义
D
∗
=
D
1
+
y
D^*=\frac{D}{1+y}
D∗=1+yD为修正久期,则有
Δ
P
P
=
−
D
∗
Δ
y
\frac{\Delta P}{P}=-D^*\Delta y
PΔP=−D∗Δy
可以通过修正久期和YTM的变化快速求出债券价格的变化率.
债券凸性
只用
Δ
P
P
\frac{\Delta P}{P}
PΔP的一阶展开并不可以完全描述债券价格变化率,因此需要进行二阶展开. 定义债券的凸性
C
C
C为债券价格
P
P
P对收益率
y
y
y的二阶导数与价格
P
P
P的比值.
【连续型债券凸性】
C
=
1
P
⋅
∂
2
P
∂
y
2
C=\frac{1}{P}\cdot\frac{\partial^2P}{\partial y^2}
C=P1⋅∂y2∂2P
【离散型债券凸性】
C
=
1
P
(
1
+
y
)
2
∑
t
=
1
T
t
(
t
+
1
)
C
t
(
1
+
y
)
t
C=\frac{1}{P(1+y)^2}\sum_{t=1}^Tt(t+1)\frac{C_t}{(1+y)^t}
C=P(1+y)21t=1∑Tt(t+1)(1+y)tCt
案例
债券面值是 100 100 100,期限为 3 3 3年,每年付息 1 1 1次,年利率为 10 % 10\% 10%,到期收益率为 9 % 9\% 9%,计算债券的凸性.
解析
根据离散型债券凸性公式
{
M
=
100
T
=
3
r
=
10
%
y
=
9
%
P
=
∑
t
=
1
T
C
t
(
1
+
y
)
t
C
=
1
P
(
1
+
y
)
2
∑
t
=
1
T
t
(
t
+
1
)
C
t
(
1
+
y
)
t
\left\{ \begin{aligned} &M=100\\ &T=3\\ &r=10\%\\ &y=9\% \\ &P=\sum_{t=1}^T\frac{C_t}{(1+y)^t}\\ &C=\frac{1}{P(1+y)^2}\sum_{t=1}^Tt(t+1)\frac{C_t}{(1+y)^t} \end{aligned} \right.
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧M=100T=3r=10%y=9%P=t=1∑T(1+y)tCtC=P(1+y)21t=1∑Tt(t+1)(1+y)tCt
代码
#include<iostream>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
double bond_convexity(const vector<double> &cf, const double &y){
double P=0.00; // 债券价格
for(int i=0; i<cf.size(); ++i){
P+=cf[i]/pow(1+y, i+1);
}
double C=0.00; // 债券凸性
for(int i=0; i<cf.size(); ++i){
C+=(i+1)*(i+2)*cf[i]/pow(1+y, i+1);
}
return C/(P*pow(1+y, 2));
}
int main(){
double M=100;
double r=0.10;
double y=0.09;
int years=3;
int tm=1;
vector<double> cf;
for(int i=0; i<tm*years; ++i){
if(i<tm*years-1) cf.push_back(M*r/tm);
else cf.push_back(M*r/tm+M);
}
cout<<"convexity ="<<bond_convexity(cf, y)<<endl;
return 0;
}
近似关系
如果一年内支付了 m m m次利息,则凸性的年度值为
凸性的年度值=每年 m m m期内的凸性/ m 2 m^2 m2
债券价格变化与收益率变化之间的关系可以近似表示为
d
P
P
=
D
∗
d
y
+
1
2
C
(
d
y
)
2
\frac{dP}{P}=D^*dy+\frac{1}{2}C(dy)^2
PdP=D∗dy+21C(dy)2
当收益率变化不大时,收益率变化与价格变化之间的关系可以近似表示为
Δ
P
P
=
−
D
∗
Δ
y
+
1
2
C
(
Δ
y
)
2
\frac{\Delta P}{P}=-D^*\Delta y+\frac{1}{2}C(\Delta y)^2
PΔP=−D∗Δy+21C(Δy)2