Quantlib浮动利率债券与已知的第一现金流量和预测现金流量相等

时间:2015-06-16 14:31:17

标签: c++ floating rate quantlib

我正在尝试为浮动利率债券定价,而且我已经在C ++上使用quantlib构建了折扣曲线。现在我想做的是使用FloatingRateBond类并创建一组现金流,其中第一个现金流已知(假设与该现金流量相关的指数在上次重置日期已知)并预测剩余现金使用当前索引进行流动。

使其更具图形性,假设年度付款,并且上次重置日期的索引为1%,重置边际为1%。那么第一笔现金流将粗略地说2%。现在假设今天的指数是2%,那么我希望所有剩余的现金流量都是3%(通过Day Count会议和工作日会议的适当调整)。

如何为FloatingRateBond类的实例创建这样的现金流结构?

1 个答案:

答案 0 :(得分:3)

首先,我将快速建立绑定,从QuantLib版本中的绑定示例中复制一些代码(另外,免责声明:我还没有尝试编译下面的代码)。有关所涉及的类的更多详细信息,请参阅QuantLib文档。

让我们假设您所说的年度付款:

Schedule schedule(startDate, maturityDate, Period(Annual),
                  calendar, convention, convention,
                  DateGeneration::Backward, true);

为了说明,我们假设我们将使用USD Libor指数。它的未来定价是基于我们稍后设定的利率期限结构来预测的。

RelinkableHandle<YieldTermStructure> liborTermStructure;
boost::shared_ptr<IborIndex> libor(
             new USDLibor(Period(1,Years),liborTermStructure));

现在建立债券,将保证金作为利差加在LIBOR利率上:

FloatingRateBond bond(settlementDays, faceAmount,
                      schedule, libor, dayCounter,
                      convention, fixingDays,
                      // gearings
                      std::vector<Real>(1, 1.0),
                      // spreads
                      std::vector<Rate>(1, 0.001));

现在要获得您想要的优惠券,您只需设置相应的市场数据即可。要设置第一个现金流的利率,请存储Libor指数的过去修正:

libor->addFixing(resetDate, 0.01);

为了设定未来的现金流量,创建一个具有所需利率的固定利率曲线(注意约定,以便它们与Libor指数相匹配):

boost::shared_ptr<YieldTermStructure> flatRate(
    new FlatForward(today, 0.01, dayCounter, Simple, Annual));
liborTermStructure.linkTo(flatRate);

(您不一定限于统一费率;如果您可以引导Libor曲线,您可以使用该曲线来获得未来优惠券的实际估计值。)

此时,您应该能够提取保证金券并检查它们是否符合预期:

std::vector<boost::shared_ptr<CashFlow> > cashflows = bond.cashflows();
for (std::size_t i=0; i < cashflows.size(); ++i)
    std::cout << cashflows[i]->date() << "    "
              << cashflows[i]->amount() << "\n";

如果您还想调用bond.cleanPrice()等方法,您需要告诉债券如何折现现金流量:

RelinkableHandle<YieldTermStructure> discountingTermStructure;
boost::shared_ptr<PricingEngine> bondEngine(
             new DiscountingBondEngine(discountingTermStructure));
bond.setPricingEngine(bondEngine);

您可以使用折扣用于预测的相同曲线...

discountingTermStructure.linkTo(flatRate);

...或者创建并使用另一个。