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

天数计算规则详解

载入 QuantLib:

import QuantLib as ql

print(ql.__version__)
1.12

定义

  • Interest:一项投资产生的利息。
  • CouponFactor:在付息日支付票息时所需的折算因子,付息周期可以是完整或不完整的。
  • CouponRate:票息率。
  • Date1 (Y1.M1.D1):前一付息日。
  • Date2 (Y2.M2.D2):结算日。
  • Date3 (Y3.M3.D3):后一付息日。
  • Days(StartDate, EndDate):StartDate 和 EndDate 所差的天数(按照儒略历的规则计算)。
  • EOM:EOM 表示只在“月末”付息;非 EOM 表示在每月的同一天付息。
  • Factor:在计算利息时 CouponRate 的折算因子。通常表示为“应计期间的天数 / 所在年份的天数”,如果 Date2 是付息日,Factor 是零。
  • Freq:付息频率
    • 1 = 年付(annual)
    • 2 = 半年付(semi-annual)
    • 4 = 季付(quarterly)
    • 12 = 月付(monthly)
    • 以此类推
  • Principal:本金

利息的计算:

\[Interest = Principal \times CouponRate \times Factor
\]

30 / 360 法

Factor 等于:

\[Factor = \frac{360 \times (Y_2- Y_1) + 30 \times (M_2 - M_1) + (D_2 - D_1)}{360}
\]

CouponFactor 等于:

\[CouponFactor = \frac{360 \times (Y_3 - Y_1) + 30 \times (M_3 - M_1) + (D_3 - D_1)}{360}
\]

这和 Factor 的计算相同,不过要把 Date2 换成 Date3。在这种情形下,如果碰到一个完整的付息周期,那么:

\[CouponFactor = \frac{1}{Freq}
\]

将 Date1 和(或)Date2 调整至月末的习惯各不相同,进而形成了不同的约定,每一种约定都有一套调整方法。

规定一个月有 30 天,一年有 360 天极大的简化了日期计算。同时 360 是一个高度可分的数,半年度、季度和月度的付息频率分别对应 360 天中的 180、90 和 30,这意味着不同付息周期上的付息数量是一样的。

30/360 US

日期调整规则,注意,要严格按照下面的计算顺序:

  • 如果投资是 EOM 的,并且 Date1 是二月的最后一天,并且 Date2 是二月的最后一天,那么 D2 改为 30。
  • 如果投资是 EOM 的,并且 Date1 是二月的最后一天,那么 D1 改为 30。
  • 如果 D2 等于 31 并且 D1 等于 30 或 31,那么 D2 改为 30。
  • 如果 D1 等于 31,那么 D1 改为 30。

别名:

  • 30U/360
  • 30/360

QuantLib 实现:

  • ql.Thirty360(ql.Thirty360.USA)

30/360 Bond Basis

除了前两条外,该方法和 30U/360 一样。注意,要严格按照下面的计算顺序:

  • D1 = MIN (D1, 30).
  • If D1 = 30 Then D2 = MIN (D2,30)

别名:

  • 30A/360

QuantLib 实现:

  • ql.Thirty360(ql.Thirty360.BondBasis)

30E/360

日期调整规则:

  • 如果 D1 等于 31,那么 D1 改为 30。
  • 如果 D2 等于 31,那么 D2 改为 30。

别名:

  • 30/360 ICMA
  • 30S/360
  • Eurobond basis (ISDA 2006)
  • Special German

QuantLib 实现:

  • ql.Thirty360(ql.Thirty360.European)

30E/360 ISDA

日期调整规则:

  • 如果 D1 月末最后一天,那么 D1 改为 30。
  • 如果 D2 月末最后一天(除非 Date2 是到期日并且 M2 是二月),那么 D2 改为 30。

别名:

  • 30E/360 ISDA
  • Eurobond basis (ISDA 2000)
  • German

QuantLib 实现:

  • ql.Thirty360(ql.Thirty360.EurobondBasis)

Actual 法

该方法计算两个日期间的真实距离(遵循儒略历),也就是函数 Days(StartDate, EndDate)。该方法对一个具体的付息周期赋予 CouponRate 不同的折算因子。

Actual/Actual ICMA

公式:

\[Factor = \frac{Days(Date1,Date2)}{Freq \times Days(Date1,Date3)}
\]

对于完整的付息周期,Date2 等于 Date3:

\[Factor = \frac{Days(Date1,Date3)}{Freq \times Days(Date1,Date3)} = \frac{1}{Freq}
\]

对于不完整的付息周期,付息周期要被分解为一个或几个“拟付息周期”以便对应上付息日的频率。利息在每一个子周期上计算,再根据拟付息周期的个数相加得到总的利息。

该方法确保每次所支付的利息是同等的。

