QuantLib 金融计算——基本组件之 Calendar 类
如果未做特别说明,文中的程序都是 Python3 代码。
QuantLib 金融计算——基本组件之 Calendar 类
针对相应国家编制一套日历表用来推算假期、工作日和周末,这对于金融实务来说是一件基础又非常重要的事。
载入 QuantLib:
import QuantLib as ql
print(ql.__version__)
1.10
Calendar 对象的构造
在 QuantLib 中可以很轻松的构造特定国家的日历表。例如,通过 myCal = UnitedKingdom() 构造英国的日历表,其他国家诸如美国、日本、加拿大等等也可以用类似的方式构造。在有些国家,不同的市场遵循不同的日历表,例如在中国,银行间市场和交易所市场遵循的日历表是不一样的(交易所市场在周六周日一定不开放,不管是否调休)。对于这一问题,可以通过配置特定参数将日历表细化到具体的市场上,例如中国银行间市场的日历表可以通过 myCal = China(China.IB) 构造。China.IB 和 China.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):计算日期from和to之间的工作日个数(是否包括首尾日期)。
例子 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 类的更多相关文章
- QuantLib 金融计算——基本组件之 Schedule 类
目录 QuantLib 金融计算--基本组件之 Schedule 类 Schedule 对象的构造 作为"容器"的 Schedule 对象 一些常用的成员函数 如果未做特别说明,文 ...
- QuantLib 金融计算——基本组件之 Index 类
目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...
- QuantLib 金融计算——基本组件之 Currency 类
目录 QuantLib 金融计算--基本组件之 Currency 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Cu ...
- QuantLib 金融计算——基本组件之 Date 类
目录 QuantLib 金融计算--基本组件之 Date 类 Date 对象的构造 一些常用的成员函数 一些常用的静态函数 为估值计算配置日期 如果未做特别说明,文中的程序都是 Python3 代码. ...
- QuantLib 金融计算——基本组件之 DayCounter 类
目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...
- QuantLib 金融计算——基本组件之 DateGeneration 类
目录 QuantLib 金融计算--基本组件之 DateGeneration 类 QuantLib 金融计算--基本组件之 DateGeneration 类 许多产品的估值依赖于对未来现金流的分析,因 ...
- QuantLib 金融计算——基本组件之 InterestRate 类
目录 QuantLib 金融计算--基本组件之 InterestRate 类 InterestRate 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. Qua ...
- QuantLib 金融计算——基本组件之 ExchangeRateManager 类
目录 QuantLib 金融计算--基本组件之 ExchangeRateManager 类 概述 Money 类中的汇率转换配置 ExchangeRateManager 函数 如果未做特别说明,文中的 ...
- QuantLib 金融计算——基本组件之 Money 类
目录 QuantLib 金融计算--基本组件之 Money 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Money ...
随机推荐
- php防止会话固定攻击
问题:希望确保应用不会受到会话固定攻击,即攻击者强制用户使用一个预定义的会话id. 解决方案:要求使用会话cookie但会话标识符不追加到URL,另外要频繁地生成新会话ID: <?php ini ...
- JS Code Snippet --- Cookie
<a id="quitBtn" href="#" class="exit">Exit</a> <a id=&q ...
- golang之流程控制(注意点)
Go在流程控制方面特点如下: 没有do和while循环,只有一个广义的for语句 switch语句灵活多变,还可以用于类型判断 if语句和switch语句都可以包含一条初始化子语句 break语句和c ...
- JavaScript 分号使用总结
没有应该不应该,只有你自己喜欢不喜欢.JavaScript 语法长得 C-like 不代表它本质上和 C 是一类语言,所有直觉性的 "当然应该加分号" 都是保守的.未经深入思考的草 ...
- java可视化
1.java关闭窗口代码. ft.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); IE打开 Weiler-Atherton任意多边形裁剪 http:/ ...
- Mac下eclipse 启动时出现An error has occurred. See the log file的问题
eclipse原来可以使用的好好的,装了多个版本的jdk后,打开eclipse出现An error has occurred. See the log file的问题,经过查找,可能原因之一是机子装了 ...
- Hdu3549 Flow Problem 2017-02-11 16:24 58人阅读 评论(0) 收藏
Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a ...
- 大数据项目中js中代码和java中代码(解决Tomcat打印日志中文乱码)
Idea2018中集成Tomcat9导致OutPut乱码找到tomcat的安装目录,打开logging.properties文件,增加一行代码,覆盖默认设置,将日志编码格式修改为GBK.java.ut ...
- nancy中的身份验证
在nancy中,身份验证分为basic ,form ,token,stateless几种,basic和form这里不说了,其中如果是使用cookie来保存身份的, 需要注意的是:cookie有大小的限 ...
- MSSQL中通过关键字查找所有存储过程
select b.namefrom 数据库名.dbo.syscomments a, 数据库名.dbo.sysobjects bwhere a.id=b.id and b.xtype='p' and a ...