/** * Gets the FX index. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
/** * Gets the FX index. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
/** * Gets the FX index that the sensitivity refers to. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
@Override public void collectIndices(ImmutableSet.Builder<Index> builder) { getFxResetObservation().ifPresent(fxReset -> builder.add(fxReset.getIndex())); }
@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 100346066: // index return ((FxIndexObservation) bean).getIndex(); case 1255202043: // fixingDate return ((FxIndexObservation) bean).getFixingDate(); case -414641441: // maturityDate return ((FxIndexObservation) bean).getMaturityDate(); } return super.propertyGet(bean, propertyName, quiet); }
@ImmutableValidator private void validate() { FxIndex index = observation.getIndex(); if (!index.getCurrencyPair().contains(referenceCurrency)) { throw new IllegalArgumentException( Messages.format("Reference currency {} must be one of those in the FxIndex {}", referenceCurrency, index)); } }
@ImmutableValidator private void validate() { // check for unadjusted must be after firstNonNull ArgChecker.inOrderNotEqual(startDate, endDate, "startDate", "endDate"); ArgChecker.inOrderNotEqual(unadjustedStartDate, unadjustedEndDate, "unadjustedStartDate", "unadjustedEndDate"); Currency payCcy = payment.getCurrency(); Currency notionalCcy = notionalAmount.getCurrency(); if (fxResetObservation != null) { if (notionalCcy.equals(payCcy)) { throw new IllegalArgumentException(Messages.format( "Payment currency {} must not equal notional currency {} when FX reset applies", payCcy, notionalCcy)); } if (!fxResetObservation.getIndex().getCurrencyPair().contains(payCcy)) { throw new IllegalArgumentException(Messages.format( "Payment currency {} must be one of those in the FxReset index {}", payCcy, fxResetObservation.getIndex())); } if (!fxResetObservation.getIndex().getCurrencyPair().contains(notionalCcy)) { throw new IllegalArgumentException(Messages.format( "Notional currency {} must be one of those in the FxReset index {}", notionalCcy, fxResetObservation.getIndex())); } } else { if (!notionalCcy.equals(payCcy)) { throw new IllegalArgumentException(Messages.format( "Payment currency {} must equal notional currency {}", payCcy, notionalCcy)); } } }
private double fxRate(RatePaymentPeriod paymentPeriod, RatesProvider provider) { // inefficient to use Optional.orElse because double primitive type would be boxed if (paymentPeriod.getFxReset().isPresent()) { FxReset fxReset = paymentPeriod.getFxReset().get(); FxIndexRates rates = provider.fxIndexRates(fxReset.getObservation().getIndex()); return rates.rate(fxReset.getObservation(), fxReset.getReferenceCurrency()); } else { return 1d; } }
public void test_collectIndices_fxReset() { SchedulePeriod sched = SchedulePeriod.of(DATE_2014_03_30, DATE_2014_09_30); KnownAmountNotionalSwapPaymentPeriod test = KnownAmountNotionalSwapPaymentPeriod.of( PAYMENT_2014_10_03, sched, USD_P50000, FX_RESET); ImmutableSet.Builder<Index> builder = ImmutableSet.builder(); test.collectIndices(builder); assertEquals(builder.build(), ImmutableSet.of(FX_RESET.getIndex())); }
private PointSensitivityBuilder fxRateSensitivity(RatePaymentPeriod paymentPeriod, RatesProvider provider) { if (paymentPeriod.getFxReset().isPresent()) { FxReset fxReset = paymentPeriod.getFxReset().get(); FxIndexRates rates = provider.fxIndexRates(fxReset.getObservation().getIndex()); return rates.ratePointSensitivity(fxReset.getObservation(), fxReset.getReferenceCurrency()); } return PointSensitivityBuilder.none(); }
@ImmutableValidator private void validate() { FxIndex index = observation.getIndex(); if (!index.getCurrencyPair().contains(notionalAmount.getCurrency())) { throw new IllegalArgumentException( Messages.format( "Reference currency {} must be one of those in the FxIndex {}", notionalAmount.getCurrency(), index)); } }
@ImmutableValidator private void validate() { CurrencyPair pair = observation.getIndex().getCurrencyPair(); if (!pair.contains(settlementCurrencyNotional.getCurrency())) { throw new IllegalArgumentException("FxIndex and settlement notional currency are incompatible"); } if (!(pair.equals(agreedFxRate.getPair()) || pair.isInverse(agreedFxRate.getPair()))) { throw new IllegalArgumentException("FxIndex and agreed FX rate are incompatible"); } }
private double fxRate(FxResetNotionalExchange event, RatesProvider provider) { FxIndexRates rates = provider.fxIndexRates(event.getObservation().getIndex()); return rates.rate(event.getObservation(), event.getReferenceCurrency()); }
public void test_of() { FxIndexObservation test = FxIndexObservation.of(GBP_USD_WM, FIXING_DATE, REF_DATA); assertEquals(test.getIndex(), GBP_USD_WM); assertEquals(test.getFixingDate(), FIXING_DATE); assertEquals(test.getMaturityDate(), MATURITY_DATE); assertEquals(test.getCurrencyPair(), GBP_USD_WM.getCurrencyPair()); assertEquals(test.toString(), "FxIndexObservation[GBP/USD-WM on 2016-02-22]"); }
/** * Gets the payment currency. * <p> * This returns the currency that the payment is made in. * ISDA refers to this as the <i>variable currency</i>. * * @return the payment currency */ @Override public Currency getCurrency() { FxIndex index = observation.getIndex(); Currency indexBase = index.getCurrencyPair().getBase(); Currency indexCounter = index.getCurrencyPair().getCounter(); return (getReferenceCurrency().equals(indexBase) ? indexCounter : indexBase); }
@Override public PointSensitivityBuilder forecastValueSensitivity(FxResetNotionalExchange event, RatesProvider provider) { FxIndexRates rates = provider.fxIndexRates(event.getObservation().getIndex()); return rates.ratePointSensitivity(event.getObservation(), event.getReferenceCurrency()) .multipliedBy(event.getNotional()); }
public void test_currentCash_onPayment() { double eps = 1.0e-14; ImmutableRatesProvider prov = ImmutableRatesProvider.builder(FX_RESET_NOTIONAL_EXCHANGE_REC_USD.getPaymentDate()) .fxRateProvider(FX_MATRIX) .discountCurve(GBP, DISCOUNT_CURVE_GBP) .discountCurve(USD, DISCOUNT_CURVE_USD) .build(); DiscountingFxResetNotionalExchangePricer test = new DiscountingFxResetNotionalExchangePricer(); double rate = prov.fxIndexRates(FX_RESET_NOTIONAL_EXCHANGE_REC_USD.getObservation().getIndex()).rate( FX_RESET_NOTIONAL_EXCHANGE_REC_USD.getObservation(), FX_RESET_NOTIONAL_EXCHANGE_REC_USD.getReferenceCurrency()); double ccUSD = test.currentCash(FX_RESET_NOTIONAL_EXCHANGE_REC_USD, prov); assertEquals(ccUSD, NOTIONAL * rate, eps); double ccGBP = test.currentCash(FX_RESET_NOTIONAL_EXCHANGE_PAY_GBP, prov); assertEquals(ccGBP, -NOTIONAL / rate, eps); }
@Override public MultiCurrencyAmount currencyExposure(RatePaymentPeriod period, RatesProvider provider) { double df = provider.discountFactor(period.getCurrency(), period.getPaymentDate()); if (period.getFxReset().isPresent()) { FxReset fxReset = period.getFxReset().get(); LocalDate fixingDate = fxReset.getObservation().getFixingDate(); FxIndexRates rates = provider.fxIndexRates(fxReset.getObservation().getIndex()); if (!fixingDate.isAfter(provider.getValuationDate()) && rates.getFixings().get(fixingDate).isPresent()) { double fxRate = rates.rate(fxReset.getObservation(), fxReset.getReferenceCurrency()); return MultiCurrencyAmount.of(period.getCurrency(), accrualWithNotional(period, period.getNotional() * fxRate * df, provider)); } double fxRateSpotSensitivity = rates.getFxForwardRates() .rateFxSpotSensitivity(fxReset.getReferenceCurrency(), fxReset.getObservation().getMaturityDate()); return MultiCurrencyAmount.of(fxReset.getReferenceCurrency(), accrualWithNotional(period, period.getNotional() * fxRateSpotSensitivity * df, provider)); } return MultiCurrencyAmount.of(period.getCurrency(), accrualWithNotional(period, period.getNotional() * df, provider)); }
@Override public MultiCurrencyAmount currencyExposure(FxResetNotionalExchange event, RatesProvider provider) { LocalDate fixingDate = event.getObservation().getFixingDate(); FxIndexRates rates = provider.fxIndexRates(event.getObservation().getIndex()); double df = provider.discountFactor(event.getCurrency(), event.getPaymentDate()); if (!fixingDate.isAfter(provider.getValuationDate()) && rates.getFixings().get(fixingDate).isPresent()) { double fxRate = rates.rate(event.getObservation(), event.getReferenceCurrency()); return MultiCurrencyAmount.of(CurrencyAmount.of(event.getCurrency(), event.getNotional() * df * fxRate)); } LocalDate maturityDate = event.getObservation().getMaturityDate(); double fxRateSpotSensitivity = rates.getFxForwardRates().rateFxSpotSensitivity(event.getReferenceCurrency(), maturityDate); return MultiCurrencyAmount.of( CurrencyAmount.of(event.getReferenceCurrency(), event.getNotional() * df * fxRateSpotSensitivity)); }
@Override public void explainPresentValue(FxResetNotionalExchange event, RatesProvider provider, ExplainMapBuilder builder) { Currency currency = event.getCurrency(); LocalDate paymentDate = event.getPaymentDate(); builder.put(ExplainKey.ENTRY_TYPE, "FxResetNotionalExchange"); builder.put(ExplainKey.PAYMENT_DATE, paymentDate); builder.put(ExplainKey.PAYMENT_CURRENCY, currency); builder.put(ExplainKey.TRADE_NOTIONAL, event.getNotionalAmount()); if (paymentDate.isBefore(provider.getValuationDate())) { builder.put(ExplainKey.COMPLETED, Boolean.TRUE); builder.put(ExplainKey.FORECAST_VALUE, CurrencyAmount.zero(currency)); builder.put(ExplainKey.PRESENT_VALUE, CurrencyAmount.zero(currency)); } else { builder.addListEntry(ExplainKey.OBSERVATIONS, child -> { child.put(ExplainKey.ENTRY_TYPE, "FxObservation"); child.put(ExplainKey.INDEX, event.getObservation().getIndex()); child.put(ExplainKey.FIXING_DATE, event.getObservation().getFixingDate()); child.put(ExplainKey.INDEX_VALUE, fxRate(event, provider)); }); builder.put(ExplainKey.DISCOUNT_FACTOR, provider.discountFactor(currency, paymentDate)); builder.put(ExplainKey.FORECAST_VALUE, CurrencyAmount.of(currency, forecastValue(event, provider))); builder.put(ExplainKey.PRESENT_VALUE, CurrencyAmount.of(currency, presentValue(event, provider))); } }