QuantLib 金融计算——收益率曲线之构建曲线(1)
如果未做特别说明,文中的程序都是 Python3 代码。
QuantLib 金融计算——收益率曲线之构建曲线(1)
理论和实践上有多种方法可以构建与市场一致的收益率曲线,背后的方法论取决于市场上的可获得金融工具的流动性。在构建收益率曲线时有两个选项必须选定好:插值方法和所选的金融工具或数据。
quantlib-python 允许构建下列两大类收益率曲线:
- 第一类,根据数值和对应日期构建:
DiscountCurve,根据贴现因子构建- 若干
*ZeroCurve型的收益率曲线,根据债券零息收益率构建(前缀表示具体的构建方法) ForwardCurve,根据远期收益率构建
- 第二类,根据若干固定收益类对象(如
FixedRateBond)构建:FittedBondDiscountCurve,根据若干债券的价格构建- 若干
Piecewise**型的收益率曲线,根据若干不同类型金融工具(存款收益率、收益率远期合约和互换等等)的报价分段构建(后缀表示具体的构建方法和曲线类型)
本文介绍第一种。
载入 QuantLib:
import QuantLib as ql
print(ql.__version__)
1.12
YieldTermStructure
事实上,所有上述类都派生自基类 YieldTermStructure,该基类实现了一些常用的功能。例如,实现了返回基准日期、天数计算规则、日历的函数,以及返回收益率的最小或最大日期的函数。
YieldTermStructure 常用的成员函数:
discount(d, extrapolate = False):浮点数,d是Date对象,extrapolate是布尔型。返回贴现因子大小。zeroRate(d, resultDayCounter, comp, freq = Annual, extrapolate = False):InterestRate,d是Date对象,resultDayCounter是DayCounter对象,comp和freq是预置整数,extrapolate是布尔型。返回等价的零息收益率对象。forwardRate(d1, d2, dc, comp, freq = Annual, extrapolate = false):InterestRate,d1和d2是Date对象,resultDayCounter是DayCounter对象,comp和freq是 quantlib-python 预置整数(表示付息方式和频率),extrapolate是布尔型。返回d1和d2之间的远期收益率对象。
DiscountCurve
首先介绍 DiscountCurve。这种构造方法适用于给定的一组贴现因子,并为其分配给相应的期限。
DiscountCurve 对象的构造
构造函数具有以下实现
DiscountCurve(dates,
dfs,
dayCounter,
cal)
这些变量的类型和解释如下:
dates:日期序列,贴现因子对应的到期日。注意:第一个日期必须是贴现曲线的基准日期,例如贴现因子是 1.0 的日期。dfs:浮点数序列,贴现因子dayCounter:DayCounter对象,天数计算规则cal:Calendar对象,日历表
DiscountCurve 常用的成员函数均继承自基类 YieldTermStructure。
在下面的例子中,根据历史上某天路透社公布的贴现因子报价构建收益率曲线。在收益率曲线构建之后,求给定日期的等价零息收益率、贴现因子和远期收益率。
| EUR | Yield | Discount |
|---|---|---|
| TN | 0.3148 | 0.9999656 |
| 1w | 0.3083 | 0.9999072 |
| 1M | 0.4225 | 0.9996074 |
| 2M | 0.5443 | 0.9990040 |
| 3M | 0.7242 | 0.9981237 |
| 6M | 0.9614 | 0.9951358 |
| 9M | 0.9372 | 0.9929456 |
| 1Y | 1.0006 | 0.9899849 |
| 1Y3M | 1.1120 | 0.9861596 |
| 1Y6M | 1.2457 | 0.9815178 |
| 1Y9M | 1.4358 | 0.9752363 |
| 2Y | 1.6263 | 0.9680804 |
例子 1:
def testingYields1():
dates = []
dfs = []
cal = ql.UnitedStates()
today = ql.Date(11, ql.September, 2009)
libor = ql.EURLibor1M()
dc = libor.dayCounter()
settlementDays = 2
settlement = cal.advance(
today, settlementDays, ql.Days)
dates.append(settlement)
dates.append(settlement + ql.Period(1, ql.Days))
dates.append(settlement + ql.Period(1, ql.Weeks))
dates.append(settlement + ql.Period(1, ql.Months))
dates.append(settlement + ql.Period(2, ql.Months))
dates.append(settlement + ql.Period(3, ql.Months))
dates.append(settlement + ql.Period(6, ql.Months))
dates.append(settlement + ql.Period(9, ql.Months))
dates.append(settlement + ql.Period(1, ql.Years))
dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(3, ql.Months))
dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(6, ql.Months))
dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(9, ql.Months))
dates.append(settlement + ql.Period(2, ql.Years))
dfs.append(1.0)
dfs.append(0.9999656)
dfs.append(0.9999072)
dfs.append(0.9996074)
dfs.append(0.9990040)
dfs.append(0.9981237)
dfs.append(0.9951358)
dfs.append(0.9929456)
dfs.append(0.9899849)
dfs.append(0.9861596)
dfs.append(0.9815178)
dfs.append(0.9752363)
dfs.append(0.9680804)
tmpDate1 = settlement + ql.Period(1, ql.Years) + ql.Period(3, ql.Months)
tmpDate2 = tmpDate1 + ql.Period(3, ql.Months)
curve = ql.DiscountCurve(
dates, dfs, dc, cal)
equ_zero = curve.zeroRate(
tmpDate1, dc, ql.Simple, ql.Annual)
print(
"等价 Zero Rate:",
equ_zero)
print(
"等价 Zero Rate 计算的贴现因子:",
equ_zero.discountFactor(
settlement, tmpDate1))
print(
"真实 Discount Factor:",
curve.discount(tmpDate1))
print(
"1Y3M-1Y6M 间的远期收益率 Fwd Rate:",
curve.forwardRate(
tmpDate1, tmpDate2, dc, ql.Continuous))
testingYields1()
输出如下所示:
等价零息收益率: 1.107998 % Actual/360 simple compounding
等价零息收益率计算的贴现因子: 0.9861595999999999
真实贴现因子: 0.9861596
1Y3M-1Y6M 间的远期收益率: 1.887223 % Actual/360 continuous compounding
ZeroCurve
下面介绍 ZeroCurve。这种构造方法适用于给定的一组零息收益率,并为其分配给相应的期限。
ZeroCurve 对象的构造
构造函数具有以下实现
ZeroCurve(dates,
yields,
dayCounter,
cal,
i,
comp,
freq)
这些变量的类型和解释如下:
dates:日期序列,零息收益率对应的到期日。注意:第一个日期必须是曲线的基准日期,例如收益率是 0.0 的日期。yields:浮点数序列,零息收益率dayCounter:DayCounter对象,天数计算规则cal:Calendar对象,日历表i:Linear对象,线性插值方法comp和freq是预置整数,表示付息方式和频率
ZeroCurve 常用的成员函数均继承自基类 YieldTermStructure。
在下面的例子中,根据 2018 年 7 月 23 日货币网公布的即期国债收盘收益率数据构建曲线。在收益率曲线构建之后,求给定日期的等价零息收益率、贴现因子和远期收益率。
| 期限 | 即期收益率 |
|---|---|
| 1 | 3.0544 |
| 2 | 3.1565 |
| 3 | 3.2531 |
| 4 | 3.2744 |
| 5 | 3.2964 |
| 6 | 3.4092 |
| 7 | 3.5237 |
| 8 | 3.5264 |
| 9 | 3.5298 |
| 10 | 3.5337 |
| 15 | 3.8517 |
| 20 | 3.8884 |
| 30 | 4.0943 |
例子 2:
def testingYields2():
dates = []
dfs = []
cal = ql.China(ql.China.IB)
today = ql.Date(23, ql.July, 2018)
dc = ql.ActualActual(ql.ActualActual.ISMA)
settlementDays = 0
settlement = cal.advance(
today, settlementDays, ql.Days)
dates.append(settlement)
dates.append(settlement + ql.Period(1, ql.Years))
dates.append(settlement + ql.Period(2, ql.Years))
dates.append(settlement + ql.Period(3, ql.Years))
dates.append(settlement + ql.Period(4, ql.Years))
dates.append(settlement + ql.Period(5, ql.Years))
dates.append(settlement + ql.Period(6, ql.Years))
dates.append(settlement + ql.Period(7, ql.Years))
dates.append(settlement + ql.Period(8, ql.Years))
dates.append(settlement + ql.Period(9, ql.Years))
dates.append(settlement + ql.Period(10, ql.Years))
dates.append(settlement + ql.Period(15, ql.Years))
dates.append(settlement + ql.Period(20, ql.Years))
dates.append(settlement + ql.Period(30, ql.Years))
dfs.append(0.0000 / 100.0)
dfs.append(3.0544 / 100.0)
dfs.append(3.1565 / 100.0)
dfs.append(3.2531 / 100.0)
dfs.append(3.2744 / 100.0)
dfs.append(3.2964 / 100.0)
dfs.append(3.4092 / 100.0)
dfs.append(3.5237 / 100.0)
dfs.append(3.5264 / 100.0)
dfs.append(3.5298 / 100.0)
dfs.append(3.5337 / 100.0)
dfs.append(3.8517 / 100.0)
dfs.append(3.8884 / 100.0)
dfs.append(4.0943 / 100.0)
tmpDate1 = settlement + ql.Period(7, ql.Years)
tmpDate2 = settlement + ql.Period(8, ql.Years)
curve = ql.ZeroCurve(
dates, dfs, dc, cal, ql.Linear(), ql.Compounded, ql.Annual)
print(
"零息收益率:",
curve.zeroRate(
tmpDate2, dc, ql.Compounded, ql.Annual))
print(
"贴现因子:",
curve.discount(tmpDate2))
print(
"7Y - 8Y 远期收益率:",
curve.forwardRate(
tmpDate1, tmpDate2, dc, ql.Compounded, ql.Annual))
输出如下所示:
零息收益率: 3.526400 % Actual/Actual (ISMA) Annual compounding
贴现因子: 0.7578636936087101
7Y - 8Y 远期收益率: 3.545302 % Actual/Actual (ISMA) Annual compounding
QuantLib 金融计算——收益率曲线之构建曲线(1)的更多相关文章
- QuantLib 金融计算——收益率曲线之构建曲线(2)
目录 QuantLib 金融计算--收益率曲线之构建曲线(2) YieldTermStructure 问题描述 Piecewise** 分段收益率曲线的原理 Piecewise** 对象的构造 Fit ...
- QuantLib 金融计算——收益率曲线之构建曲线(3)
目录 QuantLib 金融计算--收益率曲线之构建曲线(3) 概述 估算期限结构的步骤 读取样本券数据 一些基本配置 配置 *Helper 对象 配置期限结构 估算期限结构 汇总结果 当前实现存在的 ...
- QuantLib 金融计算——收益率曲线之构建曲线(4)
[TOC] 如果未做特别说明,文中的程序都是 C++11 代码. QuantLib 金融计算--收益率曲线之构建曲线(4) 本文代码对应的 QuantLib 版本是 1.15.相关源代码可以在 Qua ...
- QuantLib 金融计算——收益率曲线之构建曲线(5)
目录 QuantLib 金融计算--收益率曲线之构建曲线(5) 概述 Nelson-Siegel 模型家族的成员 Nelson-Siegel 模型 Svensson 模型 修正 Svensson 模型 ...
- QuantLib 金融计算
我的微信:xuruilong100 <Implementing QuantLib>译后记 QuantLib 金融计算 QuantLib 入门 基本组件之 Date 类 基本组件之 Cale ...
- QuantLib 金融计算——自己动手封装 Python 接口(1)
目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 ...
- QuantLib 金融计算——自己动手封装 Python 接口(2)
目录 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 如何封装一项复杂功能? 寻找最小功能集合的策略 实践 估计期限结构参数 修改官方接口文件 下一步的计划 QuantLi ...
- QuantLib 金融计算——数学工具之插值
目录 QuantLib 金融计算--数学工具之插值 概述 一维插值方法 二维插值方法 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之插值 载入模块 ...
- QuantLib 金融计算——高级话题之模拟跳扩散过程
目录 QuantLib 金融计算--高级话题之模拟跳扩散过程 跳扩散过程 模拟算法 面临的问题 "脏"的方法 "干净"的方法 实现 示例 参考文献 如果未做特别 ...
随机推荐
- IPMI设置与使用(远程控制服务器)
如果服务器crash了或者就hang住了,我们不必要跑到机房去按电源键的,因为我们也想“运筹帷幄之中,决胜千里之外”嘛.我们可以用IPMI,它可以让我们远程用一条命令开启(关闭.重启)一台服务器,也可 ...
- 关于eclipse创建java项目时产生的.settings文件:
在用eclipse创建一个java项目,在项目目录下面往往会发现.settings文件夹并包含一个org.eclipse.core.resources.prefs文件条目. 这个条目是配置项目的编码方 ...
- [SoapUI]怎样保存response到本地文件夹
def myOutFile = "D:/AUS/Aspect Huntley feed URLs/Automation Save Responses/ahresearch.xml" ...
- Spring JMX之一:使用JMX管理Spring Bean
spring中关于jmx包括几个概念: MBeanExporter: 从字面上很容易理解, 用来将一些spring的bean作为MBean暴露给MBEanServer.MBeanServerFacto ...
- 分布式理论系列(一)从 ACID 到 CAP 到 BASE
分布式理论系列(一)从 ACID 到 CAP 到 BASE 一.ACID 1.1 事务的四个特征: (1) Atomic(原子性) 事务必须是一个原子的操作序列单元,事务中包含的各项操作在一次执行过程 ...
- FW:考查嵌入式C开发人员的最好的16道题(转)
考查一个初级嵌入式系统开发人员的C基本功,附有答案题目由资深嵌入式系统专家拟定, 目的是考查入门级的嵌入式软件开发人员 Gavin Shaw提供详细解答. 编者按:非常基本关于C语言的问题,一个信息类 ...
- 2016-2017 《移动平台开发》实验三 敏捷开发与XP实践
概述 软件=程序+软件工程 软件企业=软件+商业模式 XP是一种轻量(敏捷).高效.低风险.柔性.可预测.科学而且充满乐趣的软件开发方式. 在更短的周期内,更早地提供具体.持续的反馈信息. 在迭代的进 ...
- (3)-JSONObject的过滤设置
我们通常对一个json串和java对象进行互转时,经常会有选择性的过滤掉一些属性值.例如下面的类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- NETSH.EXE操作SSL
NETSH.EXE操作SSL 程序位置:c:\windows\syswow64\netsh.exe 查看当前端口配置 netsh http show sslcert 将 SSL 证书绑定至端口号 ne ...
- Always on (HA 负载均衡 异地容灾 一体化 )
Sqlserver 2012 开始,以往困扰我们的三个棘手问题:可扩展性.数据保护.异地容灾可以统一通过alwayson 来实现.2014 支持secondary 节点更是达到8个.在硬件调配方面比 ...