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 \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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM