/** * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.option; import static com.opengamma.strata.collect.TestHelper.assertSerialization; import static com.opengamma.strata.collect.TestHelper.coverBeanEquals; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import java.time.Period; import java.util.ArrayList; import java.util.List; import java.util.OptionalDouble; import org.testng.annotations.Test; import com.opengamma.strata.collect.array.DoubleArray; import com.opengamma.strata.collect.array.DoubleMatrix; import com.opengamma.strata.collect.tuple.Pair; import com.opengamma.strata.market.ValueType; /** * Tests {@link RawOptionData}. */ @Test public class RawOptionDataTest { private static final DoubleArray MONEYNESS = DoubleArray.of(-0.010, 0.00, 0.0100, 0.0200); private static final DoubleArray STRIKES = DoubleArray.of(-0.0050, 0.0050, 0.0150, 0.0250); private static final List<Period> EXPIRIES = new ArrayList<>(); static { EXPIRIES.add(Period.ofMonths(1)); EXPIRIES.add(Period.ofMonths(3)); EXPIRIES.add(Period.ofYears(1)); } private static final DoubleMatrix DATA_FULL = DoubleMatrix.ofUnsafe( new double[][] {{0.08, 0.09, 0.10, 0.11}, {0.09, 0.10, 0.11, 0.12}, {0.10, 0.11, 0.12, 0.13}}); private static final DoubleMatrix DATA_SPARSE = DoubleMatrix.ofUnsafe( new double[][] {{Double.NaN, Double.NaN, Double.NaN, Double.NaN}, {Double.NaN, 0.10, 0.11, 0.12}, {0.10, 0.11, 0.12, 0.13}}); private static final DoubleMatrix ERROR = DoubleMatrix.ofUnsafe( new double[][] {{1.0e-4, 1.0e-4, 1.0e-4, 1.0e-4}, {1.0e-4, 1.0e-4, 1.0e-4, 1.0e-4}, {1.0e-3, 1.0e-3, 1.0e-3, 1.0e-3}}); //------------------------------------------------------------------------- public void of() { RawOptionData test = sut(); assertEquals(test.getStrikes(), MONEYNESS); assertEquals(test.getStrikeType(), ValueType.SIMPLE_MONEYNESS); assertEquals(test.getData(), DATA_FULL); assertEquals(test.getDataType(), ValueType.NORMAL_VOLATILITY); } public void ofBlackVolatility() { double shift = 0.0075; RawOptionData test = RawOptionData.ofBlackVolatility(EXPIRIES, STRIKES, ValueType.STRIKE, DATA_SPARSE, shift); assertEquals(test.getStrikes(), STRIKES); assertEquals(test.getStrikeType(), ValueType.STRIKE); assertEquals(test.getData(), DATA_SPARSE); assertEquals(test.getDataType(), ValueType.BLACK_VOLATILITY); assertEquals(test.getShift(), OptionalDouble.of(shift)); assertFalse(test.getError().isPresent()); } public void available_smile_at_expiry() { double shift = 0.0075; RawOptionData test = RawOptionData.ofBlackVolatility(EXPIRIES, STRIKES, ValueType.STRIKE, DATA_SPARSE, shift); DoubleArray[] strikesAvailable = new DoubleArray[3]; strikesAvailable[0] = DoubleArray.EMPTY; strikesAvailable[1] = DoubleArray.of(0.0050, 0.0150, 0.0250); strikesAvailable[2] = DoubleArray.of(-0.0050, 0.0050, 0.0150, 0.0250); DoubleArray[] volAvailable = new DoubleArray[3]; volAvailable[0] = DoubleArray.EMPTY; volAvailable[1] = DoubleArray.of(0.10, 0.11, 0.12); volAvailable[2] = DoubleArray.of(0.10, 0.11, 0.12, 0.13); for (int i = 0; i < DATA_SPARSE.rowCount(); i++) { Pair<DoubleArray, DoubleArray> smile = test.availableSmileAtExpiry(EXPIRIES.get(i)); assertEquals(smile.getFirst(), strikesAvailable[i]); } } public void of_error() { RawOptionData test = sut3(); assertEquals(test.getStrikes(), MONEYNESS); assertEquals(test.getStrikeType(), ValueType.SIMPLE_MONEYNESS); assertEquals(test.getData(), DATA_FULL); assertEquals(test.getDataType(), ValueType.NORMAL_VOLATILITY); assertEquals(test.getError().get(), ERROR); } public void ofBlackVolatility_error() { double shift = 0.0075; RawOptionData test = RawOptionData.ofBlackVolatility(EXPIRIES, STRIKES, ValueType.STRIKE, DATA_SPARSE, ERROR, shift); assertEquals(test.getStrikes(), STRIKES); assertEquals(test.getStrikeType(), ValueType.STRIKE); assertEquals(test.getData(), DATA_SPARSE); assertEquals(test.getDataType(), ValueType.BLACK_VOLATILITY); assertEquals(test.getShift(), OptionalDouble.of(shift)); assertEquals(test.getError().get(), ERROR); } //------------------------------------------------------------------------- public void coverage() { RawOptionData test = sut(); coverImmutableBean(test); RawOptionData test2 = sut2(); coverBeanEquals(test, test2); } public void test_serialization() { RawOptionData test = RawOptionData.of(EXPIRIES, MONEYNESS, ValueType.SIMPLE_MONEYNESS, DATA_FULL, ValueType.BLACK_VOLATILITY); assertSerialization(test); } //------------------------------------------------------------------------- static RawOptionData sut() { return RawOptionData.of(EXPIRIES, MONEYNESS, ValueType.SIMPLE_MONEYNESS, DATA_FULL, ValueType.NORMAL_VOLATILITY); } static RawOptionData sut2() { List<Period> expiries2 = new ArrayList<>(); expiries2.add(Period.ofMonths(3)); expiries2.add(Period.ofYears(1)); expiries2.add(Period.ofYears(5)); RawOptionData test2 = RawOptionData.of(expiries2, STRIKES, ValueType.STRIKE, DATA_SPARSE, ERROR, ValueType.BLACK_VOLATILITY); return test2; } static RawOptionData sut3() { return RawOptionData.of(EXPIRIES, MONEYNESS, ValueType.SIMPLE_MONEYNESS, DATA_FULL, ERROR, ValueType.NORMAL_VOLATILITY); } }