QuantLib 金融计算——案例之固息债的价格、久期、凸性和 BPS

概述

从本篇开始计划开启一个系列,以《Interest Rate Risk Modeling》为蓝本,介绍有关利率风险的计算案例,内容涉及从简单的久期、凸性到主成分久期和久期向量模型等高阶的度量指标。

计算久期和凸性

固息债的久期、凸性和 BPS 是最常见的利率风险度量指标,下面将以 200205 为例,计算 2020-07-28 这一天的价格,以及久期、凸性和 BPS。

首先从中国货币网查询债券的基本信息,用以配置 FixedRateBond 对象。

债券起息日:2020-03-10

到期兑付日:2030-03-10

债券期限:10 年

面值(元):100.00

计息基准:A/A

息票类型:附息式固定利率

付息频率:年

票面利率(%):3.0700

结算方式:T+1

import QuantLib as ql

import prettytable as pt

today = ql.Date(28, ql.July, 2020)

ql.Settings.instance().evaluationDate = today

settlementDays = 1

faceAmount = 100.0

settlementDays = 1 表示 T+1 结算,而估值日期就是 2020-07-28 这一天。

effectiveDate = ql.Date(10, ql.March, 2020)

terminationDate = ql.Date(10, ql.March, 2030)

tenor = ql.Period(1, ql.Years)

calendar = ql.China(ql.China.IB)

convention = ql.Unadjusted

terminationDateConvention = convention

rule = ql.DateGeneration.Backward

endOfMonth = False

schedule = ql.Schedule(

effectiveDate,

terminationDate,

tenor,

calendar,

convention,

terminationDateConvention,

rule,

endOfMonth)

# for s in schedule:

# print(s)

coupons = ql.DoubleVector(1)

coupons[0] = 3.07 / 100.0

accrualDayCounter = ql.ActualActual(

ql.ActualActual.Bond, schedule)

paymentConvention = ql.Unadjusted

bond = ql.FixedRateBond(

settlementDays,

faceAmount,

schedule,

coupons,

accrualDayCounter,

paymentConvention)

需要注意的是,日历采用中国的银行间市场,遇到假期不调整。

如果像下面一样,采用基于期限结构的定价引擎,在构造 ActualActual 对象时要附加上债券现金流支付的日期表(Schedule 对象),否则在计算贴现因子的时候可能产生偏差,具体的讨论请查看 StackExchange 上的讨论:https://quant.stackexchange.com/questions/12707/pricing-a-fixedratebond-in-quantlib-yield-vs-termstructure

在上海清算所查询估值、价格和久期等数据,作为比较基准。

由于使用的是估值,也就是“到期利率”,这隐含要求于一个“水平”(flat)的期限结构,所以使用 FlatForward 类。对于水平的期限结构而言,远期利率、即期利率和到期利率三者相等。

DiscountingBondEngine 是最常见的债券定价引擎,主要用于现金流的贴现计算。

bondYield = 3.4124 / 100.0

compounding = ql.Compounded

frequency = ql.Annual

termStructure = ql.YieldTermStructureHandle(

ql.FlatForward(

settlementDays,

calendar,

bondYield,

accrualDayCounter,

compounding,

frequency))

engine = ql.DiscountingBondEngine(termStructure)

bond.setPricingEngine(engine)

价格信息可以通过 FixedRateBond 的成员函数获得,而久期等指标的计算在 BondFunctions 的内部函数中实现(BondFunctions 的内部函数也可以依据到期利率计算价格信息)。

cleanPrice = bond.cleanPrice()

dirtyPrice = bond.dirtyPrice()

accruedAmount = bond.accruedAmount()

duration = ql.BondFunctions.duration(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency)

convexity = ql.BondFunctions.convexity(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency)

bps = ql.BondFunctions.basisPointValue(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency)

tab = pt.PrettyTable(['item', 'QuantLib', 'ShClearing'])

tab.add_row(['clean price', cleanPrice, 97.2211])

tab.add_row(['dirty price', dirtyPrice, 98.4071])

tab.add_row(['accrued amount', accruedAmount, 1.1859])

tab.add_row(['duration', duration, 8.0771])

tab.add_row(['convexity', convexity, 79.2206])

tab.add_row(['bps', abs(bps), 0.0795])

tab.float_format = '.4'

print(tab)

+----------------+----------+------------+

| item | QuantLib | ShClearing |

+----------------+----------+------------+

| clean price | 97.2212 | 97.2211 |

| dirty price | 98.4071 | 98.4071 |

| accrued amount | 1.1859 | 1.1859 |

| duration | 8.0771 | 8.0771 |

| convexity | 79.2206 | 79.2206 |

| bps | 0.0795 | 0.0795 |

+----------------+----------+------------+

最终结果和上海清算所公布的几乎一致。

三种久期

BondFunctions 的 duration 函数可以计算三种久期,分别是简单久期(Simple)、麦考利久期(Macaulay)和修正久期(Modified),只需配置久期类型参数即可,默认计算的是修正久期。

程序实现上,麦考利久期的计算依赖于修正久期。

所谓简单久期,即现金流的期限关于现金流贴现值的加权平均。如果计息方式是复利,简单久期等于麦考利久期。不过,如果是连续复利,计算麦考利久期将会报错,简单久期依然可以计算出来,更有普适性。连续复利的情况下,简单久期等于修正久期。

