@Override public double rateIgnoringFixings(IborIndexObservation observation) { LocalDate fixingStartDate = observation.getEffectiveDate(); LocalDate fixingEndDate = observation.getMaturityDate(); double accrualFactor = observation.getYearFraction(); // simply compounded forward rate from discount factors double dfStart = discountFactors.discountFactor(fixingStartDate); double dfEnd = discountFactors.discountFactor(fixingEndDate); return (dfStart / dfEnd - 1) / accrualFactor; }
public void test_discountFactorTimeDerivative() { DiscountFactors test = DiscountFactors.of(GBP, DATE_VAL, CURVE); double relativeYearFraction = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER); double expectedP = test.discountFactor(relativeYearFraction + EPS); double expectedM = test.discountFactor(relativeYearFraction - EPS); assertEquals(test.discountFactorTimeDerivative(relativeYearFraction), (expectedP - expectedM) / (2 * EPS), TOL_FD); }
@Override public double rateFxSpotSensitivity(Currency baseCurrency, LocalDate referenceDate) { ArgChecker.isTrue( currencyPair.contains(baseCurrency), "Currency {} invalid for CurrencyPair {}", baseCurrency, currencyPair); boolean inverse = baseCurrency.equals(currencyPair.getCounter()); double dfCcyBaseAtMaturity = baseCurrencyDiscountFactors.discountFactor(referenceDate); double dfCcyCounterAtMaturity = counterCurrencyDiscountFactors.discountFactor(referenceDate); double forwardRateDelta = dfCcyBaseAtMaturity / dfCcyCounterAtMaturity; return inverse ? 1d / forwardRateDelta : forwardRateDelta; }
public void test_discountFactorTimeDerivative() { DiscountFactors test = DiscountFactors.of(GBP, DATE_VAL, CURVE); double relativeYearFraction = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER); double expectedP = test.discountFactor(relativeYearFraction + EPS); double expectedM = test.discountFactor(relativeYearFraction - EPS); assertEquals(test.discountFactorTimeDerivative(relativeYearFraction), (expectedP - expectedM) / (2 * EPS), TOLERANCE_DELTA_FD); }
@Override public double rate(Currency baseCurrency, LocalDate referenceDate) { ArgChecker.isTrue( currencyPair.contains(baseCurrency), "Currency {} invalid for CurrencyPair {}", baseCurrency, currencyPair); boolean inverse = baseCurrency.equals(currencyPair.getCounter()); double dfCcyBaseAtMaturity = baseCurrencyDiscountFactors.discountFactor(referenceDate); double dfCcyCounterAtMaturity = counterCurrencyDiscountFactors.discountFactor(referenceDate); double forwardRate = fxRateProvider.fxRate(currencyPair) * (dfCcyBaseAtMaturity / dfCcyCounterAtMaturity); return inverse ? 1d / forwardRate : forwardRate; }
public void test_discountFactorTimeDerivative() { DiscountFactors test = DiscountFactors.of(GBP, DATE_VAL, CURVE); double relativeYearFraction = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER); double expectedP = test.discountFactor(relativeYearFraction + EPS); double expectedM = test.discountFactor(relativeYearFraction - EPS); assertEquals(test.discountFactorTimeDerivative(relativeYearFraction), (expectedP - expectedM) / (2 * EPS), TOL_FD); }
private SimpleRatesProvider provider(LocalDate valuationDate, double dfStart, double dfEnd) { DiscountFactors mockDf = mock(DiscountFactors.class); when(mockDf.discountFactor(START_DATE)).thenReturn(dfStart); when(mockDf.discountFactor(END_DATE)).thenReturn(dfEnd); SimpleRatesProvider prov = new SimpleRatesProvider(valuationDate, mockDf); return prov; }
@Override public Double apply(DoublesPair tk) { double dfBase = baseDiscountFactors.discountFactor(tk.getFirst()); double dfCounter = counterDiscountFactors.discountFactor(tk.getFirst()); double forward = todayFx * dfBase / dfCounter; return volatilities.volatility(currencyPair, tk.getFirst(), tk.getSecond(), forward); } };
public void priceFromCurves() { LocalDate settlementDate = VAL_DATE.plusDays(1); double priceComputed = PRICER.priceFromCurves(BILL, PROVIDER, settlementDate); double dfMaturity = DSC_FACTORS_ISSUER.discountFactor(MATURITY_DATE); double dfSettle = DSC_FACTORS_REPO.discountFactor(settlementDate); double priceExpected = dfMaturity/dfSettle; assertEquals(priceComputed, priceExpected, TOLERANCE_PRICE); }
public void test_presentValue() { double computed = PRICER.presentValue(PAYMENT_PERIOD, ISSUER_CURVE); double expected = FIXED_RATE * NOTIONAL * YEAR_FRACTION * DSC_FACTORS.discountFactor(END_ADJUSTED); assertEquals(computed, expected); }
public void priceFromCurves_zspread() { LocalDate settlementDate = VAL_DATE.plusDays(1); double priceComputed = PRICER.priceFromCurvesWithZSpread(BILL, PROVIDER, settlementDate, Z_SPREAD, CompoundedRateType.CONTINUOUS, 0); double dfMaturity = DSC_FACTORS_ISSUER.discountFactor(MATURITY_DATE); double dfSettle = DSC_FACTORS_REPO.discountFactor(settlementDate); double priceExpected = dfMaturity * Math.exp(-Z_SPREAD * DSC_FACTORS_ISSUER.relativeYearFraction(MATURITY_DATE)) / dfSettle; assertEquals(priceComputed, priceExpected, TOLERANCE_PRICE); }
public void yieldFromCurves() { LocalDate settlementDate = VAL_DATE.plusDays(1); double yieldComputed = PRICER.yieldFromCurves(BILL, PROVIDER, settlementDate); double dfMaturity = DSC_FACTORS_ISSUER.discountFactor(MATURITY_DATE); double dfSettle = DSC_FACTORS_REPO.discountFactor(settlementDate); double priceExpected = dfMaturity/dfSettle; double yieldExpected = BILL.yieldFromPrice(priceExpected, settlementDate); assertEquals(yieldComputed, yieldExpected, TOLERANCE_PRICE); }
private SimpleRatesProvider createProvider(LocalDate valDate) { DiscountFactors mockDf = mock(DiscountFactors.class); when(mockDf.discountFactor(PAYMENT_DATE_1)).thenReturn(DISCOUNT_FACTOR); FxIndexRates mockFxRates = mock(FxIndexRates.class); when(mockFxRates.rate(FxIndexObservation.of(GBP_USD_WM, FX_DATE_1, REF_DATA), GBP)).thenReturn(RATE_FX); SimpleRatesProvider prov = new SimpleRatesProvider(valDate); prov.setDayCount(DAY_COUNT); prov.setDiscountFactors(mockDf); prov.setFxIndexRates(mockFxRates); return prov; }
public void test_of() { RepoCurveDiscountFactors test = RepoCurveDiscountFactors.of(DSC_FACTORS, GROUP); assertEquals(test.getRepoGroup(), GROUP); assertEquals(test.getCurrency(), GBP); assertEquals(test.getValuationDate(), DATE); assertEquals(test.discountFactor(DATE_AFTER), DSC_FACTORS.discountFactor(DATE_AFTER)); }
public void test_presentValue() { CurrencyAmount pvComputed = PRICER.presentValue(BILL, PROVIDER); double pvExpected = DSC_FACTORS_ISSUER.discountFactor(MATURITY_DATE) * NOTIONAL.getAmount(); assertEquals(pvComputed.getCurrency(), EUR); assertEquals(pvComputed.getAmount(), pvExpected, TOLERANCE_PV); }
public void test_presentValue_zspread() { CurrencyAmount pvComputed = PRICER.presentValueWithZSpread(BILL, PROVIDER, Z_SPREAD, CompoundedRateType.CONTINUOUS, 0); double pvExpected = DSC_FACTORS_ISSUER.discountFactor(MATURITY_DATE) * NOTIONAL.getAmount() * Math.exp(-Z_SPREAD * DSC_FACTORS_ISSUER.relativeYearFraction(MATURITY_DATE)); assertEquals(pvComputed.getCurrency(), EUR); assertEquals(pvComputed.getAmount(), pvExpected, TOLERANCE_PV); }
public void test_dirtyPriceFromCurvesWithZSpread_continuous() { double computed = PRICER.dirtyPriceFromCurvesWithZSpread( PRODUCT, PROVIDER, REF_DATA, Z_SPREAD, CONTINUOUS, 0); CurrencyAmount pv = PRICER.presentValueWithZSpread(PRODUCT, PROVIDER, Z_SPREAD, CONTINUOUS, 0); LocalDate settlement = DATE_OFFSET.adjust(VAL_DATE, REF_DATA); double df = DSC_FACTORS_REPO.discountFactor(settlement); assertEquals(computed, pv.getAmount() / df / NOTIONAL); }
public void test_dirtyPriceFromCurves() { double computed = PRICER.dirtyPriceFromCurves(PRODUCT, PROVIDER, REF_DATA); CurrencyAmount pv = PRICER.presentValue(PRODUCT, PROVIDER); LocalDate settlement = DATE_OFFSET.adjust(VAL_DATE, REF_DATA); double df = DSC_FACTORS_REPO.discountFactor(settlement); assertEquals(computed, pv.getAmount() / df / NOTIONAL); }
public void test_dirtyPriceFromCurvesWithZSpread_periodic() { double computed = PRICER.dirtyPriceFromCurvesWithZSpread( PRODUCT, PROVIDER, REF_DATA, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); CurrencyAmount pv = PRICER.presentValueWithZSpread( PRODUCT, PROVIDER, Z_SPREAD, PERIODIC, PERIOD_PER_YEAR); LocalDate settlement = DATE_OFFSET.adjust(VAL_DATE, REF_DATA); double df = DSC_FACTORS_REPO.discountFactor(settlement); assertEquals(computed, pv.getAmount() / df / NOTIONAL); }
@Override public PointSensitivityBuilder presentValueSensitivity(FxResetNotionalExchange event, RatesProvider provider) { DiscountFactors discountFactors = provider.discountFactors(event.getCurrency()); PointSensitivityBuilder sensiDsc = discountFactors.zeroRatePointSensitivity(event.getPaymentDate()); sensiDsc = sensiDsc.multipliedBy(forecastValue(event, provider)); PointSensitivityBuilder sensiFx = forecastValueSensitivity(event, provider); sensiFx = sensiFx.multipliedBy(discountFactors.discountFactor(event.getPaymentDate())); return sensiDsc.combinedWith(sensiFx); }