如果未做特别说明,文中的程序都是 Python3 代码。

QuantLib 金融计算——基本组件之 Calendar 类

针对相应国家编制一套日历表用来推算假期、工作日和周末,这对于金融实务来说是一件基础又非常重要的事。

载入 QuantLib:

import QuantLib as ql

print(ql.__version__)
1.10

Calendar 对象的构造

在 QuantLib 中可以很轻松的构造特定国家的日历表。例如,通过 myCal = UnitedKingdom() 构造英国的日历表,其他国家诸如美国、日本、加拿大等等也可以用类似的方式构造。在有些国家,不同的市场遵循不同的日历表,例如在中国,银行间市场和交易所市场遵循的日历表是不一样的(交易所市场在周六周日一定不开放,不管是否调休)。对于这一问题,可以通过配置特定参数将日历表细化到具体的市场上,例如中国银行间市场的日历表可以通过 myCal = China(China.IB) 构造。China.IBChina.SSE 是 quantlib-python 的预留特殊变量,分别表示中国的银行间市场和交易所市场。

一些常用的成员函数

下面是一些常用的成员函数:

  • isBusinessDay(d):布尔值,判断 d 是不是工作日。
  • isHoliday(d):布尔值,判断 d 是不是假期。
  • isWeekend(w):布尔值,判断 w 是不是周末(在有些国家,周末没有安排在周六周日)。
  • isEndOfMonth(d):布尔值,判断 d 是不是月末最后一个工作日。
  • endOfMonth(d):日期,返回 d 所在月的最后一个工作日。

例子 1:

def CalendarTesting1():
chinaCal = ql.China(ql.China.IB)
saudiArabCal = ql.SaudiArabia()
nyEve = ql.Date(3, ql.April, 2017) print('Is BD :', chinaCal.isBusinessDay(nyEve))
print('Is Holiday :', chinaCal.isHoliday(nyEve))
print('Is Weekend in SA :', saudiArabCal.isWeekend(ql.Friday))
print('Is Weekend in CN :', chinaCal.isWeekend(ql.Friday))
print('Is Last BD :',
chinaCal.isEndOfMonth(ql.Date(5, ql.April, 2018)))
print('Last BD :', chinaCal.endOfMonth(nyEve))
Is BD : False
Is Holiday : True
Is Weekend in SA : True
Is Weekend in CN : False
Is Last BD : False
Last BD : April 28th, 2017

注意,在沙特阿拉伯周五周六是“周末”,这和中国不一样。

自定义假期列表

QuantLib 对中国市场的支持比较有限,目前的版本假期列表仅仅维护到 2004-2017 年,要想正确推算其他年份的日历表,用户需要自行配置假期。QuantLib 中的 Calendar 对象可以方便的实现自定义假期,通常仅仅需要借助下列两个函数:

  • addHoliday(d):添加 d 为假期。
  • removeHoliday(d):从假期表中移除 d

将 2018 年清明节放假调休的安排配置到 Calendar 对象中。

例子 2:

def CalendarTesting2():
chinaCal = ql.China(ql.China.IB) d1 = ql.Date(5, ql.April, 2018)
d2 = ql.Date(6, ql.April, 2018)
d3 = ql.Date(8, ql.April, 2018) print('Is Business Day : ', chinaCal.isBusinessDay(d1))
print('Is Business Day : ', chinaCal.isBusinessDay(d2))
print('Is Business Day : ', chinaCal.isBusinessDay(d3)) chinaCal.addHoliday(d1)
chinaCal.addHoliday(d2)
chinaCal.removeHoliday(d3) print('Is Business Day : ', chinaCal.isBusinessDay(d1))
print('Is Business Day : ', chinaCal.isBusinessDay(d2))
print('Is Business Day : ', chinaCal.isBusinessDay(d3))
Is Business Day :  True
Is Business Day : True
Is Business Day : False
Is Business Day : False
Is Business Day : False
Is Business Day : True

工作日修正

将某个日期修正为工作日是一项必要的工作,QuantLib 中支持如下工作日转换模式:

  • Following:将日期修正为之后出现的第一个工作日。
  • ModifiedFollowing:将日期修正为之后出现的第一个工作日,除非这个工作日出现在次月;如果修正后的工作日出现在次月,就将日期修正为之前出现的最近一个工作日,保证原始日期和修正后的日期处在同一个月。
  • Preceding:将日期修正为之前出现的最近一个工作日。
  • ModifiedPreceding:将日期修正为之前出现的最近一个工作日,除非这个工作日出现在上一个月;如果修正后的工作日出现在上一个月,就将日期修正为之后出现的第一个工作日,保证原始日期和修正后的日期处在同一个月。
  • Unadjusted:不作调整。

Calendar 对象通过下列两个函数实现修正日期的功能:

  • adjust(d, convention):日期,按照转换模式 convention 修正 d
  • advance(d, period, convention, endOfMonth):日期,将日期 date 向后推移时间间隔 period 后再按照转换模式 convention 修正;参数 endOfMonth 表示,如果 d 是月末的话,推移修正后的日期也要是在月末。

最后,可以通过下面的函数计算两个日期间的工作日个数:

  • businessDaysBetween(from, to, includeFirst, includeLast):计算日期 fromto 之间的工作日个数(是否包括首尾日期)。

例子 3:

