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

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

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

Schedule 类用于构造一个特定的日期列表,例如债券的付息日列表,是 QuantLib 中固定收益类产品分析最常用到的组件。

载入 QuantLib:

import QuantLib as ql

print(ql.__version__)
1.10

Schedule 对象的构造

Schedule 类对象的构造依赖于之前介绍的几个基本组件。

Schedule(effectiveDate ,
         terminationDate ,
         tenor,
         calendar,
         convention,
         terminationDateConvention,
         rule,
         endOfMonth,
         firstDate = Date (),
         nextToLastDate = Date ())

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

  • effectiveDateterminationDate:日期,日历列表的起始、结束日期,例如债券的起息日和到期日。
  • tenorPeriod 对象,相邻两个日期的间隔,例如债券的付息频率(1 年或 6 个月)或利率互换的利息重置频率(3 个月)。
  • calendar:日历表,生成日期所遵循的特定日历表。
  • convention:整数,如何调整非工作日(除最后一个日期外),取值范围是 quantlib-python 的一些预留变量。
  • terminationDateConvention:整数,如果最后一个日期是非工作日,该如何调整,取值范围是 quantlib-python 的一些预留变量。
  • ruleDateGeneration 的成员,生成日期的规则。
  • endOfMonth:如果起始日期在月末,是否要求其他日期也要安排在月末(除最后一个日期外)。
  • firstDate, nextToLastDate(可选):日期,专门为生成方法 rule 提供的起始、结束日期(不常用)。

作为“容器”的 Schedule 对象

Schedule 对象的行为和 Python 中的 list 非常相似,作为一种存储 Date 对象的序列容器存在。因此下面两个函数是可用的:

  • len(sch):返回 Schedule 对象 sch 内日期的个数。
  • [i]:返回第 i 个日期。

作为序列容器,和 list 一样,Schedule 对象也是可迭代的。

假设想要获得 2017 年每月首个工作日的列表:

  • 起始、结束日期分别是 2017-01-01 和 2017-12-01。
  • 时间间隔是一个月。
  • 日历表遵循中国银行间市场的规定
  • 遇到非工作日就递延到下一工作日

例子 1:

def testingSchedule1():
    effectiveDate = ql.Date(1, ql.January, 2017)
    terminationDate = ql.Date(1, ql.December, 2017)
    tenor = ql.Period(1, ql.Months)
    calendar = ql.China(ql.China.IB)
    convention = ql.Following
    terminationDateConvention = ql.Following
    rule = ql.DateGeneration.Forward
    endOfMonth = False

    mySched = ql.Schedule(
        effectiveDate,
        terminationDate,
        tenor,
        calendar,
        convention,
        terminationDateConvention,
        rule,
        endOfMonth)

    for i in range(len(mySched)):
        print(mySched[i])
    
    print('------')
    
    for i in mySched:
        print(i)
January 3rd, 2017
February 3rd, 2017
March 1st, 2017
April 1st, 2017
May 2nd, 2017
June 1st, 2017
July 3rd, 2017
August 1st, 2017
September 1st, 2017
October 9th, 2017
November 1st, 2017
December 1st, 2017
------
January 3rd, 2017
February 3rd, 2017
March 1st, 2017
April 1st, 2017
May 2nd, 2017
June 1st, 2017
July 3rd, 2017
August 1st, 2017
September 1st, 2017
October 9th, 2017
November 1st, 2017
December 1st, 2017

一些常用的成员函数

  • until(d):从日期列表中截取前半部分,并保证最后一个日期是 d
  • isRegular(i):判断第 i 个区间是否完整。这个概念需要解释以下:如果一个 Schedule 对象含有 n 个日期,那么这个对象就含有 n-1 个区间。如果第 i 个区间的长度和事先规定的时间间隔一致,那么这个区间就是完整的(Regular)。

例子 2:

