/** * Calculates the dirty price of the fixed coupon bond from its settlement date and clean price. * * @param bond the product * @param settlementDate the settlement date * @param cleanPrice the clean price * @return the present value of the fixed coupon bond product */ public double dirtyPriceFromCleanPrice(ResolvedFixedCouponBond bond, LocalDate settlementDate, double cleanPrice) { double notional = bond.getNotional(); double accruedInterest = accruedInterest(bond, settlementDate); return cleanPrice + accruedInterest / notional; }
/** * Calculates the clean price of the fixed coupon bond from its settlement date and dirty price. * <p> * Strata uses <i>decimal prices</i> for bonds. For example, a price of 99.32% is represented in Strata by 0.9932. * * @param bond the product * @param settlementDate the settlement date * @param dirtyPrice the dirty price * @return the present value of the fixed coupon bond product */ public double cleanPriceFromDirtyPrice(ResolvedFixedCouponBond bond, LocalDate settlementDate, double dirtyPrice) { double notional = bond.getNotional(); double accruedInterest = accruedInterest(bond, settlementDate); return dirtyPrice - accruedInterest / notional; }
public void test_dirtyPriceFromCleanPrice_cleanPriceFromDirtyPrice() { double dirtyPrice = PRICER.dirtyPriceFromCurves(PRODUCT, PROVIDER, REF_DATA); LocalDate settlement = DATE_OFFSET.adjust(VAL_DATE, REF_DATA); double cleanPrice = PRICER.cleanPriceFromDirtyPrice(PRODUCT, settlement, dirtyPrice); double accruedInterest = PRICER.accruedInterest(PRODUCT, settlement); assertEquals(cleanPrice, dirtyPrice - accruedInterest / NOTIONAL, NOTIONAL * TOL); double dirtyPriceRe = PRICER.dirtyPriceFromCleanPrice(PRODUCT, settlement, cleanPrice); assertEquals(dirtyPriceRe, dirtyPrice, TOL); }
public void test_presentValueFromCleanPrice_noExcoupon() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPrice(TRADE_NO_EXCOUPON, PROVIDER, REF_DATA, cleanPrice); LocalDate standardSettlement = PRODUCT_NO_EXCOUPON.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT_NO_EXCOUPON, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPrice() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPrice(TRADE, PROVIDER, REF_DATA, cleanPrice); LocalDate standardSettlement = PRODUCT.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPriceWithZSpread_periodic_noExcoupon() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPriceWithZSpread( TRADE_NO_EXCOUPON, PROVIDER, REF_DATA, cleanPrice, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); LocalDate standardSettlement = PRODUCT_NO_EXCOUPON.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT_NO_EXCOUPON, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPriceWithZSpread_periodic() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPriceWithZSpread( TRADE, PROVIDER, REF_DATA, cleanPrice, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); LocalDate standardSettlement = PRODUCT.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
public void test_accruedInterest() { // settle before start LocalDate settleDate1 = START_DATE.minusDays(5); double accruedInterest1 = PRICER.accruedInterest(PRODUCT, settleDate1); assertEquals(accruedInterest1, 0d); // settle between endDate and endDate -lag LocalDate settleDate2 = date(2015, 10, 8); double accruedInterest2 = PRICER.accruedInterest(PRODUCT, settleDate2); assertEquals(accruedInterest2, -4.0 / 365.0 * FIXED_RATE * NOTIONAL, EPS); // normal LocalDate settleDate3 = date(2015, 4, 18); // not adjusted ResolvedFixedCouponBond product = FixedCouponBond.builder() .securityId(SECURITY_ID) .dayCount(DAY_COUNT) .fixedRate(FIXED_RATE) .legalEntityId(ISSUER_ID) .currency(EUR) .notional(NOTIONAL) .accrualSchedule(PERIOD_SCHEDULE) .settlementDateOffset(DATE_OFFSET) .yieldConvention(YIELD_CONVENTION) .exCouponPeriod(DaysAdjustment.NONE) .build() .resolve(REF_DATA); double accruedInterest3 = PRICER.accruedInterest(product, settleDate3); assertEquals(accruedInterest3, 6.0 / 365.0 * FIXED_RATE * NOTIONAL, EPS); }
public void test_presentValueFromCleanPriceWithZSpread_continuous_noExcoupon() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPriceWithZSpread( TRADE_NO_EXCOUPON, PROVIDER, REF_DATA, cleanPrice, Z_SPREAD, CONTINUOUS, 0); LocalDate standardSettlement = PRODUCT_NO_EXCOUPON.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT_NO_EXCOUPON, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
public void test_presentValueFromCleanPriceWithZSpread_continuous() { double cleanPrice = 0.985; CurrencyAmount computed = TRADE_PRICER.presentValueFromCleanPriceWithZSpread( TRADE, PROVIDER, REF_DATA, cleanPrice, Z_SPREAD, CONTINUOUS, 0); LocalDate standardSettlement = PRODUCT.getSettlementDateOffset().adjust(VAL_DATE, REF_DATA); double df = ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO).discountFactor(standardSettlement); double accruedInterest = PRODUCT_PRICER.accruedInterest(PRODUCT, standardSettlement); double pvPayment = PRICER_NOMINAL .presentValue(UPFRONT_PAYMENT, ZeroRateDiscountFactors.of(EUR, VAL_DATE, CURVE_REPO)).getAmount(); double expected = QUANTITY * (cleanPrice * df * NOTIONAL + accruedInterest * df) + pvPayment; assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, NOTIONAL * QUANTITY * TOL); }
double df = repoDf.discountFactor(standardSettlementDate); double pvStandard = (cleanPrice * product.getNotional() + productPricer.accruedInterest(product, standardSettlementDate)) * df; if (standardSettlementDate.isEqual(tradeSettlementDate)) { return presentValueFromProductPresentValue(trade, provider, CurrencyAmount.of(currency, pvStandard));
double df = repoDf.discountFactor(standardSettlementDate); double pvStandard = (cleanPrice * product.getNotional() + productPricer.accruedInterest(product, standardSettlementDate)) * df; if (standardSettlementDate.isEqual(tradeSettlementDate)) { return presentValueFromProductPresentValue(trade, provider, CurrencyAmount.of(currency, pvStandard));
LocalDate standardSettlement1 = PRODUCT.getSettlementDateOffset().adjust(valuation1, REF_DATA); double df1 = ZeroRateDiscountFactors.of(EUR, valuation1, CURVE_REPO).discountFactor(standardSettlement1); double accruedInterest1 = PRODUCT_PRICER.accruedInterest(PRODUCT, standardSettlement1); double basePv1 = cleanPrice * df1 * NOTIONAL + accruedInterest1 * df1; double pvExtra1 = COUPON_PRICER.presentValue(periodExtra, provider1.issuerCurveDiscountFactors(ISSUER_ID, EUR)); LocalDate standardSettlement4 = PRODUCT.getSettlementDateOffset().adjust(TRADE_BEFORE, REF_DATA); double df4 = ZeroRateDiscountFactors.of(EUR, TRADE_BEFORE, CURVE_REPO).discountFactor(standardSettlement4); double accruedInterest4 = PRODUCT_PRICER.accruedInterest(PRODUCT, standardSettlement4); double basePv4 = cleanPrice * df4 * NOTIONAL + accruedInterest4 * df4; double pvExtra4 = COUPON_PRICER.presentValue(periodExtra, PROVIDER_BEFORE.issuerCurveDiscountFactors(ISSUER_ID, EUR));
LocalDate standardSettlement1 = PRODUCT_NO_EXCOUPON.getSettlementDateOffset().adjust(valuation1, REF_DATA); double df1 = ZeroRateDiscountFactors.of(EUR, valuation1, CURVE_REPO).discountFactor(standardSettlement1); double accruedInterest1 = PRODUCT_PRICER.accruedInterest(PRODUCT_NO_EXCOUPON, standardSettlement1); double basePv1 = cleanPrice * df1 * NOTIONAL + accruedInterest1 * df1; double pvExtra1 = COUPON_PRICER.presentValue(periodExtra, provider1.issuerCurveDiscountFactors(ISSUER_ID, EUR)); LocalDate standardSettlement4 = PRODUCT_NO_EXCOUPON.getSettlementDateOffset().adjust(TRADE_BEFORE, REF_DATA); double df4 = ZeroRateDiscountFactors.of(EUR, TRADE_BEFORE, CURVE_REPO).discountFactor(standardSettlement4); double accruedInterest4 = PRODUCT_PRICER.accruedInterest(PRODUCT_NO_EXCOUPON, standardSettlement4); double basePv4 = cleanPrice * df4 * NOTIONAL + accruedInterest4 * df4; double pvExtra4 = COUPON_PRICER.presentValue(periodExtra,