示例中有两种不同类型的对象在起作用。
实际曲线被构建并存储在智能指针中;例如,depoSwapTermStructure(现货曲线)是boost::shared_ptr<YieldTermStructure>,bondDiscountingTermStructure 也是。它们基本上表现为指向YieldTermStructure 的指针。
然后,您有 Handle<YieldTermStructure>(或 RelinkableHandle)的实例,它们为您提供了另一个间接级别:Handle 包含一个 shared_ptr,并且可以在需要时将其切换为另一个(这样做的基本原理和更多详细信息请访问this link)。
在示例中,libor3m 索引通过 liborTermStructure 句柄传递,因此它将使用与其链接的任何曲线来预测其定位:在本例中,depoSwapTermStructure,因为语句
liborTermStructure.linkTo(depoSwapTermStructure);
在债券定价之前执行。正如您所说,票面利率是通过预测曲线外的指数定价并加上点差来计算的。如果我们将liborTermStructure 链接到另一条曲线并再次询问债券的现金流量,它们将根据新曲线重新计算。
打折也是如此。与discountingTermStructure 相关联的任何曲线都将用于折现现金流;在示例中,即为bondDiscountingTermStructure。
关于票面利率的计算方式:每张票面券都在BlackIborCouponPricer实例的帮助下计算自己的利率和金额,该实例在债券之后立即构建并在声明后不久与票面券相关联
setCouponPricer(floatingRateBond.cashflows(),pricer);
实际执行计算的代码涉及BlackIborCouponPricer 和FloatingRateCoupon 类(更多详细信息请参见here 和后面的帖子),但最终在IborIndex 类中计算速率为:
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;
}