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]"); }
@Override public FxIndexObservation build() { return new FxIndexObservation( index, fixingDate, maturityDate); }
@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); }
/** * Converts this sensitivity to an {@code FxForwardSensitivity}. * <p> * The time series, fixing date and FX index are lost by this conversion. * Instead, maturity date and currency pair are contained in {@link FxForwardSensitivity}. * * @return the FX forward sensitivity */ public FxForwardSensitivity toFxForwardSensitivity() { return FxForwardSensitivity.of( observation.getCurrencyPair(), referenceCurrency, observation.getMaturityDate(), currency, sensitivity); }
public void test_serialization() { FxIndexObservation test = FxIndexObservation.of(GBP_USD_WM, FIXING_DATE, REF_DATA); assertSerialization(test); }
/** * Gets the FX index. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
@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))); } }
@Override public int compareKey(PointSensitivity other) { if (other instanceof FxIndexSensitivity) { FxIndexSensitivity otherFx = (FxIndexSensitivity) other; return ComparisonChain.start() .compare(getIndex().toString(), otherFx.getIndex().toString()) .compare(currency, otherFx.currency) .compare(referenceCurrency, otherFx.referenceCurrency) .compare(observation.getFixingDate(), otherFx.observation.getFixingDate()) .result(); } return getClass().getSimpleName().compareTo(other.getClass().getSimpleName()); }
private double forwardRate(FxIndexObservation observation) { return fxForwardRates.rate(index.getCurrencyPair().getBase(), observation.getMaturityDate()); }
/** * Obtains an instance from the observation, reference currency and sensitivity value. * <p> * The sensitivity currency is defaulted to be the counter currency of queried currency pair. * * @param observation the rate observation, including the fixing date * @param referenceCurrency the reference currency * @param sensitivity the value of the sensitivity * @return the point sensitivity object */ public static FxIndexSensitivity of(FxIndexObservation observation, Currency referenceCurrency, double sensitivity) { CurrencyPair obsPair = observation.getCurrencyPair(); boolean inverse = referenceCurrency.equals(obsPair.getCounter()); CurrencyPair queriedPair = inverse ? obsPair.inverse() : obsPair; Currency sensiCurrency = queriedPair.getCounter(); return new FxIndexSensitivity(observation, referenceCurrency, sensiCurrency, sensitivity); }
/** * Gets the FX index. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
@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)); }
builder.addListEntry(ExplainKey.OBSERVATIONS, child -> { child.put(ExplainKey.ENTRY_TYPE, "FxObservation"); child.put(ExplainKey.INDEX, fxReset.getObservation().getIndex()); child.put(ExplainKey.FIXING_DATE, fxReset.getObservation().getFixingDate()); child.put(ExplainKey.INDEX_VALUE, fxRate); });
private double historicRate(FxIndexObservation observation) { LocalDate fixingDate = observation.getFixingDate(); OptionalDouble fixedRate = fixings.get(fixingDate); if (fixedRate.isPresent()) { return fixedRate.getAsDouble(); } else if (fixingDate.isBefore(getValuationDate())) { // the fixing is required if (fixings.isEmpty()) { throw new IllegalArgumentException( Messages.format("Unable to get fixing for {} on date {}, no time-series supplied", index, fixingDate)); } throw new IllegalArgumentException(Messages.format("Unable to get fixing for {} on date {}", index, fixingDate)); } else { return forwardRate(observation); } }
public void test_of() { FxReset test = FxReset.of(FxIndexObservation.of(EUR_GBP_ECB, DATE_2014_06_30, REF_DATA), GBP); assertEquals(test.getIndex(), EUR_GBP_ECB); assertEquals(test.getReferenceCurrency(), GBP); }
/** * Gets the FX index that the sensitivity refers to. * * @return the FX index */ public FxIndex getIndex() { return observation.getIndex(); }
@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 double rate(FxIndexObservation observation, Currency baseCurrency) { ArgChecker.isTrue( index.getCurrencyPair().contains(baseCurrency), "Currency {} invalid for FxIndex {}", baseCurrency, index); LocalDate fixingDate = observation.getFixingDate(); double fxIndexRate = !fixingDate.isAfter(getValuationDate()) ? historicRate(observation) : forwardRate(observation); boolean inverse = baseCurrency.equals(index.getCurrencyPair().getCounter()); return (inverse ? 1d / fxIndexRate : fxIndexRate); }
/** * Creates an instance from an index and fixing date. * <p> * The reference data is used to find the maturity date from the fixing date. * * @param index the index * @param fixingDate the fixing date * @param refData the reference data to use when resolving holiday calendars * @return the rate observation */ public static FxIndexObservation of(FxIndex index, LocalDate fixingDate, ReferenceData refData) { LocalDate maturityDate = index.calculateMaturityFromFixing(fixingDate, refData); return new FxIndexObservation(index, fixingDate, maturityDate); }