该方法同时确保一个付息周期里每一天都被同等赋值。然而付息周期可能有不同的长度,例如某年 365 天,按照半年一次的频率付息,那么一个付息周期是 182 天,另一个是 183 天。在这种情况下,第一个周期里每天被赋予 1/182 份的利息;另一个被赋予 1/183 份的利息。

别名:

  • Actual/Actual
  • Act/Act ICMA
  • ISMA-99
  • Act/Act ISMA

QuantLib 实现:

  • ql.ActualActual(ql.ActualActual.ISMA)

Actual/Actual ISDA

公式:

\[Factor = \frac{\textit{Days not in leap year}}{365} + \frac{\textit{Days in leap year}}{366}
\]

天数计算的规则遵循儒略历的法则,第一天计入付息周期,最后一天不计入。

CouponFactor 的计算使用相同的公式,不过要把 Date2 换成 Date3。通常,不同付息周期内支付的利息是不等量的,这取决于闰年和非闰年上分配的天数。公式可以应用到完整和不完整的付息周期上。

别名:

  • Actual/Actual
  • Act/Act
  • Actual/365
  • Act/365

QuantLib 实现:

  • ql.ActualActual(ql.ActualActual.ISDA)

Actual/365 Fixed

公式:

\[Factor = \frac{Days(Date1,Date2)}{365}
\]

每个月都不作特殊对待,并且假定一年只有 365 天。例如,一个周期始于 2005-02-01,结束于 2005-04-01,那么 Factor 等于 59 天 除以 365 天。

CouponFactor 使用相同的公式,不过要把 Date2 换成 Date3。通常,不同付息周期内支付的利息是不等量的,这取决于作为分子的天数。公式可以应用到完整和不完整的付息周期上。

别名:

  • Act/365 Fixed
  • A/365 Fixed
  • A/365F
  • English

QuantLib 实现:

  • ql.Actual365Fixed(ql.Actual365Fixed.Standard)

Actual/360

公式:

\[Factor = \frac{Days(Date1,Date2)}{360}
\]

该方法用于货币市场上的短期借贷。每个月都不作特殊对待,并且假定一年只有 360 天。例如,一个周期始于 2005-02-01,结束于 2005-04-01,那么 Factor 等于 59 天 除以 360 天。

CouponFactor 使用相同的公式,不过要把 Date2 换成 Date3。通常,不同付息周期内支付的利息是不等量的,这取决于作为分子的天数。公式可以应用到完整和不完整的付息周期上。

别名:

  • Act/360
  • A/360
  • French

QuantLib 实现:

  • ql.Actual360()

Actual/364

公式:

\[Factor = \frac{Days(Date1,Date2)}{364}
\]

每个月都不作特殊对待,并且假定一年只有 364 天。例如,一个周期始于 2005-02-01,结束于 2005-04-01,那么 Factor 等于 59 天 除以 364 天。

CouponFactor 使用相同的公式,不过要把 Date2 换成 Date3。通常,不同付息周期内支付的利息是不等量的,这取决于作为分子的天数。公式可以应用到完整和不完整的付息周期上。

QuantLib 实现:

  • 没有实现

Actual/365L

这里,L 表示闰年。

公式:

\[Factor = \frac{Days(Date1,Date2)}{DiY}
\]

确定 \(DiY\) 的规则:

  • 如果 Freq 等于 1(年付):

    • 如果 2 月 29 日在 Date1(排除在区间外)和 Date2(包含在区间内)之间,那么 \(DiY = 366\),否则 \(DiY = 365\)。
  • 如果 Freq 不等于 1:
    • 如果 Date2 落在闰年,那么 \(DiY = 366\),否则 \(DiY = 365\)。

CouponFactor 使用相同的公式,不过要把 Date2 换成 Date3。通常,不同付息周期内支付的利息是不等量的,这取决于作为分子的天数。公式可以应用到完整和不完整的付息周期上。

别名:

  • ISMA-Year

QuantLib 实现:

  • 没有实现

Actual/Actual AFB

公式:

\[Factor = \frac{Days(Date1,Date2)}{DiY}
\]

\(DiY\) 的确定:

如果 2 月 29 日在 Date1(排除在区间外)和 Date2(包含在区间内)之间,那么 \(DiY = 366\),否则 \(DiY = 365\)。

如果 Date1 到 Date2 超过一年,计算将分成两部分:

  • 计算经历的整年的个数,从周期的最后一天向前计算;
  • 剩下的部分按照前述的规则计算。

例如,一个周期始于 1994-02-10 至 1997-06-30,分解如下:

  • 1994-06-30 到 1997-06-30 经历了 3 年;
  • 1994-02-10 到 1994-06-30 对应 140/365。

最终结果是 3 + 140/365.

该方法并没有规定向前推算年数的方法。ISDA 的推算法要求:如果周期最后一天是 2 月 28 日,完整的一年要截止到前一个 2 月 28 日,除非 2 月 29 日存在,如果存在 2 月 29 日也要计入在内。下面的表格举例显示了 ISDA 的推算法和一般推算习惯的异同:

