/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.tutorial.analysis.swap; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.datasets.CalendarGBP; import com.opengamma.analytics.financial.instrument.NotionalProvider; import com.opengamma.analytics.financial.instrument.annuity.AdjustedDateParameters; import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponFixedDefinition; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition; import com.opengamma.analytics.financial.instrument.annuity.CompoundingMethod; import com.opengamma.analytics.financial.instrument.annuity.FixedAnnuityDefinitionBuilder; import com.opengamma.analytics.financial.instrument.annuity.FloatingAnnuityDefinitionBuilder; import com.opengamma.analytics.financial.instrument.annuity.OffsetAdjustedDateParameters; import com.opengamma.analytics.financial.instrument.annuity.OffsetType; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedON; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedONMaster; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.instrument.payment.CouponDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponFixedDefinition; import com.opengamma.analytics.financial.instrument.payment.PaymentDefinition; import com.opengamma.analytics.financial.instrument.swap.SwapCouponFixedCouponDefinition; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap; import com.opengamma.analytics.financial.provider.calculator.discounting.ParRateDiscountingCalculator; import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueCurveSensitivityDiscountingCalculator; import com.opengamma.analytics.financial.provider.calculator.discounting.PresentValueDiscountingCalculator; import com.opengamma.analytics.financial.provider.calculator.generic.MarketQuoteSensitivityBlockCalculator; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; 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.MultipleCurrencyParameterSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.parameter.ParameterSensitivityParameterCalculator; import com.opengamma.analytics.tutorial.datasets.GbpDatasetJuly16; import com.opengamma.analytics.util.export.ExportUtils; import com.opengamma.financial.convention.businessday.BusinessDayConventionFactory; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.rolldate.RollConvention; import com.opengamma.timeseries.precise.zdt.ZonedDateTimeDoubleTimeSeries; import com.opengamma.util.money.Currency; import com.opengamma.util.money.MultipleCurrencyAmount; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; import com.opengamma.util.tuple.Pair; /** * Examples of risk analysis for different swaps in GBP. * Those examples can be used for tutorials. */ @Test(groups = TestGroup.UNIT) public class SwapRiskAnalysisJuly16Gbp { private static final ZonedDateTime VALUATION_DATE = DateUtils.getUTCDate(2014, 7, 16); private static final Calendar LON = new CalendarGBP("LON"); private static final GeneratorSwapFixedONMaster GENERATOR_OIS_MASTER = GeneratorSwapFixedONMaster.getInstance(); private static final GeneratorSwapFixedON GENERATOR_OIS_GBP = GENERATOR_OIS_MASTER.getGenerator("GBP1YSONIA", LON); private static final IndexON GBPSONIA = GENERATOR_OIS_GBP.getIndex(); private static final Currency GBP = Currency.GBP; private static final AdjustedDateParameters ADJUSTED_DATE_SONIA = new AdjustedDateParameters(LON, GENERATOR_OIS_GBP.getBusinessDayConvention()); private static final OffsetAdjustedDateParameters OFFSET_PAY_SONIA = new OffsetAdjustedDateParameters(GENERATOR_OIS_GBP.getPaymentLag(), OffsetType.BUSINESS, LON, BusinessDayConventionFactory.of("Following")); private static final OffsetAdjustedDateParameters OFFSET_FIX_SONIA = new OffsetAdjustedDateParameters(0, OffsetType.BUSINESS, LON, BusinessDayConventionFactory.of("Following")); /** GBP Fixed v SINOA */ private static final LocalDate EFFECTIVE_DATE_1 = LocalDate.of(2014, 11, 6); private static final LocalDate MATURITY_DATE_1 = LocalDate.of(2014, 12, 4); private static final double FIXED_RATE_1 = 0.0051875; private static final boolean PAYER_1 = false; private static final double NOTIONAL_1 = 1000000; // 1m private static final NotionalProvider NOTIONAL_PROV_1 = new NotionalProvider() { @Override public double getAmount(final LocalDate date) { return NOTIONAL_1; } }; /** OIS GBP 1 **/ /** Fixed leg */ private static final PaymentDefinition[] PAYMENT_LEG_1_DEFINITION = new FixedAnnuityDefinitionBuilder(). payer(PAYER_1). currency(GBPSONIA.getCurrency()). notional(NOTIONAL_PROV_1). startDate(EFFECTIVE_DATE_1). endDate(MATURITY_DATE_1). dayCount(GENERATOR_OIS_GBP.getFixedLegDayCount()). accrualPeriodFrequency(GENERATOR_OIS_GBP.getLegsPeriod()). rate(FIXED_RATE_1). accrualPeriodParameters(ADJUSTED_DATE_SONIA). paymentDateAdjustmentParameters(OFFSET_PAY_SONIA). build().getPayments(); private static final CouponFixedDefinition[] CPN_FIXED_1_DEFINITION = new CouponFixedDefinition[PAYMENT_LEG_1_DEFINITION.length]; static { for (int loopcpn = 0; loopcpn < PAYMENT_LEG_1_DEFINITION.length; loopcpn++) { CPN_FIXED_1_DEFINITION[loopcpn] = (CouponFixedDefinition) PAYMENT_LEG_1_DEFINITION[loopcpn]; } } private static final AnnuityCouponFixedDefinition FIXED_LEG_1_DEFINITION = new AnnuityCouponFixedDefinition(CPN_FIXED_1_DEFINITION, LON); /** ON leg */ @SuppressWarnings("unchecked") private static final AnnuityDefinition<? extends CouponDefinition> ON_LEG_1_DEFINITION = (AnnuityDefinition<? extends CouponDefinition>) new FloatingAnnuityDefinitionBuilder(). payer(!PAYER_1). notional(NOTIONAL_PROV_1). startDate(EFFECTIVE_DATE_1). endDate(MATURITY_DATE_1). index(GBPSONIA). accrualPeriodFrequency(GENERATOR_OIS_GBP.getLegsPeriod()). rollDateAdjuster(RollConvention.NONE.getRollDateAdjuster(0)). resetDateAdjustmentParameters(ADJUSTED_DATE_SONIA). accrualPeriodParameters(ADJUSTED_DATE_SONIA). dayCount(GBPSONIA.getDayCount()). fixingDateAdjustmentParameters(OFFSET_FIX_SONIA). currency(GBP). compoundingMethod(CompoundingMethod.FLAT). build(); private static final SwapCouponFixedCouponDefinition SWAP_1_DEFINITION = new SwapCouponFixedCouponDefinition(FIXED_LEG_1_DEFINITION, ON_LEG_1_DEFINITION); /** Curves and fixing */ private static final ZonedDateTimeDoubleTimeSeries TS_FIXED_SONIA_WITHOUT_TODAY = GbpDatasetJuly16.fixingGbpSoniaWithoutLast(); private static final Swap<? extends Payment, ? extends Payment> SWAP_1 = SWAP_1_DEFINITION.toDerivative(VALUATION_DATE, new ZonedDateTimeDoubleTimeSeries[] {TS_FIXED_SONIA_WITHOUT_TODAY, TS_FIXED_SONIA_WITHOUT_TODAY }); /** Calculators **/ private static final PresentValueDiscountingCalculator PVDC = PresentValueDiscountingCalculator.getInstance(); private static final ParRateDiscountingCalculator PRDC = ParRateDiscountingCalculator.getInstance(); private static final PresentValueCurveSensitivityDiscountingCalculator PVCSDC = PresentValueCurveSensitivityDiscountingCalculator.getInstance(); private static final ParameterSensitivityParameterCalculator<ParameterProviderInterface> PSC = new ParameterSensitivityParameterCalculator<>(PVCSDC); private static final MarketQuoteSensitivityBlockCalculator<ParameterProviderInterface> MQSBC = new MarketQuoteSensitivityBlockCalculator<>(PSC); // private static final double TOLERANCE_PV_2 = 1.0E+4; private static final double BP1 = 1.0E-4; @Test public void compareCurves() { final Pair<MulticurveProviderDiscount, CurveBuildingBlockBundle> stdCurveAndBundle = GbpDatasetJuly16.getStandardCurve(VALUATION_DATE); final MulticurveProviderDiscount stdCurve = stdCurveAndBundle.getFirst(); final CurveBuildingBlockBundle stdBundle = stdCurveAndBundle.getSecond(); final Pair<MulticurveProviderDiscount, CurveBuildingBlockBundle> boeCurveAndBundle = GbpDatasetJuly16.getBoeCurve(VALUATION_DATE); final MulticurveProviderDiscount boeCurve = boeCurveAndBundle.getFirst(); final CurveBuildingBlockBundle boeBundle = boeCurveAndBundle.getSecond(); MultipleCurrencyAmount pvStd = SWAP_1.accept(PVDC, stdCurve); MultipleCurrencyAmount pvBoe = SWAP_1.accept(PVDC, boeCurve); double parStd = SWAP_1.accept(PRDC, stdCurve); double parBoe = SWAP_1.accept(PRDC, boeCurve); System.out.println("Swap name,PV STD,PV BOE,PAR STD,PAR BOE"); System.out.println("SWAP_1," + String.valueOf(pvStd.getAmount(GBP)) + "," + String.valueOf(pvBoe.getAmount(GBP)) + "," + String.valueOf(parStd) + "," + String.valueOf(parBoe)); System.out.println("--- STD curve ---"); MultipleCurrencyParameterSensitivity stdSensitivities = MQSBC.fromInstrument(SWAP_1, stdCurve, stdBundle).multipliedBy(BP1); ExportUtils.consolePrint(stdSensitivities, stdCurve); System.out.println("--- BOE curve ---"); MultipleCurrencyParameterSensitivity boeSensitivities = MQSBC.fromInstrument(SWAP_1, boeCurve, boeBundle).multipliedBy(BP1); ExportUtils.consolePrint(boeSensitivities, boeCurve); } }