public void streamEntriesToMatrix() { // If we obtain a stream of rates we can collect to an fx matrix Map<CurrencyPair, Double> rates = ImmutableMap.<CurrencyPair, Double>builder() .put(CurrencyPair.of(GBP, USD), 1.6) .put(CurrencyPair.of(EUR, USD), 1.4) .put(CurrencyPair.of(CHF, AUD), 1.2) // Neither currency seen before .put(CurrencyPair.of(SEK, AUD), 0.1) // AUD seen before but not added yet .put(CurrencyPair.of(JPY, CAD), 0.0) // Neither currency seen before .put(CurrencyPair.of(EUR, CHF), 1.2) .put(CurrencyPair.of(JPY, USD), 0.008) .build(); FxMatrix matrix = rates.entrySet() .stream() .collect(entriesToFxMatrix()); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(EUR, USD)).isEqualTo(1.4); }
public void streamPairsToMatrix() { // If we obtain a stream of pairs with rates we can stream them // This could happen if an entry set undergoes a map operation Map<CurrencyPair, Double> rates = ImmutableMap.<CurrencyPair, Double>builder() .put(CurrencyPair.of(GBP, USD), 1.6) .put(CurrencyPair.of(EUR, USD), 1.4) .put(CurrencyPair.of(CHF, AUD), 1.2) // Neither currency seen before .put(CurrencyPair.of(SEK, AUD), 0.1) // AUD seen before but not added yet .put(CurrencyPair.of(JPY, CAD), 0.0) // Neither currency seen before .put(CurrencyPair.of(EUR, CHF), 1.2) .put(CurrencyPair.of(JPY, USD), 0.008) .build(); FxMatrix matrix = rates.entrySet() .stream() .map(e -> Pair.of(e.getKey(), e.getValue() * 1.01)) // Apply some shift .collect(pairsToFxMatrix()); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.616); assertThat(matrix.fxRate(EUR, USD)).isEqualTo(1.414); }
public void addSimpleMultipleRates() { // Use linked to force the order of evaluation // want to see that builder recovers when // encountering a currency pair for 2 unknown // currencies but which will appear later LinkedHashMap<CurrencyPair, Double> rates = new LinkedHashMap<>(); rates.put(CurrencyPair.of(GBP, USD), 1.6); rates.put(CurrencyPair.of(EUR, USD), 1.4); FxMatrix matrix = FxMatrix.builder() .addRates(rates) .build(); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(USD, GBP)).isEqualTo(1 / 1.6); assertThat(matrix.fxRate(EUR, USD)).isEqualTo(1.4); assertThat(matrix.fxRate(USD, EUR)).isEqualTo(1 / 1.4); assertThat(matrix.fxRate(EUR, GBP)).isEqualTo(1.4 / 1.6, TOL); assertThat(matrix.fxRate(GBP, EUR)).isEqualTo(1.6 / 1.4, TOL); }
public void matrixCalculatesCrossRates() { FxMatrix matrix = FxMatrix.builder() .addRate(GBP, USD, 1.6) .addRate(EUR, USD, 1.4) .addRate(EUR, CHF, 1.2) .build(); assertThat(matrix.getCurrencies()).containsOnly(GBP, USD, EUR, CHF); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(USD, GBP)).isEqualTo(1 / 1.6); assertThat(matrix.fxRate(EUR, USD)).isEqualTo(1.4); assertThat(matrix.fxRate(USD, EUR)).isEqualTo(1 / 1.4); assertThat(matrix.fxRate(EUR, GBP)).isEqualTo(1.4 / 1.6, TOL); assertThat(matrix.fxRate(GBP, EUR)).isEqualTo(1.6 / 1.4, TOL); assertThat(matrix.fxRate(EUR, CHF)).isEqualTo(1.2); }
public void addMultipleRatesSingle() { FxMatrix matrix = FxMatrix.builder() .addRate(GBP, USD, 1.6) .addRate(EUR, USD, 1.4) .addRate(EUR, CHF, 1.2) .addRate(EUR, CHF, 1.2) .addRate(CHF, AUD, 1.2) .addRate(SEK, AUD, 0.16) .addRate(JPY, USD, 0.0084) .addRate(JPY, CAD, 0.01) .addRate(USD, NZD, 1.3) .build(); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(USD, GBP)).isEqualTo(1 / 1.6); assertThat(matrix.fxRate(EUR, USD)).isEqualTo(1.4, TOL); assertThat(matrix.fxRate(USD, EUR)).isEqualTo(1 / 1.4, TOL); assertThat(matrix.fxRate(EUR, GBP)).isEqualTo(1.4 / 1.6, TOL); assertThat(matrix.fxRate(GBP, EUR)).isEqualTo(1.6 / 1.4, TOL); assertThat(matrix.fxRate(EUR, CHF)).isEqualTo(1.2); }
public void singleRateMatrixByOfCurrencyPairFactory() { FxMatrix matrix = FxMatrix.of(CurrencyPair.of(GBP, USD), 1.6); assertThat(matrix.getCurrencies()).containsOnly(GBP, USD); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(USD, GBP)).isEqualTo(0.625); assertThat(matrix.toString()).isEqualTo("FxMatrix[GBP, USD : [1.0, 1.6],[0.625, 1.0]]"); }
public void test_presentValueVsForex() { CurrencyAmount pvNDF = PRICER.presentValue(NDF, PROVIDER); MultiCurrencyAmount pvFX = PRICER_FX.presentValue(FOREX, PROVIDER); assertEquals( pvNDF.getAmount(), pvFX.getAmount(USD).getAmount() + pvFX.getAmount(KRW).getAmount() * FX_MATRIX.fxRate(KRW, USD), NOMINAL_USD * TOL); }
public void mergeAddsInAdditionalCurrencies() { FxMatrix matrix1 = FxMatrix.builder() .addRate(GBP, USD, 1.6) .addRate(EUR, USD, 1.4) .build(); FxMatrix matrix2 = FxMatrix.builder() .addRate(EUR, CHF, 1.2) .addRate(CHF, AUD, 1.2) .build(); FxMatrix result = matrix1.merge(matrix2); assertThat(result.getCurrencies()).contains(USD, GBP, EUR, CHF, AUD); assertThat(result.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(result.fxRate(GBP, EUR)).isEqualTo(1.6 / 1.4, TOL); assertThat(result.fxRate(EUR, CHF)).isEqualTo(1.2); assertThat(result.fxRate(CHF, AUD)).isEqualTo(1.2); assertThat(result.fxRate(GBP, CHF)).isEqualTo((1.6 / 1.4) * 1.2, TOL); assertThat(result.fxRate(GBP, AUD)).isEqualTo((1.6 / 1.4) * 1.2 * 1.2, TOL); }
public void rateCanBeUpdatedInBuilder() { FxMatrix matrix = FxMatrix.builder() .addRate(GBP, USD, 1.5) .addRate(GBP, USD, 1.6) .build(); assertThat(matrix.getCurrencies()).containsOnly(GBP, USD); assertThat(matrix.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix.fxRate(USD, GBP)).isEqualTo(0.625); }
public void test_currencyExposureVsForex() { MultiCurrencyAmount pvNDF = PRICER.currencyExposure(NDF, PROVIDER); MultiCurrencyAmount pvFX = PRICER_FX.currencyExposure(FOREX, PROVIDER); assertEquals(pvNDF.getAmount(USD).getAmount(), pvFX.getAmount(USD).getAmount(), NOMINAL_USD * TOL); assertEquals(pvNDF.getAmount(KRW).getAmount(), pvFX.getAmount(KRW).getAmount(), NOMINAL_USD * TOL * FX_MATRIX.fxRate(USD, KRW)); }
public void emptyMatrixCanHandleTrivialRate() { FxMatrix matrix = FxMatrix.empty(); assertThat(matrix.getCurrencies()).isEmpty(); assertThat(matrix.fxRate(USD, USD)).isEqualTo(1.0); assertThat(matrix.toString()).isEqualTo("FxMatrix[ : ]"); }
public void emptyMatrixCannotDoConversion() { FxMatrix matrix = FxMatrix.builder().build(); assertThat(matrix.getCurrencies()).isEmpty(); assertThrowsIllegalArg(() -> matrix.fxRate(USD, EUR)); }
public void test_currencyExposure_from_pt_sensitivity_inverse() { MultiCurrencyAmount ceDirect = PRICER.currencyExposure(NDF_INVERSE, PROVIDER); PointSensitivities pts = PRICER.presentValueSensitivity(NDF_INVERSE, PROVIDER); MultiCurrencyAmount cePts = PROVIDER.currencyExposure(pts); CurrencyAmount cePv = PRICER.presentValue(NDF_INVERSE, PROVIDER); MultiCurrencyAmount ceExpected = cePts.plus(cePv); assertEquals(ceDirect.getAmount(USD).getAmount(), ceExpected.getAmount(USD).getAmount(), NOMINAL_USD * TOL); assertEquals(ceDirect.getAmount(KRW).getAmount(), ceExpected.getAmount(KRW).getAmount(), NOMINAL_USD * TOL * FX_MATRIX.fxRate(USD, KRW)); }
public void test_currencyExposure_from_pt_sensitivity() { MultiCurrencyAmount ceDirect = PRICER.currencyExposure(NDF, PROVIDER); PointSensitivities pts = PRICER.presentValueSensitivity(NDF, PROVIDER); MultiCurrencyAmount cePts = PROVIDER.currencyExposure(pts); CurrencyAmount cePv = PRICER.presentValue(NDF, PROVIDER); MultiCurrencyAmount ceExpected = cePts.plus(cePv); assertEquals(ceDirect.getAmount(USD).getAmount(), ceExpected.getAmount(USD).getAmount(), NOMINAL_USD * TOL); assertEquals(ceDirect.getAmount(KRW).getAmount(), ceExpected.getAmount(KRW).getAmount(), NOMINAL_USD * TOL * FX_MATRIX.fxRate(USD, KRW)); }
public void ratedCanBeUpdatedAndAddedViaBuilder() { FxMatrix matrix1 = FxMatrix.builder() .addRate(GBP, USD, 1.5) .build(); assertThat(matrix1.getCurrencies()).containsOnly(GBP, USD); assertThat(matrix1.fxRate(GBP, USD)).isEqualTo(1.5); FxMatrix matrix2 = matrix1.toBuilder() .addRate(GBP, USD, 1.6) .addRate(EUR, USD, 1.4) .build(); assertThat(matrix2.getCurrencies()).containsOnly(GBP, USD, EUR); assertThat(matrix2.fxRate(GBP, USD)).isEqualTo(1.6); assertThat(matrix2.fxRate(EUR, USD)).isEqualTo(1.4); }
public void singleRateMatrixCannotDoConversionForUnknownCurrency() { FxMatrix matrix = FxMatrix.builder() .addRate(GBP, USD, 1.6) .build(); assertThat(matrix.getCurrencies()).containsOnly(GBP, USD); assertThrowsIllegalArg(() -> matrix.fxRate(USD, EUR)); }
public void rateCanBeUpdatedWithDirectionSwitched() { FxMatrix matrix1 = FxMatrix.builder() .addRate(GBP, USD, 1.6) .build(); assertThat(matrix1.getCurrencies()).hasSize(2); assertThat(matrix1.fxRate(GBP, USD)).isEqualTo(1.6); FxMatrix matrix2 = matrix1.toBuilder() .addRate(USD, GBP, 0.625) .build(); assertThat(matrix2.getCurrencies()).hasSize(2); assertThat(matrix2.fxRate(GBP, USD)).isEqualTo(1.6); }