【FinE】债券久期和凸性

债券久期

久期(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=1Tt(1+y)tCt/t=1T(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=10010%/2=5r=0.09T=10D=t=1Tt(1+y)tCt/t=1T(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=P1y22P
【离散型债券凸性】
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=1Tt(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=1T(1+y)tCtC=P(1+y)21t=1Tt(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=Ddy+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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值