目录
本文主要介绍债券的价格,久期以及凸性的计算公式。
1. 基础公式
1.1 价格
附息债券的估值:
其中:
P0: 在时刻0时的债券价格
CFt : 在t时刻收到的现金(息票利息)
CFn : 在偿还日n时刻收到的现金(息票利息和本金)
Rt : 从0到ti时段的即期利率
N : 现金流的次数
1.2 久期
麦考利久期:
其中:
Dmod: 修正久期
DP: 价格久期
P: 当前支付的债券价格(包括应付利息)
D: 麦考利久期
Y: 债券的到期收益率
n: 现金流的次数
1.3 凸性
凸性:(部分公式中含有二分一这个系数,此处选择用不含二分之一的公式)
其中:
CP: 价格凸性
P : 当前支付的债券价格(包括应付利息)
Y: 债券的到期收益率
CFt: 在t时刻收到的现金(息票利息)
n: 现金流的次数
2. 代码复现
考虑到常用性,代码中假设债券的面值为100,付息频率为一年一次。
import pandas as pd
class BOND_BASIC(object):
# 计算基础指标:价格、久期、凸性
def __init__(self, coupon, T, yields):
self.coupon = coupon # 票息
self.T = T # 期限
self.yields = yields # 收益率
def P(self):
# 计算债券价格,保留两位小数
value_list = []
for x in range(1, self.T + 1):
print('sss', x)
if x == self.T:
value = 100 * (1 + self.coupon) / (1 + self.yields) ** x
else:
value = 100 * self.coupon / (1 + self.yields) ** x
value_list.append(value)
return round(sum(value_list), 2)
def D(self):
# 计算债券久期,保留两位小数
value_list = []
p = BOND_BASIC.P(self)
for x in range(1, self.T + 1):
if x == self.T:
value = x * 100 * (1 + self.coupon) / (1 + self.yields) ** x
else:
value = x * 100 * self.coupon / (1 + self.yields) ** x
value_list.append(value)
return round(sum(value_list) / p, 2)
def C(self):
# 计算债券凸性,保留两位小数
value_list = []
p = BOND_BASIC.P(self)
dis = (1 + self.yields) ** 2
for x in range(1, self.T + 1):
if x == self.T:
value = x * (x + 1) * 100 * (1 + self.coupon) / (1 + self.yields) ** x
else:
value = x * (x + 1) * 100 * self.coupon / (1 + self.yields) ** x
value_list.append(value)
return round(sum(value_list) / p / dis, 2)
3. 实际案例
问题:某10年期,面值为100,票息率6%(每年付息一次),当前的市场收益率为6.5%,求该债券的价格,久期和凸性?
求解的代码为:(代码续接第二小节)
if __name__ == '__main__':
coupon, T, yields = 0.06, 10, 0.065
model = BOND_BASIC(coupon, T, yields)
p, d, c = model.P(), model.D(), model.C()
out_df = pd.DataFrame({'票息': [format(coupon, '.2%')], '期限': [T],
'到期收益率': [format(yields, '.2%')], '价格': [p],
'久期': [d], '凸性': [c]})
最终得到的结果为:
本期分享到此结束,有何问题欢迎沟通。