计息天数规则
比如18国债04的本金为100元,起息日为2018年2月1日,到期日为2028年2月1日,付息日为每年的2月1日和8月1日,票面利率每年3.85%,计算2019年2月1日至6月18日期间的利息。天数计算规则有三种:实际天数/实际天数,实际天数/360,实际天数/365,下面利用python的datetime模块来计算这三种规则下的利息:
import datetime as dt
def interest(t,T,t1,t2,par,c,m,rule):
d1=dt.date(T[0],T[1],T[2])-dt.date(t[0],t[1],t[2])#付息间隔
d2=dt.date(t2[0],t2[1],t2[2])-dt.date(t1[0],t1[1],t1[2])#要求的天数
if rule=='a/a':
i=(d2.days/d1.days)*par*c/m
elif rule=='a/360':
i=(d2.days/360)*par*c
else:
i=(d2.days/365)*par*c
return i
t,T,t1,t2=(2019,2,1),(2019,8,1),(2019,2,1),(2019,6,18)
par,c,m=100,0.0385,2
print('三种计息方式的利息分别为{:.4f}、{:.4f}、{:.4f}'.format(interest(t,T,t1,t2,par,\
c,m,rule='a/a'),interest(t,T,t1,t2,par,c,m,rule='a/360'),interest(t,T,t1,t2,par,c,m,rule='a/365')))
三种计息方式的利息分别为1.4570、1.4651、1.4451
datetime模块常用的函数有三个:datetime.date(年,月,日)和datetime.datetime(年,月,日,时,分,秒,微秒)以及时间对象.days计算时间间隔。
国债的报价
净价是债券的买卖价格,也是债券市场的报价,净价加上从上一个付息日以来的应计利息就是全价,我们之前现金流贴现求和计算的是全价。接上例,假定今天是2019年1月18日,该债券的YTM=3.1%,计算该国债的全价、应计利息和净价(画数轴更好理解):
import numpy as np
import pandas as pd
#先计算到期日2028.2.1至2019.2.1(不含)共18期的所有现金流折现
def bond(par,c,r,t):
return sum(par*c/(1+r)**t)+par/(1+r)**len(t)
t=np.array(range(1,19))
par,c,r=100,0.0385/2,0.031/2
d=dt.date(2019,2,1)-dt.date(2018,8,1)#定价日所在的付息周期
d0=dt.date(2019,1,18)-dt.date(2018,8,1)#从上一个付息日以来的天数
#再将折现到2019.2.1的所有现金流与利息折现到2019.1.18
dirtyprice=(bond(par,c,r,t)+c*par)/(1+r)**(1-(d0.days/d.days))
AI=(d0.days/d.days)*c*par
cleanprice=dirtyprice-AI
print('该国债的全价为{:.4f}、应计利息为{:.4f}、净价为{:.4f}'.format(dirtyprice,AI,cleanprice))
该国债的全价为107.6499、应计利息为1.7785、净价为105.8714
国债期货的最终价格
国债期货的最终价格(invoice price)=国债期货的市场报价×转换因子+应计利息。转换因子是考虑到国债期货有一个比较宽泛的可交割国债标准,比如标的为5年期、票面利率为3%的国债期货可以拿剩余期限为4~5.25年的记账式附息国债来交割,因此与标的要素标准(5年、3%)不符的可交割国债需要按一定的比例折算,这个比例就是转换因子。计算方法截于中国金融期货交易所官网:
假定分析的国债是在2019年3月8日到期、2019年3月13日作为最后交割日的10年期国债期货合约T1903,用上例的18国债04作为可交割债券,计算该债券的转换因子和应计利息。
这里要求的主要是x和n,x是国债期货交割月到下一付息日的月份数,也就是8月1日减去3月13日,x=5;n是可交割债券在最后交割日后的剩余付息次数,为18次,代入公式即可:
def cf(r,x,n,c,f):
a=1/pow(1+r/f,x*f/12)
b=c/f+c/r+(1-c/r)/pow(1+r/f,n-1)
d=c*(1-x*f/12)/f
return a*b-d
bondcf=cf(0.03,5,18,0.0385,2)
bondcf
Out[3]: 1.066050056827384
#x=5也可这样算:
dt.date(2019,8,1).month-dt.date(2019,3,13).month
Out[4]: 5
下面计算应计利息。根据公式,期货第二个交割日为2019年3月12日(因为国债期货合约的最后交易日8号为礼拜五,最后交割日为最后交易日之后的第3个交易日即13号);第二个交割日所在的付息周期内,可交割国债的上一付息日为2019年2月1日,代入之前的interest函数即可:
t,T,t2,t1=(2019,2,1),(2019,8,1),(2019,3,12),(2019,2,1)
ai=interest(t,T,t1,t2,100,0.0385,2,rule='a/a')
ai
Out[5]: 0.4147790055248619
最便宜交割券(CTD)
假设国债期货的空头方手中没有国债,这时由于可交割国债选择范围广,他可以从证券市场买入符合要求的最便宜可交割国债用于交割。买入交割国债金额 = 国债报价(净价) +应计利息;收到现金 = 期货价格 × 转换因子 + 应计利息;空头方交割成本 = 买入交割国债金额 - 收到现金 = 国债报价 - 期货价格 × 转换因子,CTD就是使得交割成本最小的债券。
CTD的存在是因为在转换因子的计算中对不同期限的现金流使用了相同的贴现率,不符合真实的利率期限结构而产生误差。经验来说,当收益率曲线右上倾斜时,转换因子倾向于将剩余期限较长的债券作为CTD(3%偏小,CF偏大,成本偏低)。
在2019年3月8日国债期货T1903合约的最后交易日,期货合约结算价为99.2元,假设某一空头方想从如下三支均是每年付息两次的可交割国债中选出最便宜的进行交割,应该选择哪一支?
国债简称 | 债券净价 | 票面利率 | 转换因子 | 起息日 | 到期日 |
---|---|---|---|---|---|
16国债04 | 97.8465 | 2.85% | 0.9908 | 2016.1.28 | 2026.1.28 |
17国债04 | 101.3555 | 3.4% | 1.028 | 2017.2.9 | 2027.2.9 |
18国债04 | 104.5917 | 3.85% | 1.0661 | 2018.2.1 | 2028.2.1 |
def CTD(bp,fp,cf):
return bp-fp*cf
bp=np.array([97.8465,101.3555,104.5917])
cf=np.array([0.9908,1.028,1.0661])
for i in range(3):
print('交割{}国债04的成本为{:.4f}'.format(i+16,CTD(bp,99.2,cf)[i]))
交割16国债04的成本为-0.4409
交割17国债04的成本为-0.6221
交割18国债04的成本为-1.1654
因此最便宜可交割债是“18国债04”。
基于久期的套保策略
国债期货采用百元净价报价的方式,即假定债券面额100为单位进行报价。比如国债期货报价为100.3,则表示每100元面额的价格为100.3元。由于合约的基础资产面值为100万元,则一手的合约价值为100.3×1000000/100元。
市场利率与国债期货报价成反向关系,因此规避利率下降风险的金融机构可以用国债期货多头来套保,反之亦然。
假设∆P表示被套保资产S的价值变化,∆V表示国债期货合约F的价格变化,根据各自的修正久期有∆P=-PDS∆y,∆V=-VDF∆y,根据组合久期为0代入∆P=N*∆V可得N *=PDS/VDF,即现货价值乘现货久期与期货价值乘期货久期之比。一般来说现货DS很容易计算,而DF的计算需要我们先选定一个CTD,用其套保到期日的修正久期来代替。如果利率环境发生了变化导致CTD变化,我们还需要对套保组合进行动态调整。
2019年1月28日,假设一家管理1亿元证券投资组合的基金公司担心未来一个月利率上升,决定利用3月份到期的国债期货来套保。在到期日2月28日,证券组合久期为8.28。可见需要用10年期的国债期货合约T1903来套保,该合约在1月28日的结算价为97.725元,因此一手T1903合约的价值是97.725万元。假定CTD就是上述“18国债04”债券,YTM=3.2%,求需要买入或者卖出多少份国债期货合约?
def MD(c,y,F,t):
p=sum(c*F/(1+y)**t)+F/(1+y)**len(t)
a=sum(c*F*t/(1+y)**t)+F*len(t)/(1+y)**len(t)
return (a/p)/(1+y)
t1=np.array(range(1,19));t2=np.array(range(1,20))
DF1=MD(0.0385/2,0.016,100,t1)/2#2019.8.1的久期
DF2=MD(0.0385/2,0.016,100,t2)/2#2019.2.1的久期
#插值法求2019.2.28的久期
DF=DF1+((dt.date(2019,2,28)-dt.date(2019,2,1)).days/181)*(DF2-DF1)
DF
Out[12]: 7.660818785410174
N=8.28*100000000/(DF*977250);N
Out[13]: 110.59855894893595
该基金公司规避利率上升风险,因此需要卖出111份18国债04合约。