Quantlib浮动利率债券现金流计算

Quantlib FloatingRateBond cashflow computation

本文关键字:现金流 计算 利率 Quantlib      更新时间:2023-10-16

查看Bond.cpp示例:http://quantlib.org/reference/_bonds_8cpp-example.html看起来CCD_ 1和CCD_。然而,对于浮动利率债券来说,浮动利率债券类别似乎是通过计算远期利率,然后将利差添加到浮动利率债券实例来计算票面利率,从而计算现金流(这听起来很正确)。

这是正确的吗?还是这个例子的情况是,预测的现金流是通过只取现货曲线并添加价差来获得预测的票面利率来计算的?

示例中有两种不同类型的对象。

实际曲线被构建并存储在智能指针中;例如,depoSwapTermStructure(点曲线)是boost::shared_ptr<YieldTermStructure>bondDiscountingTermStructure也是。它们基本上充当指向YieldTermStructure的指针。

然后,您有Handle<YieldTermStructure>(或RelinkableHandle)的实例,它们为您提供了另一个间接级别:Handle包含一个depoSwapTermStructure0,如果需要,可以将其切换为另一个(其基本原理和更多详细信息可在此链接中获得)。

在该示例中,libor3m索引被传递给liborTermStructure句柄,因此它将通过使用链接到它的任何曲线来预测其固定值:在这种情况下,depoSwapTermStructure,因为语句

liborTermStructure.linkTo(depoSwapTermStructure);

在债券定价之前执行。正如你所说,票面利率是通过预测曲线外的指数固定值并添加价差来计算的。如果我们将liborTermStructure与另一条曲线联系起来,并再次询问债券的现金流,它们将根据新曲线重新计算。

折扣也是如此。与discountingTermStructure相关的任何曲线都将用于贴现现金流;在该示例中,它将是bondDiscountingTermStructure

至于如何计算息票利率:每个息票都在BlackIborCouponPricer实例的帮助下计算自己的利率和金额,该实例在债券之后立即构建,并在不久后通过声明与息票关联

setCouponPricer(floatingRateBond.cashflows(),pricer);

实际执行计算的代码涉及BlackIborCouponPricerFloatingRateCoupon类(更多详细信息在这里和下面的帖子中),但最终在liborTermStructure0类中计算速率为:

Rate IborIndex::forecastFixing(const Date& fixingDate) const {
    Date d1 = valueDate(fixingDate);
    Date d2 = maturityDate(d1);
    Time t = dayCounter_.yearFraction(d1, d2);
    return forecastFixing(d1, d2, t);
}
Rate IborIndex::forecastFixing(const Date& d1,
                                      const Date& d2,
                                      Time t) const {
    DiscountFactor disc1 = termStructure_->discount(d1);
    DiscountFactor disc2 = termStructure_->discount(d2);
    return (disc1/disc2 - 1.0) / t;
}