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