/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.riskfactor; import static org.testng.AssertJUnit.assertEquals; import java.util.Collections; 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.greeks.GreekResultCollection; import com.opengamma.analytics.financial.pnl.UnderlyingType; import com.opengamma.analytics.financial.sensitivity.PositionGreek; import com.opengamma.analytics.financial.sensitivity.ValueGreek; import com.opengamma.analytics.financial.trade.OptionTradeData; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class GreekConverterTest { private static final double N = 123.; private static final double PV = 456; private static final double DELTA = 0.12; private static final double GAMMA = 0.34; private static final double VANNA = 0.56; private static final double SPOT_PRICE = 100; private static final double IMPLIED_VOLATILITY = 0.5; private static final GreekToPositionGreekConverter G_TO_PG_CONVERTER = new GreekToPositionGreekConverter(); private static final GreekToValueGreekConverter G_TO_VG_CONVERTER = new GreekToValueGreekConverter(); private static final GreekResultCollection GREEKS; private static final GreekDataBundle GREEKS_DATA; private static final OptionTradeData TRADE_DATA = new OptionTradeData(N, PV); private static final double EPS = 1e-6; static { GREEKS = new GreekResultCollection(); GREEKS.put(Greek.DELTA, DELTA); GREEKS.put(Greek.GAMMA, GAMMA); GREEKS.put(Greek.VANNA, VANNA); final Map<UnderlyingType, Double> map = new HashMap<>(); map.put(UnderlyingType.SPOT_PRICE, SPOT_PRICE); map.put(UnderlyingType.IMPLIED_VOLATILITY, IMPLIED_VOLATILITY); GREEKS_DATA = new GreekDataBundle(GREEKS, map, TRADE_DATA); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull1() { G_TO_PG_CONVERTER.evaluate((GreekDataBundle) null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull2() { G_TO_VG_CONVERTER.evaluate((GreekDataBundle) null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testGreekResultMissingDataValueGreek() { final GreekResultCollection greeks = new GreekResultCollection(); greeks.put(Greek.DELTA, 5.); final Map<UnderlyingType, Double> data = Collections.<UnderlyingType, Double> singletonMap(UnderlyingType.BOND_YIELD, 0.04); G_TO_VG_CONVERTER.evaluate(new GreekDataBundle(greeks, data, TRADE_DATA)); } @Test public void test() { final Map<PositionGreek, Double> positionGreeks = G_TO_PG_CONVERTER.evaluate(GREEKS_DATA); assertEquals(DELTA * N, positionGreeks.get(new PositionGreek(Greek.DELTA)), EPS); assertEquals(GAMMA * N, positionGreeks.get(new PositionGreek(Greek.GAMMA)), EPS); assertEquals(VANNA * N, positionGreeks.get(new PositionGreek(Greek.VANNA)), EPS); final Map<ValueGreek, Double> valueGreeks = G_TO_VG_CONVERTER.evaluate(GREEKS_DATA); assertEquals(DELTA * N * PV * SPOT_PRICE, valueGreeks.get(new ValueGreek(Greek.DELTA)), EPS); assertEquals(GAMMA * N * PV * SPOT_PRICE * SPOT_PRICE, valueGreeks.get(new ValueGreek(Greek.GAMMA)), EPS); assertEquals(VANNA * N * PV * SPOT_PRICE * IMPLIED_VOLATILITY, valueGreeks.get(new ValueGreek(Greek.VANNA)), EPS); } }