package com.opengamma.strata.pricer.fxopt;
import static com.opengamma.strata.basics.currency.Currency.EUR;
import static com.opengamma.strata.basics.currency.Currency.USD;
import static com.opengamma.strata.basics.date.DayCounts.ACT_365F;
import static com.opengamma.strata.basics.date.DayCounts.ACT_ACT_ISDA;
import static com.opengamma.strata.market.curve.interpolator.CurveExtrapolators.FLAT;
import static com.opengamma.strata.market.curve.interpolator.CurveInterpolators.DOUBLE_QUADRATIC;
import java.time.ZonedDateTime;
import com.opengamma.strata.basics.currency.CurrencyPair;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.collect.array.DoubleMatrix;
/**
* Sets of volatility data used in FX option tests.
*/
public class FxVolatilitySmileDataSet {
private static final CurrencyPair CURRENCY_PAIR = CurrencyPair.of(EUR, USD);
private static final DoubleArray DELTA = DoubleArray.of(0.10, 0.25);
private static final DoubleArray TIME_5 =
DoubleArray.of(0.25205479452054796, 0.5013698630136987, 1.0015120892282356, 2.0, 5.001512089228235);
private static final DoubleArray ATM_5 = DoubleArray.of(0.185, 0.18, 0.17, 0.16, 0.16);
private static final DoubleArray ATM_5_FLAT = DoubleArray.of(0.18, 0.18, 0.18, 0.18, 0.18);
private static final DoubleMatrix RISK_REVERSAL_5 = DoubleMatrix.ofUnsafe(
new double[][] { {-0.011, -0.006 }, {-0.012, -0.007 }, {-0.013, -0.008 }, {-0.014, -0.009 }, {-0.014, -0.009 } });
private static final DoubleMatrix STRANGLE_5 = DoubleMatrix.ofUnsafe(
new double[][] { {0.0310, 0.0110 }, {0.0320, 0.0120 }, {0.0330, 0.0130 }, {0.0340, 0.0140 }, {0.0340, 0.0140 } });
private static final InterpolatedStrikeSmileDeltaTermStructure SMILE_TERM_5 =
InterpolatedStrikeSmileDeltaTermStructure.of(TIME_5, DELTA, ATM_5, RISK_REVERSAL_5, STRANGLE_5, ACT_ACT_ISDA);
private static final DoubleArray ATM_5_MRKT = DoubleArray.of(0.0875, 0.0925, 0.0950, 0.0950, 0.0950);
private static final DoubleMatrix RISK_REVERSAL_5_MRKT = DoubleMatrix.ofUnsafe(new double[][] { {-0.0190, -0.0110 },
{-0.0205, -0.0115 }, {-0.0220, -0.0112 }, {-0.0190, -0.0105 }, {-0.0190, -0.0105 } });
private static final DoubleMatrix STRANGLE_5_MRKT = DoubleMatrix.ofUnsafe(
new double[][] { {0.0094, 0.0030 }, {0.0110, 0.0035 }, {0.0130, 0.0038 }, {0.0130, 0.0038 }, {0.0130, 0.0038 } });
private static final InterpolatedStrikeSmileDeltaTermStructure SMILE_TERM_5_MRKT =
InterpolatedStrikeSmileDeltaTermStructure.of(
TIME_5, DELTA, ATM_5_MRKT, RISK_REVERSAL_5_MRKT, STRANGLE_5_MRKT, ACT_ACT_ISDA, DOUBLE_QUADRATIC, FLAT, FLAT);
private static final DoubleMatrix RISK_REVERSAL_5_FLAT = DoubleMatrix.ofUnsafe(
new double[][] { {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 } });
private static final DoubleMatrix STRANGLE_5_FLAT = DoubleMatrix.ofUnsafe(
new double[][] { {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 }, {0.0, 0.0 } });
private static final InterpolatedStrikeSmileDeltaTermStructure SMILE_TERM_5_FLAT =
InterpolatedStrikeSmileDeltaTermStructure.of(
TIME_5, DELTA, ATM_5, RISK_REVERSAL_5_FLAT, STRANGLE_5_FLAT, ACT_ACT_ISDA);
private static final InterpolatedStrikeSmileDeltaTermStructure SMILE_TERM_5_FLAT_FLAT =
InterpolatedStrikeSmileDeltaTermStructure.of(
TIME_5, DELTA, ATM_5_FLAT, RISK_REVERSAL_5_FLAT, STRANGLE_5_FLAT, ACT_ACT_ISDA);
private static final DoubleArray TIME_6 = DoubleArray.of(0.01, 0.252, 0.501, 1.0, 2.0, 5.0);
private static final DoubleArray ATM_6 = DoubleArray.of(0.175, 0.185, 0.18, 0.17, 0.16, 0.16);
private static final DoubleMatrix RISK_REVERSAL_6 = DoubleMatrix.ofUnsafe(new double[][] {
{-0.010, -0.0050 }, {-0.011, -0.0060 }, {-0.012, -0.0070 },
{-0.013, -0.0080 }, {-0.014, -0.0090 }, {-0.014, -0.0090 } });
private static final DoubleMatrix STRANGLE_6 = DoubleMatrix.ofUnsafe(new double[][] {
{0.0300, 0.0100 }, {0.0310, 0.0110 }, {0.0320, 0.0120 },
{0.0330, 0.0130 }, {0.0340, 0.0140 }, {0.0340, 0.0140 } });
private static final InterpolatedStrikeSmileDeltaTermStructure SMILE_TERM_6 =
InterpolatedStrikeSmileDeltaTermStructure.of(TIME_6, DELTA, ATM_6, RISK_REVERSAL_6, STRANGLE_6, ACT_365F);
private static final FxOptionVolatilitiesName NAME = FxOptionVolatilitiesName.of("Test");
/**
* Creates volatility provider with term structure of smile parameters.
* <p>
* The number of time slices are 5, and the day count convention is ACT/ACT ISDA.
*
* @param dateTime the valuation date time
* @return the volatility provider
*/
public static BlackFxOptionSmileVolatilities createVolatilitySmileProvider5(ZonedDateTime dateTime) {
return BlackFxOptionSmileVolatilities.of(NAME, CURRENCY_PAIR, dateTime, SMILE_TERM_5);
}
/**
* Creates volatility provider with term structure of smile parameters.
* <p>
* The number of time slices are 5, and the day count convention is ACT/ACT ISDA.
*
* @param dateTime the valuation date time
* @return the volatility provider
*/
public static BlackFxOptionSmileVolatilities createVolatilitySmileProvider5Market(ZonedDateTime dateTime) {
return BlackFxOptionSmileVolatilities.of(NAME, CURRENCY_PAIR, dateTime, SMILE_TERM_5_MRKT);
}
/**
* Creates volatility provider with term structure of smile parameters.
* <p>
* The resulting volatility surface is flat along the strike direction.
* The number of time slices are 5, and the day count convention is ACT/ACT ISDA.
*
* @param dateTime the valuation date time
* @return the volatility provider
*/
public static BlackFxOptionSmileVolatilities createVolatilitySmileProvider5Flat(ZonedDateTime dateTime) {
return BlackFxOptionSmileVolatilities.of(NAME, CURRENCY_PAIR, dateTime, SMILE_TERM_5_FLAT);
}
/**
* Creates volatility provider with term structure of smile parameters.
* <p>
* The resulting volatility surface is totally flat.
* The number of time slices are 5, and the day count convention is ACT/ACT ISDA.
*
* @param dateTime the valuation date time
* @return the volatility provider
*/
public static BlackFxOptionSmileVolatilities createVolatilitySmileProvider5FlatFlat(ZonedDateTime dateTime) {
return BlackFxOptionSmileVolatilities.of(NAME, CURRENCY_PAIR, dateTime, SMILE_TERM_5_FLAT_FLAT);
}
/**
* Creates volatility provider with term structure of smile parameters.
* <p>
* The number of time slices are 6, and the day count convention is ACT/365F.
*
* @param dateTime the valuation date time
* @return the volatility provider
*/
public static BlackFxOptionSmileVolatilities createVolatilitySmileProvider6(ZonedDateTime dateTime) {
return BlackFxOptionSmileVolatilities.of(NAME, CURRENCY_PAIR, dateTime, SMILE_TERM_6);
}
/**
* Get the underlying smile term structure.
* <p>
* The number of time slices are 5, and the day count convention is ACT/ACT ISDA.
*
* @return the smile term structure
*/
public static InterpolatedStrikeSmileDeltaTermStructure getSmileDeltaTermStructure5() {
return SMILE_TERM_5;
}
/**
* Get the underlying smile term structure.
* <p>
* The number of time slices are 6, and the day count convention is ACT/365F.
*
* @return the smile term structure
*/
public static InterpolatedStrikeSmileDeltaTermStructure getSmileDeltaTermStructure6() {
return SMILE_TERM_6;
}
}