Глядя на пример Bond.cpp: http://quantlib.org/reference/_bonds_8cpp-example.html это выглядит как depoSwapTermStructure
а также liborTermStructure
точно такая же кривая. Тем не менее, для облигации с плавающей ставкой кажется, что класс FloatingRateBond вычисляет ставки купона и, следовательно, денежные потоки для экземпляра плавающего RateBond, вычисляя форвардные ставки и затем добавляя к нему спред (что мне кажется правильным).
Правильно ли это или в этом примере прогнозируемые денежные потоки рассчитываются путем взятия только спотовой кривой и добавления спреда для получения прогнозных ставок купона?
В этом примере используются два разных типа объектов.
Фактические кривые строятся и хранятся внутри интеллектуальных указателей; например, depoSwapTermStructure
(точечная кривая) является boost::shared_ptr<YieldTermStructure>
и так bondDiscountingTermStructure
, Они в основном ведут себя как указатели на YieldTermStructure
,
Тогда у вас есть случаи Handle<YieldTermStructure>
(или же RelinkableHandle
) которые дают вам другой уровень косвенности: Handle
содержит shared_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;
}