double factorToNextCoupon = factorToNextCoupon(bond, settlementDate); double factorOnPeriod = 1 + yield / couponPerYear; double nominal = bond.getNotional();
private double dirtyPriceFromYieldStandard( ResolvedFixedCouponBond bond, LocalDate settlementDate, double yield) { int nbCoupon = bond.getPeriodicPayments().size(); double factorOnPeriod = 1 + yield / ((double) bond.getFrequency().eventsPerYear()); double fixedRate = bond.getFixedRate(); double pvAtFirstCoupon = 0; int pow = 0; for (int loopcpn = 0; loopcpn < nbCoupon; loopcpn++) { FixedCouponBondPaymentPeriod period = bond.getPeriodicPayments().get(loopcpn); if ((period.hasExCouponPeriod() && !settlementDate.isAfter(period.getDetachmentDate())) || (!period.hasExCouponPeriod() && period.getPaymentDate().isAfter(settlementDate))) { pvAtFirstCoupon += fixedRate * period.getYearFraction() / Math.pow(factorOnPeriod, pow); ++pow; } } pvAtFirstCoupon += 1d / Math.pow(factorOnPeriod, pow - 1); return pvAtFirstCoupon * Math.pow(factorOnPeriod, -factorToNextCoupon(bond, settlementDate)); }
double factorToNextCoupon = factorToNextCoupon(bond, settlementDate); double factorOnPeriod = 1 + yield / couponPerYear; double nominal = bond.getNotional();
/** * Calculates the Macaulay duration of the fixed coupon bond product from yield. * <p> * Macaulay defined an alternative way of weighting the future cash flows. * <p> * The input yield must be fractional. The dirty price and its derivative are * computed for {@link FixedCouponBondYieldConvention}, and the result is expressed in fraction. * * @param bond the product * @param settlementDate the settlement date * @param yield the yield * @return the modified duration of the product */ public double macaulayDurationFromYield(ResolvedFixedCouponBond bond, LocalDate settlementDate, double yield) { ImmutableList<FixedCouponBondPaymentPeriod> payments = bond.getPeriodicPayments(); int nCoupon = payments.size() - couponIndex(payments, settlementDate); FixedCouponBondYieldConvention yieldConv = bond.getYieldConvention(); if ((yieldConv.equals(US_STREET)) && (nCoupon == 1)) { return factorToNextCoupon(bond, settlementDate) / bond.getFrequency().eventsPerYear(); } if ((yieldConv.equals(US_STREET)) || (yieldConv.equals(GB_BUMP_DMO)) || (yieldConv.equals(DE_BONDS))) { return modifiedDurationFromYield(bond, settlementDate, yield) * (1d + yield / bond.getFrequency().eventsPerYear()); } throw new UnsupportedOperationException("The convention " + yieldConv.name() + " is not supported."); }
if (yieldConv.equals(US_STREET) || yieldConv.equals(DE_BONDS)) { double couponPerYear = bond.getFrequency().eventsPerYear(); double factorToNextCoupon = factorToNextCoupon(bond, settlementDate); double timeToPay = factorToNextCoupon / couponPerYear; double disc = (1d + factorToNextCoupon * yield / couponPerYear);
FixedCouponBondPaymentPeriod payment = payments.get(payments.size() - 1); return (1d + payment.getFixedRate() * payment.getYearFraction()) / (1d + factorToNextCoupon(bond, settlementDate) * yield / ((double) bond.getFrequency().eventsPerYear()));
if (yieldConv.equals(US_STREET) || yieldConv.equals(DE_BONDS)) { double couponPerYear = bond.getFrequency().eventsPerYear(); double factor = factorToNextCoupon(bond, settlementDate); return factor / couponPerYear / (1d + factor * yield / couponPerYear);