/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(ResolvedIborFixingDeposit beanToCopy) { this.currency = beanToCopy.getCurrency(); this.notional = beanToCopy.getNotional(); this.startDate = beanToCopy.getStartDate(); this.endDate = beanToCopy.getEndDate(); this.yearFraction = beanToCopy.getYearFraction(); this.fixedRate = beanToCopy.getFixedRate(); this.floatingRate = beanToCopy.getFloatingRate(); }
/** * Calculates the present value of the Ibor fixing deposit product. * <p> * The present value of the product is the value on the valuation date. * * @param deposit the product * @param provider the rates provider * @return the present value of the product */ public CurrencyAmount presentValue(ResolvedIborFixingDeposit deposit, RatesProvider provider) { Currency currency = deposit.getCurrency(); if (provider.getValuationDate().isAfter(deposit.getEndDate())) { return CurrencyAmount.of(currency, 0.0d); } double forwardRate = forwardRate(deposit, provider); double discountFactor = provider.discountFactor(currency, deposit.getEndDate()); double fv = deposit.getNotional() * deposit.getYearFraction() * (deposit.getFixedRate() - forwardRate); double pv = discountFactor * fv; return CurrencyAmount.of(currency, pv); }
private double forwardRate(ResolvedIborFixingDeposit product, RatesProvider provider) { IborIndexRates rates = provider.iborIndexRates(product.getFloatingRate().getIndex()); // The IborFixingDeposit are fictitious instruments to anchor the beginning of the IborIndex forward curve. // By using the 'rateIgnoringTimeSeries' method (instead of 'rate') we ensure that only the forward curve is involved. return rates.rateIgnoringFixings(product.getFloatingRate().getObservation()); }
public void test_presentValue_noFixing() { double discountFactor = IMM_PROV_NOFIX.discountFactor(EUR, END_DATE); double forwardRate = IMM_PROV_NOFIX.iborIndexRates(EUR_EURIBOR_6M).rate(RDEPOSIT.getFloatingRate().getObservation()); CurrencyAmount computed = PRICER.presentValue(RDEPOSIT, IMM_PROV_NOFIX); double expected = NOTIONAL * discountFactor * (RATE - forwardRate) * RDEPOSIT.getYearFraction(); assertEquals(computed.getCurrency(), EUR); assertEquals(computed.getAmount(), expected, TOLERANCE_PV); }
private LocalDate calculateEnd(LocalDate valuationDate, ReferenceData refData) { IborFixingDepositTrade trade = template.createTrade(valuationDate, BuySell.BUY, 0d, 0d, refData); ResolvedIborFixingDeposit deposit = trade.getProduct().resolve(refData); return deposit.getEndDate(); }
/** * Calculates the spread to be added to the deposit rate to have a zero present value. * * @param deposit the product * @param provider the rates provider * @return the par spread */ public double parSpread(ResolvedIborFixingDeposit deposit, RatesProvider provider) { return forwardRate(deposit, provider) - deposit.getFixedRate(); }
public void test_builder_wrongDates() { assertThrowsIllegalArg(() -> ResolvedIborFixingDeposit.builder() .currency(GBP) .notional(NOTIONAL) .startDate(LocalDate.of(2015, 8, 20)) .endDate(END_DATE) .yearFraction(YEAR_FRACTION) .floatingRate(RATE_COMP) .fixedRate(RATE) .build()); }
/** * Calculates the present value sensitivity of the Ibor fixing product. * <p> * The present value sensitivity of the product is the sensitivity of the present value to * the underlying curves. * * @param deposit the product * @param provider the rates provider * @return the point sensitivity of the present value */ public PointSensitivities presentValueSensitivity(ResolvedIborFixingDeposit deposit, RatesProvider provider) { double forwardRate = forwardRate(deposit, provider); DiscountFactors discountFactors = provider.discountFactors(deposit.getCurrency()); double discountFactor = discountFactors.discountFactor(deposit.getEndDate()); // sensitivity PointSensitivityBuilder sensiFwd = forwardRateSensitivity(deposit, provider) .multipliedBy(-discountFactor * deposit.getNotional() * deposit.getYearFraction()); PointSensitivityBuilder sensiDsc = discountFactors.zeroRatePointSensitivity(deposit.getEndDate()) .multipliedBy(deposit.getNotional() * deposit.getYearFraction() * (deposit.getFixedRate() - forwardRate)); return sensiFwd.combinedWith(sensiDsc).build(); }
private PointSensitivityBuilder forwardRateSensitivity(ResolvedIborFixingDeposit product, RatesProvider provider) { IborIndexRates rates = provider.iborIndexRates(product.getFloatingRate().getIndex()); return rates.rateIgnoringFixingsPointSensitivity(product.getFloatingRate().getObservation()); }
@Override public ResolvedIborFixingDeposit resolve(ReferenceData refData) { DateAdjuster bda = getBusinessDayAdjustment().orElse(BusinessDayAdjustment.NONE).resolve(refData); LocalDate start = bda.adjust(startDate); LocalDate end = bda.adjust(endDate); double yearFraction = dayCount.yearFraction(start, end); LocalDate fixingDate = fixingDateOffset.adjust(startDate, refData); return ResolvedIborFixingDeposit.builder() .startDate(start) .endDate(end) .yearFraction(yearFraction) .currency(getCurrency()) .notional(buySell.normalize(notional)) .floatingRate(IborRateComputation.of(index, fixingDate, refData)) .fixedRate(fixedRate) .build(); }
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 575402001: // currency return ((ResolvedIborFixingDeposit) bean).getCurrency(); case 1585636160: // notional return ((ResolvedIborFixingDeposit) bean).getNotional(); case -2129778896: // startDate return ((ResolvedIborFixingDeposit) bean).getStartDate(); case -1607727319: // endDate return ((ResolvedIborFixingDeposit) bean).getEndDate(); case -1731780257: // yearFraction return ((ResolvedIborFixingDeposit) bean).getYearFraction(); case 747425396: // fixedRate return ((ResolvedIborFixingDeposit) bean).getFixedRate(); case -2130225658: // floatingRate return ((ResolvedIborFixingDeposit) bean).getFloatingRate(); } return super.propertyGet(bean, propertyName, quiet); }
private LocalDate calculateLastFixingDate(LocalDate valuationDate, ReferenceData refData) { IborFixingDepositTrade trade = template.createTrade(valuationDate, BuySell.BUY, 0d, 0d, refData); ResolvedIborFixingDeposit deposit = trade.getProduct().resolve(refData); return deposit.getFloatingRate().getFixingDate(); }
public void test_serialization() { ResolvedIborFixingDeposit test = ResolvedIborFixingDeposit.builder() .currency(GBP) .notional(NOTIONAL) .startDate(START_DATE) .endDate(END_DATE) .yearFraction(YEAR_FRACTION) .floatingRate(RATE_COMP) .fixedRate(RATE) .build(); assertSerialization(test); }
public void test_builder() { ResolvedIborFixingDeposit test = ResolvedIborFixingDeposit.builder() .currency(GBP) .notional(NOTIONAL) .startDate(START_DATE) .endDate(END_DATE) .yearFraction(YEAR_FRACTION) .floatingRate(RATE_COMP) .fixedRate(RATE) .build(); assertEquals(test.getCurrency(), GBP); assertEquals(test.getNotional(), NOTIONAL); assertEquals(test.getStartDate(), START_DATE); assertEquals(test.getEndDate(), END_DATE); assertEquals(test.getYearFraction(), YEAR_FRACTION); assertEquals(test.getFloatingRate(), RATE_COMP); assertEquals(test.getFixedRate(), RATE); }
public void test_metadata_last_fixing() { IborFixingDepositCurveNode node = IborFixingDepositCurveNode.of(TEMPLATE, QUOTE_ID, SPREAD).withDate(CurveNodeDate.LAST_FIXING); ImmutableMarketData marketData = ImmutableMarketData.builder(VAL_DATE).addValue(QUOTE_ID, 0.0d).build(); IborFixingDepositTrade trade = node.trade(1d, marketData, REF_DATA); ResolvedIborFixingDeposit product = trade.getProduct().resolve(REF_DATA); LocalDate fixingDate = ((IborRateComputation) product.getFloatingRate()).getFixingDate(); DatedParameterMetadata metadata = node.metadata(VAL_DATE, REF_DATA); assertEquals(((TenorDateParameterMetadata) metadata).getDate(), fixingDate); assertEquals(((TenorDateParameterMetadata) metadata).getTenor().getPeriod(), TEMPLATE.getDepositPeriod()); }
public void coverage() { ResolvedIborFixingDeposit test1 = ResolvedIborFixingDeposit.builder() .currency(GBP) .notional(NOTIONAL) .startDate(START_DATE) .endDate(END_DATE) .yearFraction(YEAR_FRACTION) .floatingRate(RATE_COMP) .fixedRate(RATE) .build(); coverImmutableBean(test1); ResolvedIborFixingDeposit test2 = ResolvedIborFixingDeposit.builder() .currency(GBP) .notional(-100000000d) .startDate(START_DATE) .endDate(LocalDate.of(2015, 4, 20)) .yearFraction(0.25) .floatingRate(IborRateComputation.of(GBP_LIBOR_3M, FIXING_DATE, REF_DATA)) .fixedRate(0.0375) .build(); coverBeanEquals(test1, test2); }
public void test_resolve() { IborFixingDeposit base = IborFixingDeposit.builder() .buySell(SELL) .notional(NOTIONAL) .startDate(START_DATE) .endDate(END_DATE) .businessDayAdjustment(BDA_MOD_FOLLOW) .index(GBP_LIBOR_6M) .fixedRate(RATE) .build(); ResolvedIborFixingDeposit test = base.resolve(REF_DATA); LocalDate expectedEndDate = BDA_MOD_FOLLOW.adjust(END_DATE, REF_DATA); double expectedYearFraction = ACT_365F.yearFraction(START_DATE, expectedEndDate); IborRateComputation expectedObservation = IborRateComputation.of( GBP_LIBOR_6M, GBP_LIBOR_6M.getFixingDateOffset().adjust(START_DATE, REF_DATA), REF_DATA); assertEquals(test.getCurrency(), GBP); assertEquals(test.getStartDate(), START_DATE); assertEquals(test.getEndDate(), expectedEndDate); assertEquals(test.getFloatingRate(), expectedObservation); assertEquals(test.getNotional(), -NOTIONAL); assertEquals(test.getFixedRate(), RATE); assertEquals(test.getYearFraction(), expectedYearFraction); }