我正在尝试为浮动利率债券定价,而且我已经在C ++上使用quantlib构建了折扣曲线。现在我想做的是使用FloatingRateBond类并创建一组现金流,其中第一个现金流已知(假设与该现金流量相关的指数在上次重置日期已知)并预测剩余现金使用当前索引进行流动。
使其更具图形性,假设年度付款,并且上次重置日期的索引为1%,重置边际为1%。那么第一笔现金流将粗略地说2%。现在假设今天的指数是2%,那么我希望所有剩余的现金流量都是3%(通过Day Count会议和工作日会议的适当调整)。
如何为FloatingRateBond类的实例创建这样的现金流结构?
答案 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);
...或者创建并使用另一个。