public void test_fxRate_forPair() { FxRate test = FxRate.of(GBP, USD, 1.25d); assertEquals(test.fxRate(GBP, USD), 1.25d); assertEquals(test.fxRate(USD, GBP), 1d / 1.25d); assertEquals(test.fxRate(GBP, GBP), 1d); assertEquals(test.fxRate(USD, USD), 1d); assertEquals(test.fxRate(AUD, AUD), 1d); assertThrowsIllegalArg(() -> test.fxRate(AUD, GBP)); assertThrowsIllegalArg(() -> test.fxRate(GBP, AUD)); assertThrowsIllegalArg(() -> test.fxRate(AUD, USD)); assertThrowsIllegalArg(() -> test.fxRate(USD, AUD)); assertThrowsIllegalArg(() -> test.fxRate(EUR, AUD)); }
@Override public SwapTrade trade(double quantity, MarketData marketData, ReferenceData refData) { double marketQuote = marketData.getValue(spreadId) + additionalSpread; FxRate fxRate = marketData.getValue(fxRateId); double rate = fxRate.fxRate(template.getCurrencyPair()); BuySell buySell = quantity > 0 ? BuySell.SELL : BuySell.BUY; return template.createTrade(marketData.getValuationDate(), buySell, Math.abs(quantity), rate, marketQuote, refData); }
@Override public FxSwapTrade trade(double quantity, MarketData marketData, ReferenceData refData) { FxRate fxRate = marketData.getValue(fxRateId); double rate = fxRate.fxRate(template.getCurrencyPair()); double fxPts = marketData.getValue(farForwardPointsId); BuySell buySell = quantity > 0 ? BuySell.BUY : BuySell.SELL; return template.createTrade(marketData.getValuationDate(), buySell, Math.abs(quantity), rate, fxPts, refData); }
public void test_of_CurrencyCurrencyDouble_reverseStandardOrder() { FxRate test = FxRate.of(USD, GBP, 0.8d); assertEquals(test.getPair(), CurrencyPair.of(USD, GBP)); assertEquals(test.fxRate(USD, GBP), 0.8d, 0); assertEquals(test.toString(), "USD/GBP 0.8"); }
public void test_of_CurrencyCurrencyDouble_same() { FxRate test = FxRate.of(USD, USD, 1d); assertEquals(test.getPair(), CurrencyPair.of(USD, USD)); assertEquals(test.fxRate(USD, USD), 1d, 0); assertEquals(test.toString(), "USD/USD 1"); }
public void test_of_CurrencyCurrencyDouble() { FxRate test = FxRate.of(GBP, USD, 1.5d); assertEquals(test.getPair(), CurrencyPair.of(GBP, USD)); assertEquals(test.fxRate(GBP, USD), 1.5d, 0); assertEquals(test.toString(), "GBP/USD 1.5"); }
@Override public MarketDataBox<FxRate> applyTo(MarketDataBox<FxRate> marketData, ReferenceData refData) { log.debug("Applying {} shift to FX rate '{}'", shiftType, marketData.getValue(0).getPair().toString()); return marketData.mapWithIndex( getScenarioCount(), (fxRate, scenarioIndex) -> FxRate.of( currencyPair, shiftType.applyShift(fxRate.fxRate(currencyPair), shiftAmount.get(scenarioIndex)))); }
public void test_of_CurrencyPairDouble() { FxRate test = FxRate.of(CurrencyPair.of(GBP, USD), 1.5d); assertEquals(test.getPair(), CurrencyPair.of(GBP, USD)); assertEquals(test.fxRate(GBP, USD), 1.5d, 0); assertEquals(test.toString(), "GBP/USD 1.5"); }
public void test_of_CurrencyPairDouble_reverseStandardOrder() { FxRate test = FxRate.of(CurrencyPair.of(USD, GBP), 0.8d); assertEquals(test.getPair(), CurrencyPair.of(USD, GBP)); assertEquals(test.fxRate(USD, GBP), 0.8d, 0); assertEquals(test.toString(), "USD/GBP 0.8"); }
public void test_of_CurrencyPairDouble_same() { FxRate test = FxRate.of(CurrencyPair.of(USD, USD), 1d); assertEquals(test.getPair(), CurrencyPair.of(USD, USD)); assertEquals(test.fxRate(USD, USD), 1d, 0); assertEquals(test.toString(), "USD/USD 1"); }
public void test_rate() { DiscountFxForwardRates test = DiscountFxForwardRates.of(CURRENCY_PAIR, FX_RATE, DFCURVE_GBP, DFCURVE_USD); double dfCcyBaseAtMaturity = DFCURVE_GBP.discountFactor(DATE_REF); double dfCcyCounterAtMaturity = DFCURVE_USD.discountFactor(DATE_REF); double expected = FX_RATE.fxRate(GBP, USD) * (dfCcyBaseAtMaturity / dfCcyCounterAtMaturity); assertEquals(test.rate(GBP, DATE_REF), expected, 1e-12); assertEquals(test.rate(USD, DATE_REF), 1d / expected, 1e-12); }
public void test_trade() { FxSwapCurveNode node = FxSwapCurveNode.of(TEMPLATE, QUOTE_ID_PTS); FxSwapTrade trade = node.trade(1d, MARKET_DATA, REF_DATA); double rate = FX_RATE_NEAR.fxRate(EUR_USD); FxSwapTrade expected = TEMPLATE.createTrade(VAL_DATE, BuySell.BUY, 1.0, rate, FX_RATE_PTS, REF_DATA); assertEquals(trade, expected); assertEquals(node.resolvedTrade(1d, MARKET_DATA, REF_DATA), trade.resolve(REF_DATA)); }
public void test_trade() { XCcyIborIborSwapCurveNode node = XCcyIborIborSwapCurveNode.of(TEMPLATE, SPREAD_ID, SPREAD_ADJ); double quantity = -1234.56; SwapTrade trade = node.trade(quantity, MARKET_DATA, REF_DATA); double rate = FX_EUR_USD.fxRate(Currency.EUR, Currency.USD); SwapTrade expected = TEMPLATE.createTrade(VAL_DATE, BUY, -quantity, rate, SPREAD_XCS + SPREAD_ADJ, REF_DATA); assertEquals(trade, expected); assertEquals(node.resolvedTrade(quantity, MARKET_DATA, REF_DATA), trade.resolve(REF_DATA)); }
public void test_impliedVolatility() { double computedCall = PRICER.impliedVolatility(CALL_OTM, RATES_PROVIDER, VOLS); double computedPut = PRICER.impliedVolatility(PUT_ITM, RATES_PROVIDER, VOLS); double timeToExpiry = VOLS.relativeTime(EXPIRY); double forward = PRICER.getDiscountingFxSingleProductPricer().forwardFxRate(FX_PRODUCT_HIGH, RATES_PROVIDER) .fxRate(CURRENCY_PAIR); double expected = SMILE_TERM.volatility(timeToExpiry, STRIKE_RATE_HIGH, forward); assertEquals(computedCall, expected); assertEquals(computedPut, expected); }
public void test_rate_onValuation_noFixing() { ForwardFxIndexRates test = ForwardFxIndexRates.of(GBP_USD_WM, FWD_RATES, SERIES_EMPTY); LocalDate maturityDate = GBP_USD_WM.calculateMaturityFromFixing(DATE_VAL, REF_DATA); double dfCcyBaseAtMaturity = DFCURVE_GBP.discountFactor(maturityDate); double dfCcyCounterAtMaturity = DFCURVE_USD.discountFactor(maturityDate); double expected = FX_RATE.fxRate(GBP, USD) * (dfCcyBaseAtMaturity / dfCcyCounterAtMaturity); assertEquals(test.rate(OBS_VAL, GBP), expected, 1e-8); assertEquals(test.rate(OBS_VAL, USD), 1d / expected, 1e-8); }
public void test_rate_afterValuation() { ForwardFxIndexRates test = ForwardFxIndexRates.of(GBP_USD_WM, FWD_RATES, SERIES); LocalDate maturityDate = GBP_USD_WM.calculateMaturityFromFixing(DATE_AFTER, REF_DATA); double dfCcyBaseAtMaturity = DFCURVE_GBP.discountFactor(maturityDate); double dfCcyCounterAtMaturity = DFCURVE_USD.discountFactor(maturityDate); double expected = FX_RATE.fxRate(GBP, USD) * (dfCcyBaseAtMaturity / dfCcyCounterAtMaturity); assertEquals(test.rate(OBS_AFTER, GBP), expected, 1e-8); assertEquals(test.rate(OBS_AFTER, USD), 1d / expected, 1e-8); }
public void test_price_presentValue_parity() { double df = RATES_PROVIDER.discountFactor(USD, PAYMENT_DATE); double forward = PRICER.getDiscountingFxSingleProductPricer() .forwardFxRate(FX_PRODUCT_HIGH, RATES_PROVIDER).fxRate(CURRENCY_PAIR); double priceCallOtm = PRICER.price(CALL_OTM, RATES_PROVIDER, VOLS); CurrencyAmount pvCallOtm = PRICER.presentValue(CALL_OTM, RATES_PROVIDER, VOLS); double pricePutItm = PRICER.price(PUT_ITM, RATES_PROVIDER, VOLS); CurrencyAmount pvPutItm = PRICER.presentValue(PUT_ITM, RATES_PROVIDER, VOLS); assertEquals(priceCallOtm - pricePutItm, df * (forward - STRIKE_RATE_HIGH), TOL); assertEquals(-pvCallOtm.getAmount() - pvPutItm.getAmount(), df * (forward - STRIKE_RATE_HIGH) * NOTIONAL, NOTIONAL * TOL); }
@Override public CurrencyAmount apply(ImmutableRatesProvider p) { double fwd = FX_PRICER.forwardFxRate(option.getUnderlying(), p).fxRate(CURRENCY_PAIR); double[] strs = smileAtTime.strike(fwd).toArray(); double[] wghts = weights(fwd, strikeRate, strs, timeToExpiry, vols[1]); double res = 0d; for (int j = 0; j < 3; ++j) { res += wghts[j] * (BlackFormulaRepository.price(forwardRate, strs[j], timeToExpiry, vols[j], true) - BlackFormulaRepository.price(forwardRate, strs[j], timeToExpiry, vols[1], true)); } return CurrencyAmount.of(USD, -res * df * NOTIONAL); } }