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

目录

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

    • YieldTermStructure
    • DiscountCurve
      • DiscountCurve 对象的构造
    • ZeroCurve
      • ZeroCurve 对象的构造

如果未做特别说明,文中的程序都是 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

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

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

原文地址:https://www.cnblogs.com/xuruilong100/p/9521018.html

时间: 2024-08-29 08:22:52

QuantLib 金融计算——收益率曲线之构建曲线(1)的相关文章

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

目录 QuantLib 金融计算--收益率曲线之构建曲线(2) YieldTermStructure 问题描述 Piecewise** 分段收益率曲线的原理 Piecewise** 对象的构造 FittedBondDiscountCurve FittedBondDiscountCurve 的原理 FittedBondDiscountCurve 的构造 FittingMethod 类 拟合曲线 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--收益率曲线之构建

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

目录 QuantLib 金融计算--收益率曲线之构建曲线(4) 概述 三次样条函数与期限结构 knots 的选择 实现三次样条函数 实现拟合方法 测试 参考文献 如果未做特别说明,文中的程序都是 C++11 代码. QuantLib 金融计算--收益率曲线之构建曲线(4) 本文代码对应的 QuantLib 版本是 1.15.相关源代码可以在 QuantLibEx 找到. 概述 QuantLib 中提供了用三次 B 样条函数拟合期限结构的功能,但是,并未提供使用三次样条函数拟合期限结构的功能.本文

QuantLib 金融计算——自己动手封装 Python 接口(1)

目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 QuantLibEx 和官方包混合使用 附录:接口文件.setup.py 和 __init__.py QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 已经开始在 PyPi 上发布封装好的 Python 接口,安装和使用非常方便,与普通的包别无二致.并且

QuantLib 金融计算——自己动手封装 Python 接口(2)

目录 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 如何封装一项复杂功能? 寻找最小功能集合的策略 实践 估计期限结构参数 修改官方接口文件 下一步的计划 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 对于一项简单功能,通常只需要包装少数几个类就可以,正如<自己动手封装 Python 接口(1)>演示的那样. 下面,将演示如何包装 QuantLib 中的复杂功能,最终实现从固息债交易数据中估计期限结构模型的参数. 如何封装一项复杂功能

QuantLib 金融计算——基本组件之 Date 类

QuantLib 金融计算--基本组件之 Date 类 QuantLib 将金融领域的日期对象抽象为 Date 类,并提供了丰富的计算函数.需要注意的是,quantlib-python 中的 Date 类并不同于 python 自身包含的 datetime 类,也没有继承关系. 载入 QuantLib: import QuantLib as ql print(ql.__version__) 1.10 Date 对象的构造 Date 对象的构造方式有两种,分别是 Date(serialNumber

QuantLib 金融计算

QuantLib 金融计算 QauntLib 入门 基本组件之 Date 类 基本组件之 Calendar 类 原文地址:https://www.cnblogs.com/xuruilong100/p/8711520.html

QuantLib 金融计算——基本组件之 InterestRate 类

如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--基本组件之 InterestRate 类 围绕收益率展开的若干计算(如计算贴现因子)是固定收益分析中最基础的部分.同时,由于固定收益产品在付息频率.计息方式.天数计算规则等细节方面的多样性,这一块的计算显得更加复杂繁琐.QuantLib 将与收益率有关的计算整合封装在 InterestRate 类,用户所作的只是按照规定配置特定的参数. 载入 QuantLib: import QuantLib as ql p

QuantLib 金融计算——数学工具之求解器

目录 QuantLib 金融计算--数学工具之求解器 概述 调用方式 非 Newton 算法(不需要导数) Newton 算法(需要导数) 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之求解器 载入模块 import QuantLib as ql import scipy from scipy.stats import norm print(ql.__version__) 1.12 概述 QuantLib 提供了多种类型的一维求解器,用以求解单

QuantLib 金融计算——数学工具之随机数发生器

目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之随机数发生器 载入模块 import QuantLib as ql import scipy print(ql.__version__) 1.12 概述 随机模拟通常从产生均匀分布的随机数开始.假设 \(X \sim U [0, 1