if ((bond.hasExCouponPeriod() && !settlementDate.isAfter(period.getDetachmentDate())) || (!bond.hasExCouponPeriod() && period.getPaymentDate().isAfter(settlementDate))) { mdAtFirstCoupon += period.getRealCoupon() / Math.pow(factorOnPeriod, pow + 1) * (pow + factorToNext) / couponPerYear; pvAtFirstCoupon += period.getRealCoupon() / Math.pow(factorOnPeriod, pow); ++pow;
if ((bond.hasExCouponPeriod() && !settlementDate.isAfter(period.getDetachmentDate())) || (!bond.hasExCouponPeriod() && period.getPaymentDate().isAfter(settlementDate))) { cvAtFirstCoupon += period.getRealCoupon() * (pow + factorToNext) * (pow + factorToNext + 1d) / (Math.pow(factorOnPeriod, pow + 2) * couponPerYear * couponPerYear); pvAtFirstCoupon += period.getRealCoupon() / Math.pow(factorOnPeriod, pow); ++pow;
if ((bond.hasExCouponPeriod() && !settlementDate.isAfter(period.getDetachmentDate())) || (!bond.hasExCouponPeriod() && period.getPaymentDate().isAfter(settlementDate))) { pvAtFirstCoupon += period.getRealCoupon() / Math.pow(factorOnPeriod, pow); ++pow;
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 575402001: // currency return ((CapitalIndexedBondPaymentPeriod) bean).getCurrency(); case 1585636160: // notional return ((CapitalIndexedBondPaymentPeriod) bean).getNotional(); case 1842278244: // realCoupon return ((CapitalIndexedBondPaymentPeriod) bean).getRealCoupon(); case -2129778896: // startDate return ((CapitalIndexedBondPaymentPeriod) bean).getStartDate(); case -1607727319: // endDate return ((CapitalIndexedBondPaymentPeriod) bean).getEndDate(); case 1457691881: // unadjustedStartDate return ((CapitalIndexedBondPaymentPeriod) bean).getUnadjustedStartDate(); case 31758114: // unadjustedEndDate return ((CapitalIndexedBondPaymentPeriod) bean).getUnadjustedEndDate(); case -878940481: // detachmentDate return ((CapitalIndexedBondPaymentPeriod) bean).getDetachmentDate(); case 625350855: // rateComputation return ((CapitalIndexedBondPaymentPeriod) bean).getRateComputation(); } return super.propertyGet(bean, propertyName, quiet); }
/** * Calculates the forecast value of a single payment period. * * @param period the period to price * @param ratesProvider the rates provider, used to determine price index values * @return the forecast value of the period */ public double forecastValue(CapitalIndexedBondPaymentPeriod period, RatesProvider ratesProvider) { if (period.getPaymentDate().isBefore(ratesProvider.getValuationDate())) { return 0d; } double rate = rateComputationFn.rate( period.getRateComputation(), period.getStartDate(), period.getEndDate(), ratesProvider); return period.getNotional() * period.getRealCoupon() * (rate + 1d); }
/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(CapitalIndexedBondPaymentPeriod beanToCopy) { this.currency = beanToCopy.getCurrency(); this.notional = beanToCopy.getNotional(); this.realCoupon = beanToCopy.getRealCoupon(); this.startDate = beanToCopy.getStartDate(); this.endDate = beanToCopy.getEndDate(); this.unadjustedStartDate = beanToCopy.getUnadjustedStartDate(); this.unadjustedEndDate = beanToCopy.getUnadjustedEndDate(); this.detachmentDate = beanToCopy.getDetachmentDate(); this.rateComputation = beanToCopy.getRateComputation(); }
if (yieldConvention.equals(CapitalIndexedBondYieldConvention.US_IL_REAL)) { double pvAtFirstCoupon; double cpnRate = bond.getPeriodicPayments().get(0).getRealCoupon(); if (Math.abs(yield) > 1.0E-8) { double factorOnPeriod = 1d + yield / couponPerYear; double realRate = period.getRealCoupon(); double firstYearFraction = bond.yearFraction(period.getUnadjustedStartDate(), period.getUnadjustedEndDate()); double v = 1d / (1d + yield / couponPerYear); for (int loopcpn = 0; loopcpn < nbCoupon; loopcpn++) { CapitalIndexedBondPaymentPeriod paymentPeriod = bond.getPeriodicPayments().get(loopcpn + periodIndex); pvAtFirstCoupon += paymentPeriod.getRealCoupon() * Math.pow(v, loopcpn);
public void test_builder_min() { CapitalIndexedBondPaymentPeriod test = CapitalIndexedBondPaymentPeriod.builder() .currency(USD) .notional(NOTIONAL) .startDate(START) .endDate(END) .rateComputation(COMPUTE_MONTH) .realCoupon(REAL_COUPON) .build(); assertEquals(test.getCurrency(), USD); assertEquals(test.getNotional(), NOTIONAL); assertEquals(test.getDetachmentDate(), END); assertEquals(test.getStartDate(), START); assertEquals(test.getEndDate(), END); assertEquals(test.getUnadjustedStartDate(), START); assertEquals(test.getUnadjustedEndDate(), END); assertEquals(test.getRateComputation(), COMPUTE_MONTH); assertEquals(test.getRealCoupon(), REAL_COUPON); }
/** * Calculates the accrued interest of the bond with the specified date. * * @param referenceDate the reference date * @return the accrued interest of the product */ public double accruedInterest(LocalDate referenceDate) { if (getUnadjustedStartDate().isAfter(referenceDate)) { return 0d; } double notional = getNotional(); CapitalIndexedBondPaymentPeriod period = findPeriod(referenceDate) .orElseThrow(() -> new IllegalArgumentException("Date outside range of bond")); LocalDate previousAccrualDate = period.getUnadjustedStartDate(); double realCoupon = period.getRealCoupon(); double couponPerYear = getFrequency().eventsPerYear(); double rate = realCoupon * couponPerYear; double accruedInterest = yieldConvention.equals(CapitalIndexedBondYieldConvention.JP_IL_COMPOUND) || yieldConvention.equals(CapitalIndexedBondYieldConvention.JP_IL_SIMPLE) ? yearFraction(previousAccrualDate, referenceDate, DayCounts.ACT_365F) * rate * notional : yearFraction(previousAccrualDate, referenceDate) * rate * notional; double result = 0d; if (hasExCouponPeriod() && !referenceDate.isBefore(period.getDetachmentDate())) { result = accruedInterest - notional * rate * yearFraction(previousAccrualDate, period.getUnadjustedEndDate()); } else { result = accruedInterest; } return result; }
public void test_builder_full() { CapitalIndexedBondPaymentPeriod test = CapitalIndexedBondPaymentPeriod.builder() .currency(USD) .notional(NOTIONAL) .detachmentDate(DETACHMENT) .startDate(START) .endDate(END) .unadjustedStartDate(START_UNADJ) .unadjustedEndDate(END_UNADJ) .rateComputation(COMPUTE_INTERP) .realCoupon(REAL_COUPON) .build(); assertEquals(test.getCurrency(), USD); assertEquals(test.getNotional(), NOTIONAL); assertEquals(test.getDetachmentDate(), DETACHMENT); assertEquals(test.getStartDate(), START); assertEquals(test.getEndDate(), END); assertEquals(test.getUnadjustedStartDate(), START_UNADJ); assertEquals(test.getUnadjustedEndDate(), END_UNADJ); assertEquals(test.getRateComputation(), COMPUTE_INTERP); assertEquals(test.getRealCoupon(), REAL_COUPON); }
/** * Calculates the forecast value sensitivity of a single payment period. * <p> * The forecast value sensitivity of the period is the sensitivity of the present value to * the underlying curves. * * @param period the period to price * @param ratesProvider the rates provider, used to determine price index values * @return the forecast value sensitivity of the period */ public PointSensitivityBuilder forecastValueSensitivity( CapitalIndexedBondPaymentPeriod period, RatesProvider ratesProvider) { if (period.getPaymentDate().isBefore(ratesProvider.getValuationDate())) { return PointSensitivityBuilder.none(); } PointSensitivityBuilder rateSensi = rateComputationFn.rateSensitivity( period.getRateComputation(), period.getStartDate(), period.getEndDate(), ratesProvider); return rateSensi.multipliedBy(period.getNotional() * period.getRealCoupon()); }
/** * Calculates the present value sensitivity of a single payment period. * <p> * The present value sensitivity of the period is the sensitivity of the present value to * the underlying curves. * * @param period the period to price * @param ratesProvider the rates provider, used to determine price index values * @param issuerDiscountFactors the discount factor provider * @return the present value curve sensitivity of the period */ public PointSensitivityBuilder presentValueSensitivity( CapitalIndexedBondPaymentPeriod period, RatesProvider ratesProvider, IssuerCurveDiscountFactors issuerDiscountFactors) { if (period.getPaymentDate().isBefore(ratesProvider.getValuationDate())) { return PointSensitivityBuilder.none(); } double rate = rateComputationFn.rate( period.getRateComputation(), period.getStartDate(), period.getEndDate(), ratesProvider); PointSensitivityBuilder rateSensi = rateComputationFn.rateSensitivity( period.getRateComputation(), period.getStartDate(), period.getEndDate(), ratesProvider); double df = issuerDiscountFactors.discountFactor(period.getPaymentDate()); PointSensitivityBuilder dfSensi = issuerDiscountFactors.zeroRatePointSensitivity(period.getPaymentDate()); double factor = period.getNotional() * period.getRealCoupon(); return rateSensi.multipliedBy(df * factor).combinedWith(dfSensi.multipliedBy((rate + 1d) * factor)); }
IssuerCurveZeroRateSensitivity dfSensi = IssuerCurveZeroRateSensitivity.of(zeroSensi, issuerDiscountFactors.getLegalEntityGroup()); double factor = period.getNotional() * period.getRealCoupon(); return rateSensi.multipliedBy(df * factor).combinedWith(dfSensi.multipliedBy((rate + 1d) * factor));