Python金融量化实战
上QQ阅读APP看书,第一时间看更新

第2章 债券的计息基准与应计利息的计算

债券计息基准为年化时间的计算基准,应计利息则描述了持有债券期间(年化时间)获得利息的金额。本章主要介绍在计息基准的基础上,计算债券在持有期内获得利息金额的具体方法。在计算利息金额之前,需要知道上一计息计划结束日(首期则为起息日)至计算日之间的间隔天数,这又需得知债券整个计息间隔计划的日期。下面将用实例来讲解如何生成计息间隔计划的日期。

【实例2-108国债02债券的基本信息如表2-1所示,请计算该债券的计息间隔计划。

表2-1 08国债02债券的基本信息

图片表格

数据来源:中国货币网

【分析解答】由于08国债02的起息日为2008-2-28,付息频率为每半年付息一次,所以计息间隔计划为按半年频率增加的日期计划。由此可知08国债02的计息日期计划应当为:

2008-2-28,2008-8-28,2009-2-28,……,2022-8-28,2023-2-28。

下面采用Python编写生成债券计息计划的日期函数(coupon_schedule):

#加载需要使用的库
from datetime import date
from dateutil import relativedelta
#用于生成债券计息计划的日期的函数
def coupon_schedule(start_date,yearlenth,fre):
     '''
     :param start_date: 债券起息日;
     :param yearlenth: 债券的发行年限;
     :param fre: 债券的付息频率;
     :return: 返回债券的计息间隔计划。
     '''
     schedule=[start_date]
     if fre == 0:  #付息频率为0,通常为零息或贴现债
            schedule.append(start_date+relativedelta.relativedelta(months=12*yearlenth))
     elif fre == 4:  #付息频率为4
            for i in range(3,int(yearlenth*3*4+1), 3):
                   schedule.append(start_date+relativedelta.relativedelta(months=i))
     elif fre == 2:  #付息频率为2
            for i in range(6,int(yearlenth*6*2+1), 6):
                   schedule.append(start_date+relativedelta.relativedelta(months=i))
     else:  #付息频率为1
            for i in range(12,int(yearlenth*12*1+1), 12):
                   schedule.append(start_date+relativedelta.relativedelta(months=i))
return schedule

调用coupon_schedule函数,输入起息日、发行年限、付息频率参数,进行计算。

#测试案例
schedule_test=coupon_schedule(start_date=date(2008,2,28),yearlenth=15,fre=2)
print("计息间隔计划:\n",schedule_test)

输出结果:

将上述计息间隔计划汇总整理成表2-2。

表2-2 08国债02债券的计息与付息时间

图片表格

【注】计息天数算头不算尾。

需要注意的是,在不考虑节假日情况下,计息计划结束日和付息日是一致的。而国内的债券大部分是在遇到节假日时将付息日顺延至下一营业日。有了计息间隔计划,就可以判断起息日或上一计息计划结束日(未进行节假日调整)至计算日之间的年化时间,后续百元面值应计利息可以采用一个通用的思路进行计算,即