/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.deposit;
import static com.opengamma.strata.basics.currency.Currency.EUR;
import static com.opengamma.strata.basics.date.BusinessDayConventions.MODIFIED_FOLLOWING;
import static com.opengamma.strata.basics.date.DayCounts.ACT_ACT_ISDA;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.EUTA;
import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_6M;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.time.LocalDate;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.basics.date.BusinessDayAdjustment;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.market.curve.Curves;
import com.opengamma.strata.market.curve.InterpolatedNodalCurve;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolator;
import com.opengamma.strata.market.curve.interpolator.CurveInterpolators;
import com.opengamma.strata.market.sensitivity.PointSensitivities;
import com.opengamma.strata.pricer.rate.ImmutableRatesProvider;
import com.opengamma.strata.product.TradeInfo;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.deposit.IborFixingDeposit;
import com.opengamma.strata.product.deposit.IborFixingDepositTrade;
import com.opengamma.strata.product.deposit.ResolvedIborFixingDeposit;
import com.opengamma.strata.product.deposit.ResolvedIborFixingDepositTrade;
/**
* Tests {@link DiscountingIborFixingDepositTradePricer}.
*/
@Test
public class DiscountingIborFixingDepositTradePricerTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final LocalDate VAL_DATE = LocalDate.of(2014, 1, 16);
private static final LocalDate START_DATE = LocalDate.of(2014, 1, 24);
private static final LocalDate END_DATE = LocalDate.of(2014, 7, 24);
private static final double NOTIONAL = 100_000_000d;
private static final double RATE = 0.0150;
private static final BusinessDayAdjustment BD_ADJ = BusinessDayAdjustment.of(MODIFIED_FOLLOWING, EUTA);
private static final IborFixingDeposit DEPOSIT_PRODUCT = IborFixingDeposit.builder()
.buySell(BuySell.BUY)
.notional(NOTIONAL)
.startDate(START_DATE)
.endDate(END_DATE)
.businessDayAdjustment(BD_ADJ)
.index(EUR_EURIBOR_6M)
.fixedRate(RATE)
.build();
private static final ResolvedIborFixingDeposit RDEPOSIT_PRODUCT = DEPOSIT_PRODUCT.resolve(REF_DATA);
private static final IborFixingDepositTrade DEPOSIT_TRADE =
IborFixingDepositTrade.builder().product(DEPOSIT_PRODUCT).info(TradeInfo.empty()).build();
private static final ResolvedIborFixingDepositTrade RDEPOSIT_TRADE = DEPOSIT_TRADE.resolve(REF_DATA);
private static final ImmutableRatesProvider IMM_PROV;
static {
CurveInterpolator interp = CurveInterpolators.DOUBLE_QUADRATIC;
DoubleArray time_eur = DoubleArray.of(0.0, 0.1, 0.25, 0.5, 0.75, 1.0, 2.0);
DoubleArray rate_eur = DoubleArray.of(0.0160, 0.0165, 0.0155, 0.0155, 0.0155, 0.0150, 0.014);
InterpolatedNodalCurve dscCurve =
InterpolatedNodalCurve.of(Curves.zeroRates("EUR-Discount", ACT_ACT_ISDA), time_eur, rate_eur, interp);
DoubleArray time_index = DoubleArray.of(0.0, 0.25, 0.5, 1.0);
DoubleArray rate_index = DoubleArray.of(0.0180, 0.0180, 0.0175, 0.0165);
InterpolatedNodalCurve indexCurve =
InterpolatedNodalCurve.of(Curves.zeroRates("EUR-EURIBOR6M", ACT_ACT_ISDA), time_index, rate_index, interp);
IMM_PROV = ImmutableRatesProvider.builder(VAL_DATE)
.discountCurve(EUR, dscCurve)
.iborIndexCurve(EUR_EURIBOR_6M, indexCurve)
.build();
}
private static final DiscountingIborFixingDepositProductPricer PRICER_PRODUCT =
DiscountingIborFixingDepositProductPricer.DEFAULT;
private static final DiscountingIborFixingDepositTradePricer PRICER_TRADE =
DiscountingIborFixingDepositTradePricer.DEFAULT;
private static final double TOLERANCE_PV = 1E-2;
private static final double TOLERANCE_PV_DELTA = 1E-2;
private static final double TOLERANCE_RATE = 1E-8;
//-------------------------------------------------------------------------
public void test_presentValue() {
CurrencyAmount pvTrade = PRICER_TRADE.presentValue(RDEPOSIT_TRADE, IMM_PROV);
CurrencyAmount pvProduct = PRICER_PRODUCT.presentValue(RDEPOSIT_PRODUCT, IMM_PROV);
assertEquals(pvTrade.getCurrency(), pvProduct.getCurrency());
assertEquals(pvTrade.getAmount(), pvProduct.getAmount(), TOLERANCE_PV);
}
//-------------------------------------------------------------------------
public void test_presentValueSensitivity() {
PointSensitivities ptsTrade = PRICER_TRADE.presentValueSensitivity(RDEPOSIT_TRADE, IMM_PROV);
PointSensitivities ptsProduct = PRICER_PRODUCT.presentValueSensitivity(RDEPOSIT_PRODUCT, IMM_PROV);
assertTrue(ptsTrade.equalWithTolerance(ptsProduct, TOLERANCE_PV_DELTA));
}
//-------------------------------------------------------------------------
public void test_parRate() {
double psTrade = PRICER_TRADE.parRate(RDEPOSIT_TRADE, IMM_PROV);
double psProduct = PRICER_PRODUCT.parRate(RDEPOSIT_PRODUCT, IMM_PROV);
assertEquals(psTrade, psProduct, TOLERANCE_RATE);
}
//-------------------------------------------------------------------------
public void test_parRateSensitivity() {
PointSensitivities ptsTrade = PRICER_TRADE.parRateSensitivity(RDEPOSIT_TRADE, IMM_PROV);
PointSensitivities ptsProduct = PRICER_PRODUCT.parRateSensitivity(RDEPOSIT_PRODUCT, IMM_PROV);
assertTrue(ptsTrade.equalWithTolerance(ptsProduct, TOLERANCE_PV_DELTA));
}
//-------------------------------------------------------------------------
public void test_parSpread() {
double psTrade = PRICER_TRADE.parSpread(RDEPOSIT_TRADE, IMM_PROV);
double psProduct = PRICER_PRODUCT.parSpread(RDEPOSIT_PRODUCT, IMM_PROV);
assertEquals(psTrade, psProduct, TOLERANCE_RATE);
}
//-------------------------------------------------------------------------
public void test_parSpreadSensitivity() {
PointSensitivities ptsTrade = PRICER_TRADE.parSpreadSensitivity(RDEPOSIT_TRADE, IMM_PROV);
PointSensitivities ptsProduct = PRICER_PRODUCT.parSpreadSensitivity(RDEPOSIT_PRODUCT, IMM_PROV);
assertTrue(ptsTrade.equalWithTolerance(ptsProduct, TOLERANCE_PV_DELTA));
}
}