⭐️ 引言
利率,这个看似简单的概念,在金融领域有很多内涵。以这个词为基础,扩展出类似零息利率(即期利率)、远期利率等概念。本文就零息利率展开讨论,并绘制零息利率期限结构曲线。
⭐️ 一些金融概念
1.零息利率
即期利率(spot rate)又称为零息利率(zero rate),指的是一笔在中间无任何利息支付,到期后才偿付本金与利息的投资利率,比如我们常见的定期存款。
2.零息债券
零息债券也叫折价债券,它以折扣价发行,整个债券期内发行人不支付债息,到期时以面值向持有人兑付的债券。而它的收益率可以理解为该债券的零息利率。
我们了解了上述概念,对比于更一般的情况,比如附息债券(在债券持有期会有利息发生,即持有人会定期获得票息),利用分解的思想,附息债券可以理解为由多个零息债券构成,每个零息债券的到期收入就是附息债券的每次发生的票息,最后一个零息债券的到期收入就是附息债券的本金和票息。
可见,零息利率有多么重要啊!!
3.利率期限结构
利率期限结构(Term Structure of Interest Rates) 是指在某一时点上,不同期限利率或基金的收益率(Yield)与到期期限(Maturity)之间的关系。利率的期限结构反映了不同期限的资金供求关系,揭示了市场利率的总体水平和变化方向,为投资者从事债券投资和政府有关部门加强债券管理提供可参考的依据。
利率期限结构曲线可以分为3种:正曲线、逆曲线和平曲线。正曲线的特点是短期利率小于长期利率,意味着市场对未来的预期很乐观,投资者预期未来利率将会很高;逆曲线的特点是短期利率大于长期利率,意味着市场现在有诸多风险,投资者会选择短期利率高的投资途径;平曲线的特点是短期利率等于长期利率,说明市场投资者没有过分预期,处于稳定的状态。
⭐️ quantlib 一些基础
好了,了解了一些金融知识,我们来看看本文代码使用的工具吧!
quantlib是一个免费、开源的量化金融计算软件库,它基于金融概念抽象出了一些数据结构并基于这些数据结构,提供了金融相关的各种计算,这里对本文要用到的组件进行简要说明。
1.Calendar
ql.Calendar类提供了一个接口,用于确定一个日期是给定交易所或给定国家的工作日还是假日,以及用于递增/递减给定工作日数的日期。
它支持很多国家的日历,本文采用的是美国的日历。
2.DayCounter
“计日惯例”对金融产品的估值至关重要,它会计算天数,本文使用的规则是Thirty360,即每月30天,一年360天。
3.零息利率期限结构
该类用于实例化一个零息利率期限结构
ql.ZeroCurve(dates, yields, dayCounter, cal, i, comp, freq)
参数说明如下
参数 | 说明 |
---|---|
Dates | 零息利率的到期日列表 |
yields | 零息利率列表 |
dayCounter | 计日器 |
cal | 日历 |
i | 线性插值方法,这里线性很重要,不是非线性的哦! |
comp | 是单利还是复利计息 |
freq | 计息频率 |
⭐️ 代码
本文利用线性和非线性插值方法生成利率期限结构曲线并将其绘制出来:
import numpy as np
import QuantLib as ql
import matplotlib
import matplotlib.pyplot as plt
if __name__ == "__main__":
# 日历
cal = ql.UnitedStates(0)
# 天数计数器
day_cnt = ql.Thirty365()
# 已知即期日期
spot_dates = [ql.Date(15,1,2020), ql.Date(15,7,2020), ql.Date(15,1,2021), ql.Date(15,7,2021), ql.Date(15,1,2022)]
# 已知即期利率
spot_rates = [0.1, 0.2, 0.3, 0.25, 0.19]
# 利率结构曲线(采用不同插值方法)
z_curve = ql.ZeroCurve(spot_dates, spot_rates, day_cnt, cal)
llz_curve = ql.LogLinearZeroCurve(spot_dates, spot_rates, day_cnt, cal)
cz_curve = ql.CubicZeroCurve(spot_dates, spot_rates, day_cnt, cal)
ncz_curve = ql.NaturalCubicZeroCurve(spot_dates, spot_rates, day_cnt, cal)
lcz_curve = ql.LogCubicZeroCurve(spot_dates, spot_rates, day_cnt, cal)
mcz_curve = ql.MonotonicCubicZeroCurve(spot_dates, spot_rates, day_cnt, cal)
# 采用的插值方法和对应的利率结构曲线
curve_list = dict({"ZeroCurve":z_curve, "LogLinearZeroCurve":llz_curve, "CubicZeroCurve":cz_curve,
"NaturalCubicZeroCurve":ncz_curve, "LogCubicZeroCurve":lcz_curve, "MonotonicCubicZeroCurve":mcz_curve, })
# 绘图准备
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(9, 7), facecolor='w')
fig.suptitle('利用不同插值方法生成即期利率结构曲线', fontsize=15)
# 遍历所有插值类型
for i in range(len(list(curve_list.keys()))):
# 插值类型
curve_type = list(curve_list.keys())[i]
print(curve_type)
# YieldTermStructureHandle
handle = ql.YieldTermStructureHandle(curve_list[curve_type])
# 生成多个时间点,以年为单位
times = np.linspace(0, handle.maxTime(), 100)
# 计算时间对应的利率
rate_list = [handle.zeroRate(t, ql.Continuous).rate() for t in times]
# 绘制子图
ax = fig.add_subplot(2, 3, i+1)
ax.set_xlabel("years")
ax.set_ylabel("rate")
ax.plot(times, rate_list)
ax.grid(visible=True, ls=":", color="#808080")
ax.set_title(r'%s' % curve_type, fontsize=12)
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.show()
# plt.savefig('zerorate.png', dpi=800)
绘图结果如下
笔者水平有限,若有不对的地方欢迎评论指正!