zoukankan      html  css  js  c++  java
  • QuantLib 金融计算——基本组件之天数计算规则详解

    如果未做特别说明,文中的程序都是 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 imes CouponRate imes Factor ]

    30 / 360 法

    Factor 等于:

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

    CouponFactor 等于:

    [CouponFactor = frac{360 imes (Y_3 - Y_1) + 30 imes (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 imes Days(Date1,Date3)} ]

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

    [Factor = frac{Days(Date1,Date3)}{Freq imes 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{ extit{Days not in leap year}}{365} + frac{ extit{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()
  • 相关阅读:
    @Configuration和@Component区别
    ElasticSearch中text和keyword类型的区别
    Elasticsearch实战篇——Spring Boot整合ElasticSearch
    Elasticsearch入门篇——基础知识2
    学习Elasticsea从零学Elasticsearch系列——基础概念rch系列——(1)基础概念
    开发工具:IDEA类和方法注释模板设置(非常详细)
    项目中时间的处理,到最后的数据库
    详细刨析---电商系统之订单系统设计
    记录一下自己用springboot整合阿里巴巴开源的EasyExcel实现导入导出功能
    Springboot整合easyExcel导入导出Excel
  • 原文地址:https://www.cnblogs.com/xuruilong100/p/8995217.html
Copyright © 2011-2022 走看看