/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.index; import static com.opengamma.strata.basics.currency.Currency.EUR; import static com.opengamma.strata.basics.date.DayCounts.ACT_ACT_ISDA; import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_3M; import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_6M; import java.time.LocalDate; import java.time.LocalTime; import java.time.ZoneOffset; import com.google.common.collect.ImmutableMap; import com.opengamma.strata.basics.currency.FxMatrix; import com.opengamma.strata.basics.value.Rounding; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.market.curve.CurveMetadata; import com.opengamma.strata.market.curve.CurveName; 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.pricer.model.HullWhiteOneFactorPiecewiseConstantParameters; import com.opengamma.strata.pricer.model.HullWhiteOneFactorPiecewiseConstantParametersProvider; import com.opengamma.strata.pricer.rate.ImmutableRatesProvider; import com.opengamma.strata.product.SecurityId; import com.opengamma.strata.product.TradeInfo; import com.opengamma.strata.product.index.IborFuture; import com.opengamma.strata.product.index.IborFutureTrade; /** * Data set used for testing futures pricers under Hull-White one factor model. */ public class HullWhiteIborFutureDataSet { // Hull-White model parameters private static final double MEAN_REVERSION = 0.01; private static final DoubleArray VOLATILITY = DoubleArray.of(0.01, 0.011, 0.012, 0.013, 0.014); private static final DoubleArray VOLATILITY_TIME = DoubleArray.of(0.5, 1.0, 2.0, 5.0); private static final HullWhiteOneFactorPiecewiseConstantParameters MODEL_PARAMETERS = HullWhiteOneFactorPiecewiseConstantParameters.of(MEAN_REVERSION, VOLATILITY, VOLATILITY_TIME); // Rates provider private static final CurveInterpolator INTERPOLATOR = CurveInterpolators.LINEAR; private static final DoubleArray DSC_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0, 10.0); private static final DoubleArray DSC_RATE = DoubleArray.of(0.0150, 0.0125, 0.0150, 0.0175, 0.0150, 0.0150); /** discounting curve name */ public static final CurveName DSC_NAME = CurveName.of("EUR Dsc"); private static final CurveMetadata META_DSC = Curves.zeroRates(DSC_NAME, ACT_ACT_ISDA); private static final InterpolatedNodalCurve DSC_CURVE = InterpolatedNodalCurve.of(META_DSC, DSC_TIME, DSC_RATE, INTERPOLATOR); private static final DoubleArray FWD3_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0); private static final DoubleArray FWD3_RATE = DoubleArray.of(0.0150, 0.0125, 0.0150, 0.0175, 0.0175, 0.0190, 0.0200, 0.0210); /** Forward curve name */ public static final CurveName FWD3_NAME = CurveName.of("EUR EURIBOR 3M"); private static final CurveMetadata META_FWD3 = Curves.zeroRates(FWD3_NAME, ACT_ACT_ISDA); private static final InterpolatedNodalCurve FWD3_CURVE = InterpolatedNodalCurve.of(META_FWD3, FWD3_TIME, FWD3_RATE, INTERPOLATOR); private static final DoubleArray FWD6_TIME = DoubleArray.of(0.0, 0.5, 1.0, 2.0, 5.0, 10.0); private static final DoubleArray FWD6_RATE = DoubleArray.of(0.0150, 0.0125, 0.0150, 0.0175, 0.0150, 0.0150); /** Forward curve name */ public static final CurveName FWD6_NAME = CurveName.of("EUR EURIBOR 6M"); private static final CurveMetadata META_FWD6 = Curves.zeroRates(FWD6_NAME, ACT_ACT_ISDA); private static final InterpolatedNodalCurve FWD6_CURVE = InterpolatedNodalCurve.of(META_FWD6, FWD6_TIME, FWD6_RATE, INTERPOLATOR); /** * Creates Hull-White one factor model parameters with specified valuation date for swaption * * @param valuationDate the valuation date * @return the parameter provider */ public static HullWhiteOneFactorPiecewiseConstantParametersProvider createHullWhiteProvider(LocalDate valuationDate) { return HullWhiteOneFactorPiecewiseConstantParametersProvider.of( MODEL_PARAMETERS, ACT_ACT_ISDA, valuationDate.atTime(LocalTime.NOON).atZone(ZoneOffset.UTC)); } /** * Creates rates provider with specified valuation date. * * @param valuationDate the valuation date * @return the rates provider */ public static ImmutableRatesProvider createRatesProvider(LocalDate valuationDate) { return ImmutableRatesProvider.builder(valuationDate) .discountCurves(ImmutableMap.of(EUR, DSC_CURVE)) .indexCurves(ImmutableMap.of(EUR_EURIBOR_3M, FWD3_CURVE, EUR_EURIBOR_6M, FWD6_CURVE)) .fxRateProvider(FxMatrix.empty()) .build(); } // Instruments /** Notional of product */ public static final double NOTIONAL = 1000000.0; private static final LocalDate LAST_TRADE_DATE = LocalDate.of(2012, 9, 17); private static final double FUTURE_FACTOR = 0.25; /** Ibor future product */ private static final SecurityId SECURITY_ID = SecurityId.of("OG-Ticker", "FutSec"); public static final IborFuture IBOR_FUTURE = IborFuture.builder() .securityId(SECURITY_ID) .currency(EUR) .notional(NOTIONAL) .lastTradeDate(LAST_TRADE_DATE) .index(EUR_EURIBOR_3M) .accrualFactor(FUTURE_FACTOR) .rounding(Rounding.none()) .build(); /** Quantity of trade */ public static final long QUANTITY = 400L; private static final double REFERENCE_PRICE = 0.99; private static final LocalDate TRADE_DATE = LocalDate.of(2011, 5, 11); private static final TradeInfo TRADE_INFO = TradeInfo.builder().tradeDate(TRADE_DATE).build(); /** Ibor future trade */ public static final IborFutureTrade IBOR_FUTURE_TRADE = IborFutureTrade.builder() .info(TRADE_INFO) .product(IBOR_FUTURE) .quantity(QUANTITY) .price(REFERENCE_PRICE) .build(); /** Last margin price */ public static final double LAST_MARGIN_PRICE = 0.98; }