Spread BondFunctions::zSpread(const Bond& bond, Real cleanPrice, const shared_ptr<YieldTermStructure>& d, const DayCounter& dayCounter, Compounding compounding, Frequency frequency, Date settlement, Real accuracy, Size maxIterations, Rate guess) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = cleanPrice + bond.accruedAmount(settlement); dirtyPrice /= 100.0 / bond.notional(settlement); return CashFlows::zSpread(bond.cashflows(), d, dirtyPrice, dayCounter, compounding, frequency, false, settlement, settlement, accuracy, maxIterations, guess); }
BigInteger BondFunctions::accruedDays(const Bond& bond, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::accruedDays(bond.cashflows(), false, settlement); }
Date BondFunctions::referencePeriodEnd(const Bond& bond, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::referencePeriodEnd(bond.cashflows(), false, settlement); }
Real BondFunctions::yieldValueBasisPoint(const Bond& bond, const InterestRate& yield, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::yieldValueBasisPoint(bond.cashflows(), yield, false, settlement); }
Real BondFunctions::accruedAmount(const Bond& bond, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::accruedAmount(bond.cashflows(), false, settlement) * 100.0 / bond.notional(settlement); }
Real BondFunctions::bps(const Bond& bond, const YieldTermStructure& discountCurve, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::bps(bond.cashflows(), discountCurve, false, settlement) * 100.0 / bond.notional(settlement); }
Time BondFunctions::duration(const Bond& bond, const InterestRate& yield, Duration::Type type, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); return CashFlows::duration(bond.cashflows(), yield, type, false, settlement); }
Real BondFunctions::cleanPrice(const Bond& bond, const InterestRate& yield, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = CashFlows::npv(bond.cashflows(), yield, false, settlement) * 100.0 / bond.notional(settlement); return dirtyPrice - bond.accruedAmount(settlement); }
Real BondFunctions::cleanPrice(const Bond& bond, const YieldTermStructure& discountCurve, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " settlement date (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = CashFlows::npv(bond.cashflows(), discountCurve, false, settlement) * 100.0 / bond.notional(settlement); return dirtyPrice - bond.accruedAmount(settlement); }
Rate BondFunctions::atmRate(const Bond& bond, const YieldTermStructure& discountCurve, Date settlement, Real cleanPrice) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = cleanPrice==Null<Real>() ? Null<Real>() : cleanPrice + bond.accruedAmount(settlement); return CashFlows::atmRate(bond.cashflows(), discountCurve, false, settlement, settlement, dirtyPrice); }
Real BondFunctions::cleanPrice(const Bond& bond, const shared_ptr<YieldTermStructure>& d, Spread zSpread, const DayCounter& dc, Compounding comp, Frequency freq, Date settlement) { if (settlement == Date()) settlement = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlement), "non tradable at " << settlement << " (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = CashFlows::npv(bond.cashflows(), d, zSpread, dc, comp, freq, false, settlement) * 100.0 / bond.notional(settlement); return dirtyPrice - bond.accruedAmount(settlement); }
static Rate yield(Solver solver, const Bond& bond, Real cleanPrice, const DayCounter& dayCounter, Compounding compounding, Frequency frequency, Date settlementDate = Date(), Real accuracy = 1.0e-10, Rate guess = 0.05) { if (settlementDate == Date()) settlementDate = bond.settlementDate(); QL_REQUIRE(BondFunctions::isTradable(bond, settlementDate), "non tradable at " << settlementDate << " (maturity being " << bond.maturityDate() << ")"); Real dirtyPrice = cleanPrice + bond.accruedAmount(settlementDate); dirtyPrice /= 100.0 / bond.notional(settlementDate); return CashFlows::yield<Solver>(solver, bond.cashflows(), dirtyPrice, dayCounter, compounding, frequency, false, settlementDate, settlementDate, accuracy, guess); }