QuantLib 金融計算——收益率曲線之構建曲線(1)

若是未作特別說明,文中的程序都是 Python3 代碼。app

QuantLib 金融計算——收益率曲線之構建曲線(1)

理論和實踐上有多種方法能夠構建與市場一致的收益率曲線,背後的方法論取決於市場上的可得到金融工具的流動性。在構建收益率曲線時有兩個選項必須選定好:插值方法和所選的金融工具或數據。函數

quantlib-python 容許構建下列兩大類收益率曲線:工具

  • 第一類,根據數值和對應日期構建:
    • DiscountCurve,根據貼現因子構建
    • 若干 *ZeroCurve 型的收益率曲線,根據債券零息收益率構建(前綴表示具體的構建方法)
    • ForwardCurve,根據遠期收益率構建
  • 第二類,根據若干固定收益類對象(如 FixedRateBond)構建:
    • FittedBondDiscountCurve,根據若干債券的價格構建
    • 若干 Piecewise** 型的收益率曲線,根據若干不一樣類型金融工具(存款收益率、收益率遠期合約和互換等等)的報價分段構建(後綴表示具體的構建方法和曲線類型)

本文介紹第一種。rest

載入 QuantLib:code

import QuantLib as ql

print(ql.__version__)
1.12

YieldTermStructure

事實上,全部上述類都派生自基類 YieldTermStructure,該基類實現了一些經常使用的功能。例如,實現了返回基準日期、天數計算規則、日曆的函數,以及返回收益率的最小或最大日期的函數。對象

YieldTermStructure 經常使用的成員函數:繼承

  • discount(d, extrapolate = False):浮點數,dDate 對象, extrapolate 是布爾型。返回貼現因子大小。
  • zeroRate(d, resultDayCounter, comp, freq = Annual, extrapolate = False)InterestRatedDate 對象,resultDayCounterDayCounter 對象,compfreq 是預置整數,extrapolate 是布爾型。返回等價的零息收益率對象。
  • forwardRate(d1, d2, dc, comp, freq = Annual, extrapolate = false)InterestRated1d2Date 對象,resultDayCounterDayCounter 對象,compfreq 是 quantlib-python 預置整數(表示付息方式和頻率),extrapolate 是布爾型。返回 d1d2 之間的遠期收益率對象。

DiscountCurve

首先介紹 DiscountCurve。這種構造方法適用於給定的一組貼現因子,併爲其分配給相應的期限。it

DiscountCurve 對象的構造

構造函數具備如下實現io

DiscountCurve(dates,
              dfs,
              dayCounter,
              cal)

這些變量的類型和解釋以下:

  • dates:日期序列,貼現因子對應的到期日。注意:第一個日期必須是貼現曲線的基準日期,例如貼現因子是 1.0 的日期。
  • dfs:浮點數序列,貼現因子
  • dayCounterDayCounter 對象,天數計算規則
  • calCalendar 對象,日曆表

DiscountCurve 經常使用的成員函數均繼承自基類 YieldTermStructure

在下面的例子中,根據歷史上某天路透社公佈的貼現因子報價構建收益率曲線。在收益率曲線構建以後,求給定日期的等價零息收益率、貼現因子和遠期收益率。

EUR Yield Discount
TN 0.3148 0.9999656
1w 0.3083 0.9999072
1M 0.4225 0.9996074
2M 0.5443 0.9990040
3M 0.7242 0.9981237
6M 0.9614 0.9951358
9M 0.9372 0.9929456
1Y 1.0006 0.9899849
1Y3M 1.1120 0.9861596
1Y6M 1.2457 0.9815178
1Y9M 1.4358 0.9752363
2Y 1.6263 0.9680804

例子 1:

def testingYields1():
    dates = []
    dfs = []

    cal = ql.UnitedStates()
    today = ql.Date(11, ql.September, 2009)
    libor = ql.EURLibor1M()
    dc = libor.dayCounter()

    settlementDays = 2
    settlement = cal.advance(
        today, settlementDays, ql.Days)

    dates.append(settlement)
    dates.append(settlement + ql.Period(1, ql.Days))
    dates.append(settlement + ql.Period(1, ql.Weeks))
    dates.append(settlement + ql.Period(1, ql.Months))
    dates.append(settlement + ql.Period(2, ql.Months))
    dates.append(settlement + ql.Period(3, ql.Months))
    dates.append(settlement + ql.Period(6, ql.Months))
    dates.append(settlement + ql.Period(9, ql.Months))
    dates.append(settlement + ql.Period(1, ql.Years))
    dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(3, ql.Months))
    dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(6, ql.Months))
    dates.append(settlement + ql.Period(1, ql.Years) + ql.Period(9, ql.Months))
    dates.append(settlement + ql.Period(2, ql.Years))

    dfs.append(1.0)
    dfs.append(0.9999656)
    dfs.append(0.9999072)
    dfs.append(0.9996074)
    dfs.append(0.9990040)
    dfs.append(0.9981237)
    dfs.append(0.9951358)
    dfs.append(0.9929456)
    dfs.append(0.9899849)
    dfs.append(0.9861596)
    dfs.append(0.9815178)
    dfs.append(0.9752363)
    dfs.append(0.9680804)

    tmpDate1 = settlement + ql.Period(1, ql.Years) + ql.Period(3, ql.Months)
    tmpDate2 = tmpDate1 + ql.Period(3, ql.Months)
    curve = ql.DiscountCurve(
        dates, dfs, dc, cal)

    equ_zero = curve.zeroRate(
            tmpDate1, dc, ql.Simple, ql.Annual)

    print(
        "等價 Zero Rate:",
        equ_zero)
    print(
        "等價 Zero Rate 計算的貼現因子:",
        equ_zero.discountFactor(
            settlement, tmpDate1))
    print(
        "真實 Discount Factor:",
        curve.discount(tmpDate1))
    print(
        "1Y3M-1Y6M 間的遠期收益率 Fwd Rate:",
        curve.forwardRate(
            tmpDate1, tmpDate2, dc, ql.Continuous))