def testingSchedule2():
    effectiveDate = ql.Date(1, ql.January, 2017)
    terminationDate = ql.Date(1, ql.December, 2017)
    tenor = ql.Period(1, ql.Months)
    calendar = ql.China(ql.China.IB)
    convention = ql.Following
    terminationDateConvention = ql.Following
    rule = ql.DateGeneration.Forward
    endOfMonth = False

    mySched = ql.Schedule(
        effectiveDate,
        terminationDate,
        tenor,
        calendar,
        convention,
        terminationDateConvention,
        rule,
        endOfMonth)

    mySched = mySched.until(ql.Date(15, ql.June, 2017))

    for i in mySched:
        print(i)

    print('------')

    for i in range(len(mySched) - 1):
        print('{}-th internal is regular? {}'.format(
            i + 1, mySched.isRegular(i + 1)))
January 3rd, 2017
February 3rd, 2017
March 1st, 2017
April 1st, 2017
May 2nd, 2017
June 1st, 2017
June 15th, 2017
------
1-th internal is regular? True
2-th internal is regular? True
3-th internal is regular? True
4-th internal is regular? True
5-th internal is regular? True
6-th internal is regular? False

最后一个区间的长度只有 15 天,所以是“不完整的”。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以的。在TVM中,您可以使用schedule对多个算子进行优化,包括同时计算多个矩阵乘法。具体来说,您可以使用TVM的API创建多个矩阵乘法算子,并将它们组合成一个复合算子。然后,您可以使用TVM的schedule API对这些算子进行调度,以实现并行计算。 以下是一个示例代码,其中包含四个矩阵相乘的算子,它们被组合成一个复合算子,并使用TVM的schedule API对其进行并行化: ```python import tvm import numpy as np # Define the shape of the matrices n, m, l, p = 10, 20, 30, 40 # Define the input placeholders A = tvm.te.placeholder((n, m), name='A') B = tvm.te.placeholder((m, l), name='B') C = tvm.te.placeholder((l, p), name='C') D = tvm.te.placeholder((p, n), name='D') # Define the intermediate tensors k = tvm.te.reduce_axis((0, m), name='k') E = tvm.te.compute((n, l), lambda i, j: tvm.te.sum(A[i, k] * B[k, j], axis=k), name='E') l = tvm.te.reduce_axis((0, l), name='l') F = tvm.te.compute((n, p), lambda i, j: tvm.te.sum(E[i, l] * C[l, j], axis=l), name='F') o = tvm.te.reduce_axis((0, p), name='o') G = tvm.te.compute((m, n), lambda i, j: tvm.te.sum(D[o, i] * F[j, o], axis=o), name='G') # Compile the computation into a function s = tvm.te.create_schedule(G.op) xo, xi = s[G].split(G.op.axis[1], factor=32) s[G].reorder(G.op.reduce_axis[0], xo, xi, G.op.axis[0]) s[G].parallel(xo) s[F].parallel(F.op.axis[0]) s[E].parallel(E.op.axis[0]) s[C].parallel(C.op.axis[1]) s[B].parallel(B.op.axis[1]) s[A].parallel(A.op.axis[0]) func = tvm.build(s, [A, B, C, D, G]) # Generate some random input data a = np.random.rand(n, m).astype(np.float32) b = np.random.rand(m, l).astype(np.float32) c = np.random.rand(l, p).astype(np.float32) d = np.random.rand(p, n).astype(np.float32) # Execute the function with the input data g = np.empty((m, n), dtype=np.float32) func(tvm.nd.array(a), tvm.nd.array(b), tvm.nd.array(c), tvm.nd.array(d), tvm.nd.array(g)) # Verify the result np.testing.assert_allclose(g, np.dot(d, np.dot(c, np.dot(a, b)))) ``` 在上面的代码中,我们使用schedule API对四个矩阵相乘的算子进行了调度。我们使用了TVM的API定义了四个矩阵相乘的算子,并将它们组合成一个复合算子。然后,我们使用TVM的schedule API对这些算子进行并行化。具体来说,我们使用了split、reorder和parallel等API对这些算子进行调度,以实现并行计算。最后,我们使用TVM的API将这个复合算子编译成一个可执行函数,并将输入数据传递给它。最后,我们验证了输出结果是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值