QuantLib 金融计算——利率曲线之构建曲线(1)
介绍用 QuantLib 中利率曲线对象的构造和使用。
由于版本问题,代码可能与最新版不兼容。
QuantLib 金融计算——利率曲线之构建曲线(1)
概述
理论和实践上有多种方法可以构建与市场一致的利率曲线,背后的方法论取决于市场上的可获得金融工具的流动性。在构建利率曲线时有两个选项必须选定好:插值方法和所选的金融工具或数据。
quantlib-python 允许构建下列两大类利率曲线:
- 第一类,根据数值和对应日期构建:
DiscountCurve
,根据贴现因子构建- 若干
*ZeroCurve
型的利率曲线,根据债券零息利率构建(前缀表示具体的构建方法) ForwardCurve
,根据远期利率构建
- 第二类,根据若干固定收益类对象(如
FixedRateBond
)构建:FittedBondDiscountCurve
,根据若干债券的价格构建- 若干
Piecewise**
型的利率曲线,根据若干不同类型金融工具(存款利率、利率远期合约和互换等等)的报价分段构建(后缀表示具体的构建方法和曲线类型)
本文介绍第一种。
载入 QuantLib:
1
2
3
import QuantLib as ql
print(ql.__version__)
1
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
。这种构造方法适用于给定的一组贴现因子,并为其分配给相应的期限。
DiscountCurve
对象的构造
构造函数具有以下实现
1
2
3
4
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
2
3
4
等价零息利率: 1.107998 % Actual/360 simple compounding
等价零息利率计算的贴现因子: 0.9861595999999999
真实贴现因子: 0.9861596
1Y3M-1Y6M 间的远期利率: 1.887223 % Actual/360 continuous compounding
ZeroCurve
下面介绍 ZeroCurve
。这种构造方法适用于给定的一组零息利率,并为其分配给相应的期限。
ZeroCurve
对象的构造
构造函数具有以下实现
1
2
3
4
5
6
7
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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))
输出如下所示:
1
2
3
零息利率: 3.526400 % Actual/Actual (ISMA) Annual compounding
贴现因子: 0.7578636936087101
7Y - 8Y 远期利率: 3.545302 % Actual/Actual (ISMA) Annual compounding
本文由作者按照 CC BY 4.0 进行授权