testingYields1()

輸出以下所示:

等價零息收益率: 1.107998 % Actual/360 simple compounding
等價零息收益率計算的貼現因子: 0.9861595999999999
真實貼現因子: 0.9861596
1Y3M-1Y6M 間的遠期收益率: 1.887223 % Actual/360 continuous compounding

ZeroCurve

下面介紹 ZeroCurve。這種構造方法適用於給定的一組零息收益率,併爲其分配給相應的期限。

ZeroCurve 對象的構造

構造函數具備如下實現

ZeroCurve(dates,
          yields,
          dayCounter,
          cal,
          i,
          comp,
          freq)

這些變量的類型和解釋以下:

  • dates:日期序列,零息收益率對應的到期日。注意:第一個日期必須是曲線的基準日期,例如收益率是 0.0 的日期。
  • yields:浮點數序列,零息收益率
  • dayCounterDayCounter 對象,天數計算規則
  • calCalendar 對象,日曆表
  • iLinear 對象,線性插值方法
  • compfreq 是預置整數,表示付息方式和頻率

ZeroCurve 經常使用的成員函數均繼承自基類 YieldTermStructure

在下面的例子中,根據 2018 年 7 月 23 日貨幣網公佈的即期國債收盤收益率數據構建曲線。在收益率曲線構建以後,求給定日期的等價零息收益率、貼現因子和遠期收益率。

期限 即期收益率
1 3.0544
2 3.1565
3 3.2531
4 3.2744
5 3.2964
6 3.4092
7 3.5237
8 3.5264
9 3.5298
10 3.5337
15 3.8517
20 3.8884
30 4.0943

例子 2:

def testingYields2():
    dates = []
    dfs = []

    cal = ql.China(ql.China.IB)
    today = ql.Date(23, ql.July, 2018)
    dc = ql.ActualActual(ql.ActualActual.ISMA)

    settlementDays = 0
    settlement = cal.advance(
        today, settlementDays, ql.Days)

    dates.append(settlement)
    dates.append(settlement + ql.Period(1, ql.Years))
    dates.append(settlement + ql.Period(2, ql.Years))
    dates.append(settlement + ql.Period(3, ql.Years))
    dates.append(settlement + ql.Period(4, ql.Years))
    dates.append(settlement + ql.Period(5, ql.Years))
    dates.append(settlement + ql.Period(6, ql.Years))
    dates.append(settlement + ql.Period(7, ql.Years))
    dates.append(settlement + ql.Period(8, ql.Years))
    dates.append(settlement + ql.Period(9, ql.Years))
    dates.append(settlement + ql.Period(10, ql.Years))
    dates.append(settlement + ql.Period(15, ql.Years))
    dates.append(settlement + ql.Period(20, ql.Years))
    dates.append(settlement + ql.Period(30, ql.Years))

    dfs.append(0.0000 / 100.0)
    dfs.append(3.0544 / 100.0)
    dfs.append(3.1565 / 100.0)
    dfs.append(3.2531 / 100.0)
    dfs.append(3.2744 / 100.0)
    dfs.append(3.2964 / 100.0)
    dfs.append(3.4092 / 100.0)
    dfs.append(3.5237 / 100.0)
    dfs.append(3.5264 / 100.0)
    dfs.append(3.5298 / 100.0)
    dfs.append(3.5337 / 100.0)
    dfs.append(3.8517 / 100.0)
    dfs.append(3.8884 / 100.0)
    dfs.append(4.0943 / 100.0)

    tmpDate1 = settlement + ql.Period(7, ql.Years)
    tmpDate2 = settlement + ql.Period(8, ql.Years)
    curve = ql.ZeroCurve(
        dates, dfs, dc, cal, ql.Linear(), ql.Compounded, ql.Annual)

    print(
        "零息收益率:",
        curve.zeroRate(
            tmpDate2, dc, ql.Compounded, ql.Annual))
    print(
        "貼現因子:",
        curve.discount(tmpDate2))

    print(
        "7Y - 8Y 遠期收益率:",
        curve.forwardRate(
            tmpDate1, tmpDate2, dc, ql.Compounded, ql.Annual))

輸出以下所示:

零息收益率: 3.526400 % Actual/Actual (ISMA) Annual compounding
貼現因子: 0.7578636936087101
7Y - 8Y 遠期收益率: 3.545302 % Actual/Actual (ISMA) Annual compounding
相關文章
相關標籤/搜索