durationSimple = ql.BondFunctions.duration(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency,

ql.Duration.Simple)

durationModified = ql.BondFunctions.duration(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency,

ql.Duration.Modified)

durationMacaulay = ql.BondFunctions.duration(

bond,

bondYield,

accrualDayCounter,

compounding,

frequency,

ql.Duration.Macaulay)

tabDuration = pt.PrettyTable(['type', 'value'])

tabDuration.add_row(['Simple', durationSimple])

tabDuration.add_row(['Modified', durationModified])

tabDuration.add_row(['Macaulay', durationMacaulay])

print(tabDuration)

+----------+-------------------+

| type | value |

+----------+-------------------+

| Simple | 8.352745733674992 |

| Modified | 8.077122021802985 |

| Macaulay | 8.352745733674992 |

+----------+-------------------+

原文链接:https://www.cnblogs.com/xuruilong100/p/13442595.html

如何利用python计算即期利率_QuantLib 金融计算——案例之固息债的价格、久期、凸性和 BPS...相关推荐

  1. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  2. 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...

    一.第14章 数据分析案例 本书正文的最后一章,我们来看一些真实世界的数据集.对于每个数据集,我们会用之前介绍的方法,从原始数据中提取有意义的内容.展示的方法适用于其它数据集,也包括你的.本章包含了一 ...

  3. 如何利用python计算即期利率_PYTHON计算任务收益率

    # -*- coding: UTF-8 -*- #手动输入回报率 #roe = raw_input("回报率为: ") #设置年份 #year = raw_input(" ...

  4. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

  5. 利用python进行数据分析_第二章_案例2_movielens_电影评分分析

    自己尝试了一下数据分析,和书里的方法不完全一样.标*的为比较好的方法. ================================================ MovieLens电影评分数据 ...

  6. 利用python进行数据分析_第二章_案例3_全美婴儿名字分析

    In [1]: import pandas as pd data_year = {} path = 'C:\\Users\\yi&lei\\Documents\\电子书\\pydata-boo ...

  7. python历年来经典项目实例-【实战案例】利用Python输出精美表格的5个案例,过程详细...

    1. 前言 最近在用python写一个小工具,这个工具主要就是用来管理各种资源的信息,比如阿里云的ECS等信息,因为我工作的电脑使用的是LINUX,所以就想着用 Python写一个命令行的管理工具,基 ...

  8. python自动化办公 51cto_利用python实现批量自动化运维脚本案例

    本文为通过密码或密钥实现python批量自动化运维脚本案例分享,是老男孩linux培训 python课程教学案例内容,后续会分享多线程并发执行这个脚本的更高级的功能(http://oldboy.blo ...

  9. 【如何用python计算利率互换收盘曲线的即期利率】

    在交易利率互换产品时,如果要对利率互换进行定价估值,或者计算它的风险敏感度指标,比如DV01.基础要求是需要对利率互换产品的贴现利率进行计算,即计算即期利率值. 这里以Shibor 3M为参考利率的利 ...

  10. QuantLib 金融计算——收益率曲线之构建曲线(3)

    目录 QuantLib 金融计算--收益率曲线之构建曲线(3) 概述 估算期限结构的步骤 读取样本券数据 一些基本配置 配置 *Helper 对象 配置期限结构 估算期限结构 汇总结果 当前实现存在的 ...

最新文章

  1. 20169212 2016-2017-2 《网络攻防实践》第四周学习总结
  2. 如何使用github托管项目---快速入门(菜鸟教程)
  3. java get post 区别详解_[Java教程]GET 与 POST 其实没有什么区别
  4. Fedora安装Nvidia显卡驱动方法
  5. android 多行 对齐方式,android – 按钮与多行文字下沉对齐线,如何解决?
  6. C++ STL : 模拟实现STL中的容器适配器stack和queue
  7. 2016-05-09的POC Yaas Open Event的代码审查
  8. Project编写功能点的规划时间
  9. 前端学习(2258)如何做标签管理
  10. windows 2008 r2 AD域控服务器部署
  11. koa如何实现Oauth2(一)
  12. 机器学习笔记-XGBoost
  13. Mac搭建本地服务器及测试demo
  14. 2022-2028全球昼夜节律性睡眠障碍行业调研及趋势分析报告
  15. python的array是什么意思_[:,:]在NumPy数组上是什么意思
  16. 联通光纤猫虚拟服务器设置,联通光猫连接无线路由器怎么设置?
  17. Lemon tree 柠檬树
  18. matlab怎么根据图像求职,图像处理求职简历模板
  19. 用Python+selenium实现在全国报刊索引上搜集资料
  20. 为什么抖音账号作品很少粉丝却很多,抖音删除的粉丝还能看到吗

热门文章

  1. JQuery超链接鼠标提示效果
  2. 加速度传感器和角度传感器
  3. linux 修改文件的权限
  4. Cors跨域(三):Access-Control-Allow-Origin多域名?
  5. IPAD2 恢复出厂设置
  6. 服务器自动ip使用,自动或手动设置IP地址图解教程
  7. 怎么锁定计算机的ip地址,怎么设置固定IP地址让电脑上网
  8. 计算机术语翻译在线,拼音翻译在线
  9. OSChina 周二乱弹 —— 程序员如何转行卖烧烤
  10. com alibaba.fastjson.JSONException:witer JavaBean error....