/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.payments.provider;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityCapFloorIborDefinition;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorIbor;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.model.interestrate.definition.HullWhiteOneFactorPiecewiseConstantParameters;
import com.opengamma.analytics.financial.model.option.definition.SABRInterestRateParameters;
import com.opengamma.analytics.financial.provider.calculator.sabrcap.PresentValueSABRCapCalculator;
import com.opengamma.analytics.financial.provider.description.MulticurveProviderDiscountDataSets;
import com.opengamma.analytics.financial.provider.description.SABRDataSets;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.SABRCapProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.SABRCapProviderInterface;
import com.opengamma.analytics.financial.provider.method.SuccessiveRootFinderHullWhiteCalibrationEngine;
import com.opengamma.analytics.financial.provider.method.SuccessiveRootFinderHullWhiteCalibrationObjective;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.MultipleCurrencyAmount;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Tests related to the calibration engine for Hull-White one factor calibration to cap/floor.
*/
@Test(groups = TestGroup.UNIT)
public class CapFloorHullWhiteCalibrationObjectiveTest {
private static final MulticurveProviderDiscount MULTICURVES = MulticurveProviderDiscountDataSets.createMulticurveEurUsd();
private static final IborIndex EURIBOR3M = MulticurveProviderDiscountDataSets.getIndexesIborMulticurveEurUsd()[0];
private static final Currency EUR = EURIBOR3M.getCurrency();
private static final Calendar CALENDAR = MulticurveProviderDiscountDataSets.getEURCalendar();
// Cap/floor description
private static final ZonedDateTime SETTLEMENT_DATE = DateUtils.getUTCDate(2011, 9, 9);
private static final ZonedDateTime MATURITY_DATE = SETTLEMENT_DATE.plusYears(5);
private static final double NOTIONAL = 100000000; //100m
private static final double STRIKE = 0.04;
private static final boolean IS_CAP = true;
private static final boolean IS_PAYER = false;
private static final AnnuityCapFloorIborDefinition CAP_DEFINITION = AnnuityCapFloorIborDefinition.fromWithNoInitialCaplet(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, EURIBOR3M, IS_PAYER, STRIKE,
IS_CAP, CALENDAR);
// To derivative
private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2011, 9, 7);
private static final SABRInterestRateParameters SABR_PARAMETER = SABRDataSets.createSABR1();
private static final SABRCapProviderDiscount SABR_MULTICURVES = new SABRCapProviderDiscount(MULTICURVES, SABR_PARAMETER, EURIBOR3M);
private static final Annuity<? extends Payment> CAP = CAP_DEFINITION.toDerivative(REFERENCE_DATE);
private static final PresentValueSABRCapCalculator PVSCC = PresentValueSABRCapCalculator.getInstance();
private static final CapFloorIborHullWhiteMethod METHOD_CAP_HW = CapFloorIborHullWhiteMethod.getInstance();
private static final double TOLERANCE_PV = 1.0E-2;
@Test
/**
* Tests the correctness of Hull-White one factor calibration to swaptions with SABR price.
*/
public void calibration() {
final double meanReversion = 0.01;
final HullWhiteOneFactorPiecewiseConstantParameters hwParameters = new HullWhiteOneFactorPiecewiseConstantParameters(meanReversion, new double[] {0.01}, new double[0]);
final SuccessiveRootFinderHullWhiteCalibrationObjective objective = new SuccessiveRootFinderHullWhiteCalibrationObjective(hwParameters, EUR);
final SuccessiveRootFinderHullWhiteCalibrationEngine<SABRCapProviderInterface> calibrationEngine = new SuccessiveRootFinderHullWhiteCalibrationEngine<>(objective);
for (int loopexp = 0; loopexp < CAP.getNumberOfPayments(); loopexp++) {
calibrationEngine.addInstrument(CAP.getNthPayment(loopexp), PVSCC);
}
calibrationEngine.calibrate(SABR_MULTICURVES);
final MultipleCurrencyAmount[] pvSabr = new MultipleCurrencyAmount[CAP.getNumberOfPayments()];
final MultipleCurrencyAmount[] pvHw = new MultipleCurrencyAmount[CAP.getNumberOfPayments()];
for (int loopexp = 0; loopexp < CAP.getNumberOfPayments(); loopexp++) {
pvSabr[loopexp] = CAP.getNthPayment(loopexp).accept(PVSCC, SABR_MULTICURVES);
pvHw[loopexp] = METHOD_CAP_HW.presentValue((CapFloorIbor) CAP.getNthPayment(loopexp), objective.getHwProvider());
assertEquals("Hull-White calibration: cap/floor " + loopexp, pvSabr[loopexp].getAmount(EUR), pvHw[loopexp].getAmount(EUR), TOLERANCE_PV);
}
}
}