def CalendarTesting3():
chinaCal = ql.China(ql.China.IB) firstDate = ql.Date(31, ql.January, 2018)
secondDate = ql.Date(1, ql.April, 2018) print('Date 2 Adj :', chinaCal.adjust(secondDate, ql.Preceding))
print('Date 2 Adj :', chinaCal.adjust(secondDate, ql.ModifiedPreceding)) mat = ql.Period(2, ql.Months) print('Date 1 Month Adv :',
chinaCal.advance(firstDate, mat, ql.Following, False))
print('Date 1 Month Adv :',
chinaCal.advance(firstDate, mat, ql.ModifiedFollowing, False)) print('Business Days Between :',
chinaCal.businessDaysBetween(
ql.Date(5, ql.March, 2018), ql.Date(30, ql.March, 2018),
True, True))
Date 2 Adj : March 30th, 2018
Date 2 Adj : April 2nd, 2018
Date 1 Month Adv : April 2nd, 2018
Date 1 Month Adv : March 30th, 2018
Business Days Between : 20

QuantLib 金融计算——基本组件之 Calendar 类的更多相关文章

  1. QuantLib 金融计算——基本组件之 Schedule 类

    目录 QuantLib 金融计算--基本组件之 Schedule 类 Schedule 对象的构造 作为"容器"的 Schedule 对象 一些常用的成员函数 如果未做特别说明,文 ...

  2. QuantLib 金融计算——基本组件之 Index 类

    目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...

  3. QuantLib 金融计算——基本组件之 Currency 类

    目录 QuantLib 金融计算--基本组件之 Currency 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Cu ...

  4. QuantLib 金融计算——基本组件之 Date 类

    目录 QuantLib 金融计算--基本组件之 Date 类 Date 对象的构造 一些常用的成员函数 一些常用的静态函数 为估值计算配置日期 如果未做特别说明,文中的程序都是 Python3 代码. ...

  5. QuantLib 金融计算——基本组件之 DayCounter 类

    目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...

  6. QuantLib 金融计算——基本组件之 DateGeneration 类

    目录 QuantLib 金融计算--基本组件之 DateGeneration 类 QuantLib 金融计算--基本组件之 DateGeneration 类 许多产品的估值依赖于对未来现金流的分析,因 ...

  7. QuantLib 金融计算——基本组件之 InterestRate 类

    目录 QuantLib 金融计算--基本组件之 InterestRate 类 InterestRate 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. Qua ...

  8. QuantLib 金融计算——基本组件之 ExchangeRateManager 类

    目录 QuantLib 金融计算--基本组件之 ExchangeRateManager 类 概述 Money 类中的汇率转换配置 ExchangeRateManager 函数 如果未做特别说明,文中的 ...

  9. QuantLib 金融计算——基本组件之 Money 类

    目录 QuantLib 金融计算--基本组件之 Money 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Money ...

随机推荐

  1. SSM框架整合的详细过程(含每一步的分析及代码)。实质上是SpringMVC与mybatis的整合,应为spring与SpringMVC不需要整合。

    为了更好的学习 springmvc和mybatis整合开发的方法,需要将springmvc和mybatis进行整合. 整合目标:控制层采用springmvc.持久层使用mybatis实现. 1.1 需 ...

  2. 二叉树中和为某一值的路径 (java)

    问题描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 题解 import java.util.Arra ...

  3. [原创]解读2017 OWASP Top10漏洞体系(含接口安全)

    2017年4月初,OWASP发布了关于Top10的征求意见版. 争议最大的是A7攻击检测与防范不足. 但我主要是按照日常的渗透漏洞进行解读分析的. 解读完毕后,首发t00ls原创文章. https:/ ...

  4. Forms in Angular 2

    Input handling is an important part of application development. The ng-model directive provided in A ...

  5. 统计学中z分布、t分布、F分布及χ^2分布

    Z就是正态分布,X^2分布是一个正态分布的平方,t分布是一个正态分布除以(一个X^2分布除以它的自由度然后开根号),F分布是两个卡方分布分布除以他们各自的自由度再相除 比如X是一个Z分布,Y(n)=X ...

  6. 使用JFinal框架连接数据库,实现注册、登录功能

    使用JFinal框架连接数据库,实现注册.登录功能 1.在Eclipse中新建Dynamic Web project项目 2.导入jfinal-2.2-bin-with-src.jar.c3p0-0. ...

  7. 布局分析002:入门级的CSS导航弹出菜单

    这种弹出菜单非常有意思,也有记录的意义,甚至可以说,掌握了这种弹出菜单,基本上CSS掌握的差不多. 主要涉及下面三个重要知识: CSS的继承性质. relative absolute定位. 子选择符& ...

  8. HTTP请求头和响应头总结

    1)请求(客户端->服务端[request])     GET(请求的方式) /books/java.html(请求的目标资源) HTTP/1.1(请求采用的协议和版本号)     Accept ...

  9. 自己从0开始学习Unity的笔记 IV (C#循环练习输出素数)

    来测试一下循环....刚刚学了while循环,测试一下输出1-100的素数 我想了一下,素数就是只能被1和本身整除,那就是只能被整除2次,我是顺着这个思路写的代码,如果被整除超过2次,那么肯定不是素数 ...

  10. Java--下载历史版本登录账户

    目前在官网下载低于jdk1.8的java jdk的时候需要登陆,这边分享一个账号,方便下载 2696671285@qq.com 密码:Oracle123 转自-- jdk下载以前版本需要的账号(转) ...