/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.pnl; import static org.testng.AssertJUnit.assertEquals; import java.util.HashMap; import java.util.Map; import org.testng.annotations.Test; import com.opengamma.analytics.financial.greeks.Greek; import com.opengamma.analytics.financial.sensitivity.ValueGreek; import com.opengamma.analytics.financial.sensitivity.ValueGreekSensitivity; import com.opengamma.analytics.math.function.Function; import com.opengamma.timeseries.DoubleTimeSeries; import com.opengamma.timeseries.precise.PreciseDoubleTimeSeries; import com.opengamma.timeseries.precise.instant.ImmutableInstantDoubleTimeSeries; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class SensitivityPnLCalculatorTest { private static final ValueGreekSensitivity DELTA = new ValueGreekSensitivity(new ValueGreek(Greek.DELTA), "A"); private static final double DELTA_VALUE = 100.; private static final ValueGreekSensitivity GAMMA = new ValueGreekSensitivity(new ValueGreek(Greek.GAMMA), "A"); private static final double GAMMA_VALUE = 200.; private static final ValueGreekSensitivity VEGA = new ValueGreekSensitivity(new ValueGreek(Greek.VEGA), "A"); private static final double VEGA_VALUE = 300.; private static final ValueGreekSensitivity VANNA = new ValueGreekSensitivity(new ValueGreek(Greek.VANNA), "A"); private static final double VANNA_VALUE = 400.; private static final ValueGreekSensitivity VOMMA = new ValueGreekSensitivity(new ValueGreek(Greek.VOMMA), "A"); private static final double VOMMA_VALUE = 500.; private static final ValueGreekSensitivity RHO = new ValueGreekSensitivity(new ValueGreek(Greek.RHO), "A"); private static final double RHO_VALUE = 600.; private static final long[] TIMES = new long[] {400, 401}; private static final double[] TS_SPOT_DATA = new double[] {0.4, 0.45}; private static final double[] TS_IR_DATA = new double[] {0.3, 0.35}; private static final double[] TS_IMP_VOL_DATA = new double[] {0.7, 0.75}; private static final DoubleTimeSeries<?> TS_SPOT = ImmutableInstantDoubleTimeSeries.of(TIMES, TS_SPOT_DATA); private static final DoubleTimeSeries<?> TS_IR = ImmutableInstantDoubleTimeSeries.of(TIMES, TS_IR_DATA); private static final DoubleTimeSeries<?> TS_IMP_VOL = ImmutableInstantDoubleTimeSeries.of(TIMES, TS_IMP_VOL_DATA); private static final SensitivityAndReturnDataBundle[] DATA; private static final Function<SensitivityAndReturnDataBundle, DoubleTimeSeries<?>> CALCULATOR = new SensitivityPnLCalculator(); static { DATA = new SensitivityAndReturnDataBundle[6]; final Map<UnderlyingType, DoubleTimeSeries<?>> m1 = new HashMap<>(); m1.put(UnderlyingType.SPOT_PRICE, TS_SPOT); DATA[0] = new SensitivityAndReturnDataBundle(DELTA, DELTA_VALUE, m1); DATA[1] = new SensitivityAndReturnDataBundle(GAMMA, GAMMA_VALUE, m1); final Map<UnderlyingType, DoubleTimeSeries<?>> m2 = new HashMap<>(); m2.put(UnderlyingType.IMPLIED_VOLATILITY, TS_IMP_VOL); DATA[2] = new SensitivityAndReturnDataBundle(VEGA, VEGA_VALUE, m2); final Map<UnderlyingType, DoubleTimeSeries<?>> m3 = new HashMap<>(); m3.put(UnderlyingType.SPOT_PRICE, TS_SPOT); m3.put(UnderlyingType.IMPLIED_VOLATILITY, TS_IMP_VOL); DATA[3] = new SensitivityAndReturnDataBundle(VANNA, VANNA_VALUE, m3); DATA[4] = new SensitivityAndReturnDataBundle(VOMMA, VOMMA_VALUE, m2); final Map<UnderlyingType, DoubleTimeSeries<?>> m4 = new HashMap<>(); m4.put(UnderlyingType.INTEREST_RATE, TS_IR); DATA[5] = new SensitivityAndReturnDataBundle(RHO, RHO_VALUE, m4); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullData() { CALCULATOR.evaluate((SensitivityAndReturnDataBundle[]) null); } @Test public void test() { final DoubleTimeSeries<?> ts = CALCULATOR.evaluate(DATA); final PreciseDoubleTimeSeries<?> pnl = (PreciseDoubleTimeSeries<?>) ts; assertEquals(pnl.getTimeAtIndexFast(0), TIMES[0]); assertEquals(pnl.getTimeAtIndexFast(1), TIMES[1]); assertEquals(pnl.getValueAtIndexFast(0), 680.5, 1e-9); assertEquals(pnl.getValueAtIndexFast(1), 775.875, 1e-9); } }