@Override public double volatility(CurrencyPair currencyPair, double expiry, double strike, double forward) { if (currencyPair.isInverse(this.currencyPair)) { return surface.zValue(expiry, 1d / strike); } return surface.zValue(expiry, strike); }
@Override public double volatility(CurrencyPair currencyPair, double expiryTime, double strike, double forward) { if (currencyPair.isInverse(this.currencyPair)) { return smile.volatility(expiryTime, 1d / strike, 1d / forward); } return smile.volatility(expiryTime, strike, forward); }
public void test_isInverse_CurrencyPair() { CurrencyPair test = CurrencyPair.of(GBP, USD); assertEquals(test.isInverse(test), false); assertEquals(test.isInverse(CurrencyPair.of(GBP, USD)), false); assertEquals(test.isInverse(CurrencyPair.of(USD, GBP)), true); assertEquals(test.isInverse(CurrencyPair.of(GBP, EUR)), false); assertEquals(test.isInverse(CurrencyPair.of(EUR, GBP)), false); assertEquals(test.isInverse(CurrencyPair.of(USD, EUR)), false); assertEquals(test.isInverse(CurrencyPair.of(EUR, USD)), false); }
@ImmutableValidator private void validate() { CurrencyPair pair = index.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"); } }
@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"); } }
public void test_isInverse_CurrencyPair_null() { CurrencyPair test = CurrencyPair.of(GBP, USD); assertThrowsIllegalArg(() -> test.isInverse(null)); }
private CurrencyParameterSensitivity parameterSensitivity(FxOptionSensitivity point) { double expiry = point.getExpiry(); double strike = point.getCurrencyPair().isInverse(currencyPair) ? 1d / point.getStrike() : point.getStrike(); UnitParameterSensitivity unitSens = surface.zValueParameterSensitivity(expiry, strike); return unitSens.multipliedBy(point.getCurrency(), point.getSensitivity()); }
private CurrencyParameterSensitivity parameterSensitivity(FxOptionSensitivity point) { double expiryTime = point.getExpiry(); double strike = currencyPair.isInverse(point.getCurrencyPair()) ? 1d / point.getStrike() : point.getStrike(); double forward = currencyPair.isInverse(point.getCurrencyPair()) ? 1d / point.getForward() : point.getForward(); double pointValue = point.getSensitivity(); DoubleMatrix bucketedSensi = smile.volatilityAndSensitivities(expiryTime, strike, forward).getSensitivities(); double[] times = smile.getExpiries().toArray(); int nTimes = times.length; List<Double> sensiList = new ArrayList<Double>(); List<ParameterMetadata> paramList = new ArrayList<ParameterMetadata>(); for (int i = 0; i < nTimes; ++i) { DoubleArray deltas = smile.getVolatilityTerm().get(i).getDelta(); int nDeltas = deltas.size(); int nDeltasTotal = 2 * nDeltas + 1; double[] deltasTotal = new double[nDeltasTotal]; // absolute delta deltasTotal[nDeltas] = 0.5d; for (int j = 0; j < nDeltas; ++j) { deltasTotal[j] = 1d - deltas.get(j); deltasTotal[2 * nDeltas - j] = deltas.get(j); } for (int j = 0; j < nDeltasTotal; ++j) { sensiList.add(bucketedSensi.get(i, j) * pointValue); DeltaStrike absoluteDelta = DeltaStrike.of(deltasTotal[j]); ParameterMetadata parameterMetadata = FxVolatilitySurfaceYearFractionParameterMetadata.of( times[i], absoluteDelta, currencyPair); paramList.add(parameterMetadata); } } return CurrencyParameterSensitivity.of(name, paramList, point.getCurrency(), DoubleArray.copyOf(sensiList)); }