QuantLib:构建关键利率风险

4
我能够为国库市场构建折扣曲线。然而,我希望通过使用此方法来找到单个债券(以及最终的债券组合)的关键利率风险。
我要寻找的关键利率风险是:如果我有一份30年期的债券,并且我们改变了用于贴现该债券的1年期利率,同时保持其他利率不变,那么债券价格会发生多少变化?重复这个过程,针对每个期限(例如2年、5年、7年等),将结果加总即可得到债券的整体久期,但提供了更好的视角来分析风险敞口的分布情况。

http://www.investinganswers.com/financial-dictionary/bonds/key-rate-duration-6725

有没有人知道如何做这个的文档?谢谢。

1个回答

7

假设您已经构建了债券和折现曲线,并以某种方式将它们链接起来,类似于:

discount_handle = RelinkableYieldTermStructureHandle(discount_curve)

bond.setPricingEngine(DiscountingBondEngine(discount_handle))

您可以先在现有的折扣率曲线上添加一个增值曲线,然后使用修改后的曲线定价债券。类似于以下内容:
nodes = [ 1, 2, 5, 7, 10 ]  # the durations
dates = [ today + Period(n, Years) for n in nodes ]
spreads = [ SimpleQuote(0.0) for n in nodes ] # null spreads to begin

new_curve = SpreadedLinearZeroInterpolatedTermStructure(
    YieldTermStructureHandle(discount_curve),
    [ QuoteHandle(q) for q in spreads ],
    dates)

这将给你一个新的曲线,初始点差全部为0(并且有一个糟糕的类名),您可以使用它来代替原始折扣曲线:

discount_handle.linkTo(new_curve)

在上述情况下,债券应该仍然返回相同的价格(因为所有利差都是空)。

当您想要计算特定的关键利率久期时,可以移动相应的报价:例如,如果您想要增加5年报价(上面列表中的第三个),执行以下操作:

spreads[2].setValue(0.001)   # 10 bps

曲线将相应更新,债券价格应该会改变。
注意:上述内容将在利差之间进行插值运算,因此如果您将5年期点调整10个基点并保持2年期点不变,则3年左右的利率将会移动大约3个基点。为了缓解这种情况(如果这不是您想要的),您可以添加更多的曲线点,并限制变化的范围。例如,如果您在5年减1个月和5年加1个月处添加一个点,则移动5年期点将只影响其周围的两个月。

非常感谢您的回复,Luigi。毫无疑问,您的软件包和技巧非常有帮助。对于我的无知表示歉意,因为我仍在努力学习结构,但是是否有一种方法可以直接更新曲线中的spreads[2].setValue(0.001)?根据您上面的答案,一旦我执行以下操作discount_handle.linkTo(new_curve) spreads[2].setValue(0.001)fixed_rate_bond.setPricingEngine(new_curve) print(fixed_rate_bond.NPV())我仍然收到与setValue()之前相同的NPV。这是否是预期的? - user6142489
它应该在原地更新。请将您的代码发布到QuantLib邮件列表,我们会尝试解决它。 - Luigi Ballabio
不确定如何在SourceForge上发布,如果您是在引用它,请问是否有我可以发送的电子邮件分发列表?谢谢。 - user6142489
您可以通过以下地址quantlib-users@lists.sourceforge.net向QuantLib邮件列表发布帖子。 - Luigi Ballabio
@LuigiBallabio 我也遇到了使用.setValue()后NPV未更新的问题。我正在使用1.12版本。 - BCR
请将您的代码发布到QuantLib邮件列表,我们会尽力解决。 - Luigi Ballabio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接