QuantLib:构建关键利率风险
QuantLib: Building Key Rate Risks
我能够为国债市场建立贴现曲线。但是,我希望用它来找到单个债券(最终是债券组合)的关键利率风险。
我正在寻找的关键利率风险是,如果我持有 30 年期债券,并且我们改变用于贴现债券的 1 年期利率,同时保持其他利率不变,那么债券价格是多少改变?对期限(例如 2 年、5 年、7 年等)重复此操作并对结果求和应该可以得出债券的总久期,但可以更好地了解风险敞口如何分解。
http://www.investinganswers.com/financial-dictionary/bonds/key-rate-duration-6725
有人知道演示如何执行此操作的任何文档吗?谢谢你。
鉴于您已经建立了债券和贴现曲线,并且您已经以类似于以下的方式将它们联系起来:
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(以及一个可怕的 class 名称),您可以使用它来代替原始折扣曲线:
discount_handle.linkTo(new_curve)
在上述之后,债券应该仍然 return 相同的价格(因为利差全部为零)。
当你想计算一个特定的关键利率持续时间时,你可以移动相应的报价:例如,如果你想增加 5 年报价(上面列表中的第三个),执行
spreads[2].setValue(0.001) # 10 bps
曲线会相应更新,债券价格应该会发生变化。
注意:以上将在利差之间进行插值,因此如果您将 5 年期点移动 10 个基点而保持 2 年期点不变,那么 3 年左右的利率将移动约 3 个基点。为了减轻这种情况(如果这不是您想要的),您可以向曲线添加更多点并限制变化的范围。例如,如果您在 5 年减去 1 个月时添加一个点,在 5 年加 1 个月时添加另一个点,则移动 5 年点只会影响它周围的两个月。
我能够为国债市场建立贴现曲线。但是,我希望用它来找到单个债券(最终是债券组合)的关键利率风险。
我正在寻找的关键利率风险是,如果我持有 30 年期债券,并且我们改变用于贴现债券的 1 年期利率,同时保持其他利率不变,那么债券价格是多少改变?对期限(例如 2 年、5 年、7 年等)重复此操作并对结果求和应该可以得出债券的总久期,但可以更好地了解风险敞口如何分解。
http://www.investinganswers.com/financial-dictionary/bonds/key-rate-duration-6725
有人知道演示如何执行此操作的任何文档吗?谢谢你。
鉴于您已经建立了债券和贴现曲线,并且您已经以类似于以下的方式将它们联系起来:
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(以及一个可怕的 class 名称),您可以使用它来代替原始折扣曲线:
discount_handle.linkTo(new_curve)
在上述之后,债券应该仍然 return 相同的价格(因为利差全部为零)。
当你想计算一个特定的关键利率持续时间时,你可以移动相应的报价:例如,如果你想增加 5 年报价(上面列表中的第三个),执行
spreads[2].setValue(0.001) # 10 bps
曲线会相应更新,债券价格应该会发生变化。
注意:以上将在利差之间进行插值,因此如果您将 5 年期点移动 10 个基点而保持 2 年期点不变,那么 3 年左右的利率将移动约 3 个基点。为了减轻这种情况(如果这不是您想要的),您可以向曲线添加更多点并限制变化的范围。例如,如果您在 5 年减去 1 个月时添加一个点,在 5 年加 1 个月时添加另一个点,则移动 5 年点只会影响它周围的两个月。