package com.opengamma.analytics.financial.interestrate.swap.provider;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIbor;
import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIborMaster;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.swap.SwapFixedIborDefinition;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Coupon;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon;
import com.opengamma.analytics.financial.provider.calculator.discounting.ParRateCurveSensitivityDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.ParRateDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueBasisPointCurveSensitivityDiscountingCalculator;
import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueBasisPointDiscountingCalculator;
import com.opengamma.analytics.financial.provider.description.MulticurveProviderDiscountDataSets;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimpleParameterSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimpleParameterSensitivityMulticurveDiscountInterpolatedFDCalculator;
import com.opengamma.analytics.financial.provider.sensitivity.parameter.SimpleParameterSensitivityParameterCalculator;
import com.opengamma.analytics.financial.util.AssertSensitivityObjects;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class SwapFixedCouponMethodTest {
private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2012, 11, 5);
private static final MulticurveProviderDiscount MULTICURVES = MulticurveProviderDiscountDataSets.createMulticurveEurUsd();
private static final IborIndex[] INDEX_LIST = MulticurveProviderDiscountDataSets.getIndexesIborMulticurveEurUsd();
private static final IborIndex EURIBOR6M = INDEX_LIST[1];
private static final Currency EUR = EURIBOR6M.getCurrency();
private static final Calendar CALENDAR = MulticurveProviderDiscountDataSets.getEURCalendar();
private static final GeneratorSwapFixedIbor EUR1YEURIBOR6M = GeneratorSwapFixedIborMaster.getInstance().getGenerator("EUR1YEURIBOR6M", CALENDAR);
private static final ZonedDateTime START_DATE = DateUtils.getUTCDate(2013, 9, 9);
private static final double NOTIONAL = 100000000.0; // 100m
private static final double RATE = 0.0250; // 2.5%
private static final int ANNUITY_TENOR_YEAR = 5;
private static final Period ANNUITY_TENOR = Period.ofYears(ANNUITY_TENOR_YEAR);
private static final SwapFixedIborDefinition SWAP_PAYER_DEFINITION = SwapFixedIborDefinition.from(START_DATE, ANNUITY_TENOR, EUR1YEURIBOR6M, NOTIONAL, RATE, true);
private static final SwapFixedIborDefinition SWAP_RECEIVER_DEFINITION = SwapFixedIborDefinition.from(START_DATE, ANNUITY_TENOR, EUR1YEURIBOR6M, NOTIONAL, RATE, false);
private static final SwapFixedCoupon<Coupon> SWAP_PAYER = SWAP_PAYER_DEFINITION.toDerivative(REFERENCE_DATE);
private static final SwapFixedCoupon<Coupon> SWAP_RECEIVER = SWAP_RECEIVER_DEFINITION.toDerivative(REFERENCE_DATE);
private static final double SHIFT_FD = 1.0E-7;
private static final SwapFixedCouponDiscountingMethod METHOD_SWAP = SwapFixedCouponDiscountingMethod.getInstance();
private static final ParRateDiscountingCalculator PRDC = ParRateDiscountingCalculator.getInstance();
private static final PresentValueBasisPointDiscountingCalculator PVBPDC = PresentValueBasisPointDiscountingCalculator.getInstance();
private static final ParRateCurveSensitivityDiscountingCalculator PRCSDC = ParRateCurveSensitivityDiscountingCalculator.getInstance();
private static final PresentValueBasisPointCurveSensitivityDiscountingCalculator PVBPCSDC =
PresentValueBasisPointCurveSensitivityDiscountingCalculator.getInstance();
private static final SimpleParameterSensitivityParameterCalculator<ParameterProviderInterface> PS_PR_C =
new SimpleParameterSensitivityParameterCalculator<>(PRCSDC);
private static final SimpleParameterSensitivityParameterCalculator<ParameterProviderInterface> PS_PVBP_C =
new SimpleParameterSensitivityParameterCalculator<>(PVBPCSDC);
private static final SimpleParameterSensitivityMulticurveDiscountInterpolatedFDCalculator PS_PR_FDC =
new SimpleParameterSensitivityMulticurveDiscountInterpolatedFDCalculator(PRDC, SHIFT_FD);
private static final SimpleParameterSensitivityMulticurveDiscountInterpolatedFDCalculator PS_PVBP_FDC =
new SimpleParameterSensitivityMulticurveDiscountInterpolatedFDCalculator(PVBPDC, SHIFT_FD);
private static final double TOLERANCE_RATE = 1.0E-10;
private static final double TOLERANCE_RATE_DELTA = 1.0E-8;
private static final double TOLERANCE_PV = 1.0E-2;
private static final double TOLERANCE_PV_DELTA = 1.0E+0;
@Test
/**
* Tests the par rate.
*/
public void parRatePayerReceiver() {
// Payer and receiver have same par rate.
final double parRateRec = SWAP_RECEIVER.accept(PRDC, MULTICURVES);
final double parRatePay = SWAP_PAYER.accept(PRDC, MULTICURVES);
assertEquals("ParRateDiscountingCalculator: swap", parRateRec, parRatePay, TOLERANCE_RATE);
}
@Test
/**
* Tests the par rate calculator for the swaps.
*/
public void parRate() {
final double ratePayer = SWAP_PAYER.accept(PRDC, MULTICURVES);
final double rateReceiver = SWAP_RECEIVER.accept(PRDC, MULTICURVES);
assertEquals("Par Rate swap", ratePayer, rateReceiver, TOLERANCE_RATE);
final double ratePayer2 = PRDC.visitFixedCouponSwap(SWAP_PAYER, EUR1YEURIBOR6M.getFixedLegDayCount(), MULTICURVES);
final double rateReceiver2 = PRDC.visitFixedCouponSwap(SWAP_RECEIVER, EUR1YEURIBOR6M.getFixedLegDayCount(), MULTICURVES);
assertEquals("Par Rate swap", ratePayer2, rateReceiver2, TOLERANCE_RATE);
assertEquals("Par Rate swap", ratePayer2, rateReceiver, TOLERANCE_RATE);
}
@Test
public void parRateCurveSensitivity() {
final SimpleParameterSensitivity psComputed = PS_PR_C.calculateSensitivity(SWAP_PAYER, MULTICURVES, MULTICURVES.getAllNames());
final SimpleParameterSensitivity psFD = PS_PR_FDC.calculateSensitivity(SWAP_PAYER, MULTICURVES);
AssertSensitivityObjects.assertEquals("CashDiscountingProviderMethod: presentValueCurveSensitivity ", psFD, psComputed, TOLERANCE_RATE_DELTA);
}
@Test
public void presentValueBasisPoint() {
double pvbpExpected = 0;
for (int loopcpn = 0; loopcpn < SWAP_PAYER.getFixedLeg().getPayments().length; loopcpn++) {
pvbpExpected += Math.abs(SWAP_PAYER.getFixedLeg().getNthPayment(loopcpn).getPaymentYearFraction())
* MULTICURVES.getDiscountFactor(EUR, SWAP_PAYER.getFixedLeg().getNthPayment(loopcpn).getPaymentTime()) * NOTIONAL;
}
final double pvbpComputed = METHOD_SWAP.presentValueBasisPoint(SWAP_PAYER, MULTICURVES);
assertEquals("SwapFixedCouponMethod: present value basis point", pvbpExpected, pvbpComputed, TOLERANCE_PV); // one cent out of 100m
}
@Test
public void presentValueBasisPointCurveSensitivity() {
final SimpleParameterSensitivity psComputed = PS_PVBP_C.calculateSensitivity(SWAP_PAYER, MULTICURVES, MULTICURVES.getAllNames());
final SimpleParameterSensitivity psFD = PS_PVBP_FDC.calculateSensitivity(SWAP_PAYER, MULTICURVES);
AssertSensitivityObjects.assertEquals("CashDiscountingProviderMethod: presentValueCurveSensitivity ", psFD, psComputed, TOLERANCE_PV_DELTA);
}
}