周期 ISDA 推算法 一般推算习惯
2004-02-28 至 2008-02-27 3 + 365 / 366 3 + 365 / 366
2004-02-28 至 2008-02-28 4 + 1 / 366 4
2004-02-28 至 2008-02-29 4 + 1 / 366 4 + 1 / 366

QuantLib 实现:

  • ql.ActualActual(ql.ActualActual.AFB)

1/1

该方法用于通胀挂钩产品,以 4 年为一个周期,将额外的一天平均分配到 4 年上,即每年 365.25 天。

QuantLib 实现:

  • ql.OneDayCounter()

QuantLib 金融计算——基本组件之天数计算规则详解的更多相关文章

  1. 转载 JS组件Bootstrap Select2使用方法详解

    JS组件Bootstrap Select2使用方法详解 作者:懒得安分 字体:[增加 减小] 类型:转载 时间:2016-01-26我要评论 这篇文章主要为大家介绍了JS组件Bootstrap Sel ...

  2. Android UI组件----AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...

  3. iOS 计算某个月的天数 计算某天的星期

    // 某年某月的天数 - (NSInteger)dayCount:(NSInteger)years { NSInteger count = ; ; i <= ; i++) { == i) { = ...

  4. php计算多个集合的笛卡尔积实例详解

    笛卡尔积 笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员. 假设集合A ...

  5. 基于移动端Reactive Native轮播组件的应用与开发详解

    总结下这段时间学习reactive native的一些东西,我们来认识一下,被炒得这么火的rn,究竟是个什么东西,以及如何去搭建自己的demo. reactive  native是什么 由facebo ...

  6. Android UI组件----ListView列表控件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  7. Spring组件扫描<context:component-scan/>使用详解

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

  8. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解

    背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...

  9. Android四大组件之---activity生命周期详解

    废话不多说, 先来一张Google提供的一张经典的生命周期流程图: 有的朋友可能看英文的有点费劲,再提供一张中文版的  O(∩_∩)O 相信已经很多人对这张图再熟悉不过了,下面笔者按照自己的理解并结合 ...

随机推荐

  1. 手动制作CA证书

    一.安装 CFSSL 证书下载官方地址:https://pkg.cfssl.org #下面三个安装包,无需下载,之前百度云中的压缩包中都有[root@linux-node1 ~]# cd /usr/l ...

  2. c语言字符串指针

    最近正在看c语言,在指针这块遇到了麻烦,特别是字符串指针这块,简单记录下. 字符串指针 void main() { char *p = "tasklist"; printf(&qu ...

  3. Zookeeper 源码(三)Zookeeper 客户端源码

    Zookeeper 源码(三)Zookeeper 客户端源码 Zookeeper 客户端主要有以下几个重要的组件.客户端会话创建可以分为三个阶段:一是初始化阶段.二是会话创建阶段.三是响应处理阶段. ...

  4. Oracle GoldenGate 二、配置和使用

    Oracle GoldenGate 二.配置和使用 配置和使用GoldenGate的步骤 1 在源端和目标端配置数据库支持GoldenGate 2 在源端和目标端创建和配置GoldenGate实例 3 ...

  5. KbmMW 4.40.00 测试发布

    经过漫长的等待,支持移动开发的kbmmw 4.40.00 终于发布了,这次不但支持各个平台的开发, 而且增加了认证管理器等很多新特性,非常值得升级.具体见下表. 4.40.00 BETA 1 Oct ...

  6. T31P电子秤数据读取

    连接串口后先发送"CP\r\n"激活电子秤数据发送,收到的数据包是17字节的 using System; using System.Collections.Generic; usi ...

  7. join sql图

    SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name   id  name       id   name --  - ...

  8. python使用smtplib和email发送腾讯企业邮箱邮件

    公司每天要发送日报,最近没事搞了一下如何自动发邮件,用的是腾讯企业邮箱,跟大家分享一下我的研究过程吧. 以前弄的发邮件的是用qq邮箱发的,当时在网上查资料最后达到了能发图片,网页,自定义收件人展示,主 ...

  9. CYUSB3014固件部分低版本工程在Eclipse中编译得到img文件时无效的解决方案

    最近在做基于我们AC6102开发板的UVC图像视频方案,下载了官方的an75779应用工程,但是倒入到FX3—SDK自带的Eclipse中后,却无法编译生成img文件,经过比对后确认是生成该文件的命令 ...

  10. poj2115 Looooops 扩展欧几里德的应用

    好开心又做出一道,看样子做数论一定要先看书,认认真真仔仔细细的看一下各种重要的性质 及其用途,然后第一次接触的题目 边想边看别人的怎么做的,这样做出第一道题目后,后面的题目就完全可以自己思考啦 设要+ ...