QuantLib 金融计算——收益率曲线之构建曲线(1)

如果未做特别说明,文中的程序都是 Python3 代码。

QuantLib 金融计算——收益率曲线之构建曲线(1)

理论和实践上有多种方法可以构建与市场一致的收益率曲线,背后的方法论取决于市场上的可获得金融工具的流动性。在构建收益率曲线时有两个选项必须选定好:插值方法和所选的金融工具或数据。

quantlib-python 允许构建下列两大类收益率曲线:

  • 第一类,根据数值和对应日期构建:
    • DiscountCurve,根据贴现因子构建
    • 若干 *ZeroCurve 型的收益率曲线,根据债券零息收益率构建(前缀表示具体的构建方法)
    • ForwardCurve,根据远期收益率构建
  • 第二类,根据若干固定收益类对象(如 FixedRateBond)构建:
    • FittedBondDiscountCurve,根据若干债券的价格构建
    • 若干 Piecewise** 型的收益率曲线,根据若干不同类型金融工具(存款收益率、收益率远期合约和互换等等)的报价分段构建(后缀表示具体的构建方法和曲线类型)

本文介绍第一种。

载入 QuantLib:

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。这种构造方法适用于给定的一组贴现因子,并为其分配给相应的期限。

DiscountCurve 对象的构造

构造函数具有以下实现

DiscountCurve(dates,
              dfs,
              dayCounter,
              cal)

这些变量的类型和解释如下:

  • dates:日期序列,贴现因子对应的到期日。注意:第一个日期必须是贴现曲线的基准日期,例如贴现因子是 1.0 的日期。
  • dfs:浮点数序列,贴现因子
  • dayCounterDayCounter 对象,天数计算规则
  • calCalendar 对象,日历表

DiscountCurve 常用的成员函数均继承自基类 YieldTermStructure

在下面的例子中,根据历史上某天路透社公布的贴现因子报价构建收益率曲线。在收益率曲线构建之后,求给定日期的等价零息收益率、贴现因子和远期收益率。

EURYieldDiscount
TN0.31480.9999656
1w0.30830.9999072
1M0.42250.9996074
2M0.54430.9990040
3M0.72420.9981237
6M0.96140.9951358
9M0.93720.9929456
1Y1.00060.9899849
1Y3M1.11200.9861596
1Y6M1.24570.9815178
1Y9M1.43580.9752363
2Y1.62630.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 日货币网公布的即期国债收盘收益率数据构建曲线。在收益率曲线构建之后,求给定日期的等价零息收益率、贴现因子和远期收益率。

期限即期收益率
13.0544
23.1565
33.2531
43.2744
53.2964
63.4092
73.5237
83.5264
93.5298
103.5337
153.8517
203.8884
304.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

转载于:https://www.cnblogs.com/xuruilong100/p/9521018.html

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值