@Override public Double apply(Double t) { return baseDiscountFactors.zeroRate(t); } };
@Override public Double apply(Double t) { return counterDiscountFactors.zeroRate(t); } };
/** * Gets the continuously compounded zero rate for the specified date. * <p> * The continuously compounded zero rate is coherent to {@link #discountFactor(LocalDate)} along with * year fraction which is computed internally in each implementation. * * @param date the date to discount to * @return the zero rate * @throws RuntimeException if the value cannot be obtained */ public default double zeroRate(LocalDate date) { double yearFraction = relativeYearFraction(date); return zeroRate(yearFraction); }
public void test_theta_presentValueTheta_atExpiry() { double computedThetaCall = PRICER.theta(CALL_UKI, RATE_PROVIDER_EXPIRY, VOLS_EXPIRY); double computedThetaPut = PRICER.theta(PUT_UKO_BASE, RATE_PROVIDER_EXPIRY, VOLS_EXPIRY); CurrencyAmount computedPvThetaCall = PRICER.presentValueTheta(CALL_UKI, RATE_PROVIDER_EXPIRY, VOLS_EXPIRY); CurrencyAmount computedPvThetaPut = PRICER.presentValueTheta(PUT_UKO_BASE, RATE_PROVIDER_EXPIRY, VOLS_EXPIRY); double rateBase = RATE_PROVIDER_EXPIRY.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER_EXPIRY.discountFactors(USD).zeroRate(PAY_DATE); double expectedThetaCall = -(REBATE_AMOUNT / NOTIONAL) * rateCounter; double expectedThetaPut = -rateCounter * STRIKE_RATE + rateBase * SPOT; expectedThetaCall *= -1d; expectedThetaPut *= -1d; assertEquals(computedThetaCall, expectedThetaCall, TOL); assertEquals(computedThetaPut, expectedThetaPut, TOL); assertEquals(computedPvThetaCall.getAmount(), expectedThetaCall * NOTIONAL, TOL * NOTIONAL); assertEquals(computedPvThetaPut.getAmount(), -expectedThetaPut * NOTIONAL, TOL); }
public void test_price_presentValue() { double computedPriceCall = PRICER.price(CALL_UKI, RATE_PROVIDER, VOLS); double computedPricePut = PRICER.price(PUT_UKO_BASE, RATE_PROVIDER, VOLS); CurrencyAmount computedPvCall = PRICER.presentValue(CALL_UKI, RATE_PROVIDER, VOLS); CurrencyAmount computedPvPut = PRICER.presentValue(PUT_UKO_BASE, RATE_PROVIDER, VOLS); double rateBase = RATE_PROVIDER.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER.discountFactors(USD).zeroRate(PAY_DATE); double costOfCarry = rateCounter - rateBase; double forward = RATE_PROVIDER.fxForwardRates(CURRENCY_PAIR).rate(EUR, PAY_DATE); double volatility = VOLS.volatility(CURRENCY_PAIR, EXPIRY_DATETIME, STRIKE_RATE, forward); double timeToExpiry = VOLS.relativeTime(EXPIRY_DATETIME); double rebateRate = REBATE_AMOUNT / NOTIONAL; double expectedCash = CASH_REBATE_PRICER.price(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKO); double expectedAsset = ASSET_REBATE_PRICER.price(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKI); double expectedPriceCall = BARRIER_PRICER.price(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, true, BARRIER_UKI) + rebateRate * expectedCash; double expectedPricePut = BARRIER_PRICER.price(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, false, BARRIER_UKO) + rebateRate * expectedAsset; assertEquals(computedPriceCall, expectedPriceCall, TOL); assertEquals(computedPricePut, expectedPricePut, TOL); assertEquals(computedPvCall.getCurrency(), USD); assertEquals(computedPvPut.getCurrency(), USD); assertEquals(computedPvCall.getAmount(), expectedPriceCall * NOTIONAL, TOL); assertEquals(computedPvPut.getAmount(), -expectedPricePut * NOTIONAL, TOL); }
FxOptionSensitivity computedPut = (FxOptionSensitivity) PRICER.presentValueSensitivityModelParamsVolatility(PUT_UKO_BASE, RATE_PROVIDER, VOLS); double rateBase = RATE_PROVIDER.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER.discountFactors(USD).zeroRate(PAY_DATE); double costOfCarry = rateCounter - rateBase; double forward = RATE_PROVIDER.fxForwardRates(CURRENCY_PAIR).rate(EUR, PAY_DATE);
public void test_theta_presentValueTheta() { double computedThetaCall = PRICER.theta(CALL_UKI, RATE_PROVIDER, VOLS); double computedThetaPut = PRICER.theta(PUT_UKO_BASE, RATE_PROVIDER, VOLS); CurrencyAmount computedPvThetaCall = PRICER.presentValueTheta(CALL_UKI, RATE_PROVIDER, VOLS); CurrencyAmount computedPvThetaPut = PRICER.presentValueTheta(PUT_UKO_BASE, RATE_PROVIDER, VOLS); double rateBase = RATE_PROVIDER.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER.discountFactors(USD).zeroRate(PAY_DATE); double costOfCarry = rateCounter - rateBase; double forward = RATE_PROVIDER.fxForwardRates(CURRENCY_PAIR).rate(EUR, PAY_DATE); double volatility = VOLS.volatility(CURRENCY_PAIR, EXPIRY_DATETIME, STRIKE_RATE, forward); double timeToExpiry = VOLS.relativeTime(EXPIRY_DATETIME); double rebateRate = REBATE_AMOUNT / NOTIONAL; double expectedCash = CASH_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKO).getDerivative(4); double expectedAsset = ASSET_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKI).getDerivative(4); double expectedThetaCall = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, true, BARRIER_UKI).getDerivative(5) + rebateRate * expectedCash; double expectedThetaPut = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, false, BARRIER_UKO).getDerivative(5) + rebateRate * expectedAsset; expectedThetaCall *= -1d; expectedThetaPut *= -1d; assertEquals(computedThetaCall, expectedThetaCall, TOL); assertEquals(computedThetaPut, expectedThetaPut, TOL); assertEquals(computedPvThetaCall.getCurrency(), USD); assertEquals(computedPvThetaPut.getCurrency(), USD); assertEquals(computedPvThetaCall.getAmount(), expectedThetaCall * NOTIONAL, TOL); assertEquals(computedPvThetaPut.getAmount(), -expectedThetaPut * NOTIONAL, TOL); }
public void test_gamma_presentValueGamma() { double computedGammaCall = PRICER.gamma(CALL_UKI, RATE_PROVIDER, VOLS); double computedGammaPut = PRICER.gamma(PUT_UKO_BASE, RATE_PROVIDER, VOLS); CurrencyAmount computedPvGammaCall = PRICER.presentValueGamma(CALL_UKI, RATE_PROVIDER, VOLS); CurrencyAmount computedPvGammaPut = PRICER.presentValueGamma(PUT_UKO_BASE, RATE_PROVIDER, VOLS); double rateBase = RATE_PROVIDER.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER.discountFactors(USD).zeroRate(PAY_DATE); double costOfCarry = rateCounter - rateBase; double forward = RATE_PROVIDER.fxForwardRates(CURRENCY_PAIR).rate(EUR, PAY_DATE); double volatility = VOLS.volatility(CURRENCY_PAIR, EXPIRY_DATETIME, STRIKE_RATE, forward); double timeToExpiry = VOLS.relativeTime(EXPIRY_DATETIME); double rebateRate = REBATE_AMOUNT / NOTIONAL; double expectedCash = CASH_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKO).getDerivative(5); double expectedAsset = ASSET_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKI).getDerivative(5); double expectedGammaCall = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, true, BARRIER_UKI).getDerivative(6) + rebateRate * expectedCash; double expectedGammaPut = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, false, BARRIER_UKO).getDerivative(6) + rebateRate * expectedAsset; assertEquals(computedGammaCall, expectedGammaCall, TOL); assertEquals(computedGammaPut, expectedGammaPut, TOL); assertEquals(computedPvGammaCall.getCurrency(), USD); assertEquals(computedPvGammaPut.getCurrency(), USD); assertEquals(computedPvGammaCall.getAmount(), expectedGammaCall * NOTIONAL, TOL); assertEquals(computedPvGammaPut.getAmount(), -expectedGammaPut * NOTIONAL, TOL); }
public void test_delta_presentValueDelta() { double computedDeltaCall = PRICER.delta(CALL_UKI, RATE_PROVIDER, VOLS); double computedDeltaPut = PRICER.delta(PUT_UKO_BASE, RATE_PROVIDER, VOLS); CurrencyAmount computedPvDeltaCall = PRICER.presentValueDelta(CALL_UKI, RATE_PROVIDER, VOLS); CurrencyAmount computedPvDeltaPut = PRICER.presentValueDelta(PUT_UKO_BASE, RATE_PROVIDER, VOLS); double rateBase = RATE_PROVIDER.discountFactors(EUR).zeroRate(PAY_DATE); double rateCounter = RATE_PROVIDER.discountFactors(USD).zeroRate(PAY_DATE); double costOfCarry = rateCounter - rateBase; double forward = RATE_PROVIDER.fxForwardRates(CURRENCY_PAIR).rate(EUR, PAY_DATE); double volatility = VOLS.volatility(CURRENCY_PAIR, EXPIRY_DATETIME, STRIKE_RATE, forward); double timeToExpiry = VOLS.relativeTime(EXPIRY_DATETIME); double rebateRate = REBATE_AMOUNT / NOTIONAL; double expectedCash = CASH_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKO).getDerivative(0); double expectedAsset = ASSET_REBATE_PRICER .priceAdjoint(SPOT, timeToExpiry, costOfCarry, rateCounter, volatility, BARRIER_UKI).getDerivative(0); double expectedDeltaCall = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, true, BARRIER_UKI).getDerivative(0) + rebateRate * expectedCash; double expectedDeltaPut = BARRIER_PRICER.priceAdjoint(SPOT, STRIKE_RATE, timeToExpiry, costOfCarry, rateCounter, volatility, false, BARRIER_UKO).getDerivative(0) + rebateRate * expectedAsset; assertEquals(computedDeltaCall, expectedDeltaCall, TOL); assertEquals(computedDeltaPut, expectedDeltaPut, TOL); assertEquals(computedPvDeltaCall.getCurrency(), USD); assertEquals(computedPvDeltaPut.getCurrency(), USD); assertEquals(computedPvDeltaCall.getAmount(), expectedDeltaCall * NOTIONAL, TOL); assertEquals(computedPvDeltaPut.getAmount(), -expectedDeltaPut * NOTIONAL, TOL); }
DiscountFactors counterDiscountFactors = ratesProvider.discountFactors(ccyCounter); double rateBase = baseDiscountFactors.zeroRate(underlyingFx.getPaymentDate()); double rateCounter = counterDiscountFactors.zeroRate(underlyingFx.getPaymentDate()); double costOfCarry = rateCounter - rateBase; double dfBase = baseDiscountFactors.discountFactor(underlyingFx.getPaymentDate());
DiscountFactors counterDiscountFactors = ratesProvider.discountFactors(ccyCounter); double rateBase = baseDiscountFactors.zeroRate(underlyingFx.getPaymentDate()); double rateCounter = counterDiscountFactors.zeroRate(underlyingFx.getPaymentDate()); double costOfCarry = rateCounter - rateBase; double dfBase = baseDiscountFactors.discountFactor(underlyingFx.getPaymentDate());