目錄python
若是未作特別說明,文中的程序都是 Python3 代碼。app
理論和實踐上有多種方法能夠構建與市場一致的收益率曲線,背後的方法論取決於市場上的可得到金融工具的流動性。在構建收益率曲線時有兩個選項必須選定好:插值方法和所選的金融工具或數據。函數
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)
:浮點數,d
是 Date
對象, extrapolate
是布爾型。返回貼現因子大小。zeroRate(d, resultDayCounter, comp, freq = Annual, extrapolate = False)
:InterestRate
,d
是 Date
對象,resultDayCounter
是 DayCounter
對象,comp
和 freq
是預置整數,extrapolate
是布爾型。返回等價的零息收益率對象。forwardRate(d1, d2, dc, comp, freq = Annual, extrapolate = false)
:InterestRate
,d1
和 d2
是 Date
對象,resultDayCounter
是 DayCounter
對象,comp
和 freq
是 quantlib-python 預置整數(表示付息方式和頻率),extrapolate
是布爾型。返回 d1
和 d2
之間的遠期收益率對象。DiscountCurve
首先介紹 DiscountCurve
。這種構造方法適用於給定的一組貼現因子,併爲其分配給相應的期限。it
DiscountCurve
對象的構造構造函數具備如下實現io
DiscountCurve(dates, dfs, dayCounter, cal)
這些變量的類型和解釋以下:
dates
:日期序列,貼現因子對應的到期日。注意:第一個日期必須是貼現曲線的基準日期,例如貼現因子是 1.0 的日期。dfs
:浮點數序列,貼現因子dayCounter
:DayCounter
對象,天數計算規則cal
:Calendar
對象,日曆表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
:浮點數序列,零息收益率dayCounter
:DayCounter
對象,天數計算規則cal
:Calendar
對象,日曆表i
:Linear
對象,線性插值方法comp
和 freq
是預置整數,表示付息方式和頻率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