1. 程式人生 > >QuantLib 金融計算——基本組件之 Date 類

QuantLib 金融計算——基本組件之 Date 類

月份 間隔 構造 str alua 成員函數 eval send 移動

QuantLib 金融計算——基本組件之 Date 類

QuantLib 將金融領域的日期對象抽象為 Date 類,並提供了豐富的計算函數。需要註意的是,quantlib-python 中的 Date 類並不同於 python 自身包含的 datetime 類,也沒有繼承關系。

載入 QuantLib:

import QuantLib as ql

print(ql.__version__)
1.10

Date 對象的構造

Date 對象的構造方式有兩種,分別是

  • Date(serialNumber),其中 serialNumber 是一個整數,例如 24214,並且 1 對應 1899-12-31。這種用法和 Excel 中一樣。(需要註意的是,在較新版本的 quantlib-python 中,serialNumber
    的取值範圍被限定在 367~109574,相應的日期範圍是 1901-01-01 ~ 2199-12-31。)
  • Date(d, m, y),其中 dy 是整數;m 是 quantlib-python 中預留的特殊對象,專門用來表示月份:
    • 一月:January(等於 1)
    • ...
    • 十二月:December(等於 12)

Date 對象可以和整數做運算,用來向前或向後移動特定天數;Date 對象也可以和 Period 對象做運算,用來向前或向後移動特定的時間間隔。

Period 對象的構造:

  • Period(n, units),其中 n 是時間間隔的個數;units 的取值範圍是 quantlib-python 預留的四個特殊對象:Days
    WeeksMonthsYears

例子 1:

def DateTesting1():

    myDate = ql.Date(12, ql.August, 2009)
    print(myDate)

    myDate = myDate + 1
    print(myDate)

    myDate = myDate + ql.Period(12, ql.Days)
    print(myDate)

    myDate = myDate - ql.Period(2, ql.Months)
    print(myDate)

    myDate = myDate - 1
    print(myDate)

    myDate = myDate + ql.Period(10, ql.Weeks)
    print(myDate)
August 12th, 2009
August 13th, 2009
August 25th, 2009
June 25th, 2009
June 24th, 2009
September 2nd, 2009

一些常用的成員函數

Date 類常用的成員函數有:

  • weekday():整數,返回星期對應的數字:
    • 星期日:1
    • ...
    • 星期六:7
  • dayOfMonth():整數,返回日期是所在月份的第幾天
  • dayOfYear():整數,返回日期是所在年份的第幾天
  • month():整數,返回日期對應的月份
  • year():整數,返回日期對應的年份
  • serialNumber()整數,返回日期對應的天數(從 1899-12-31 開始)

例子 2:

def DateTesting2():
    myDate = ql.Date(12, ql.August, 2017)

    print(‘Original Date :‘, myDate)
    print(‘Weekday :‘, myDate.weekday())
    print(‘Day of Month :‘, myDate.dayOfMonth())
    print(‘Day of Year :‘, myDate.dayOfYear())
    print(‘Month :‘, myDate.month())
    print(‘Year :‘, myDate.year())

    serialNum = myDate.serialNumber()

    print(‘Serial Number :‘, serialNum)
Original Date : August 12th, 2017
Weekday : 7
Day of Month : 12
Day of Year : 224
Month : 8
Year : 2017
Serial Number : 42959

一些常用的靜態函數

Date 類也提供了一些有用的靜態函數,例如用來判斷是否閏年或者是否是月末。一些常用的靜態函數如下:

  • Date.todaysDate()Date 對象,返回系統當前的日期
  • Date.minDate()Date 對象,返回 QuantLib 可表示的最小日期
  • Date.maxDate()Date 對象,返回 QuantLib 可表示的最大日期
  • Date.isLeap(y):布爾值,判斷 y 是否閏年
  • Date.endOfMonth(d)Date 對象,返回日期 d 所在月份月末對應的日期
  • Date.isEndOfMonth(d):布爾值,判斷 d 是否月末
  • Date.nextWeekday(d, w)Date 對象,返回日期 d 之後首個星期 w 對應的日期(例如 2018-03-12 之後第一個星期五)
  • Date.nthWeekday(n, w, m, y)Date 對象,返回所給月份 m 和年份 y 中的第 n 個星期 w 對應的日期(例如 2010 年七月的第三個星期三)

例子 3:

def DateTesting3():
    print(‘Today :‘, ql.Date.todaysDate())
    print(‘Min Date :‘, ql.Date.minDate())
    print(‘Max Date :‘, ql.Date.maxDate())
    print(‘Is Leap :‘, ql.Date.isLeap(2011))
    print(‘End of Month :‘,
          ql.Date.endOfMonth(ql.Date(4, ql.August, 2009)))
    print(‘Is Month End :‘,
          ql.Date.isEndOfMonth(ql.Date(29, ql.September, 2009)))
    print(‘Is Month End :‘,
          ql.Date.isEndOfMonth(ql.Date(30, ql.September, 2009)))
    print(‘Next WD :‘,
          ql.Date.nextWeekday(ql.Date(1, ql.September, 2009), ql.Friday))
    print(‘n-th WD :‘,
          ql.Date.nthWeekday(3, ql.Wednesday, ql.September, 2009))
Today : March 30th, 2018
Min Date : January 1st, 1901
Max Date : December 31st, 2199
Is Leap : False
End of Month : August 31st, 2009
Is Month End : False
Is Month End : True
Next WD : September 4th, 2009
n-th WD : September 16th, 2009

為估值計算配置日期

有時候為了給金融產品定價,需要將估值計算發生的日期配置成特定日期。該金融產品可能依賴於其他產品,其他產品又在新的日期做定價。為了方便日期配置,QuantLib 提供了一個全局變量用來配置估值日期。Settings.instance().evaluationDate 返回的就是當前的估值日期,這一日期是可配置的。

例子 4:

def DateTesting4():
    d = ql.Settings.instance().evaluationDate
    print(‘Eval Date :‘, d)

    ql.Settings.instance().evaluationDate = ql.Date(5, ql.January, 1995)
    d = ql.Settings.instance().evaluationDate
    print(‘New Eval Date :‘, d)
Eval Date : March 30th, 2018
New Eval Date : January 5th, 1995

QuantLib 金融計算——基本組件之 Date 類