/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.capletstripping; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.Arrays; import java.util.List; import org.testng.annotations.Test; import com.opengamma.analytics.math.matrix.DoubleMatrix2D; import com.opengamma.analytics.util.AssertMatrix; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.DoublesPair; /** * */ @Test(groups = TestGroup.UNIT) public class MultiCapFloorPricerGridTest extends CapletStrippingSetup { /** * The ATM caps have different strikes for each cap length, so the caplets do not lie on a regular expiry-strike grid */ @Test public void test() { List<CapFloor> caps = getATMCaps(); int nCaps = caps.size(); MultiCapFloorPricerGrid pricer = new MultiCapFloorPricerGrid(caps, getYieldCurves()); double[] strikes = pricer.getStrikes(); double[] expiries = pricer.getCapletExpiries(); int nStrikes = strikes.length; int nExp = expiries.length; assertEquals(nStrikes * nExp, pricer.getGridSize()); assertTrue(pricer.getGridSize() > pricer.getNumCaplets()); DoublesPair[] points = pricer.getExpiryStrikeArray(); assertEquals(nStrikes * nExp, points.length); for (int i = 0; i < nStrikes; i++) { double k = strikes[i]; for (int j = 0; j < nExp; j++) { DoublesPair p = points[i * nExp + j]; assertEquals(expiries[j], p.first); assertEquals(k, p.second); } } double[] capletVols = new double[pricer.getGridSize()]; Arrays.fill(capletVols, 0.45); double[] capPrices = pricer.priceFromCapletVols(capletVols); assertEquals(nCaps, capPrices.length); double[] iv = pricer.impliedVols(capPrices); for (double element : iv) { assertEquals(0.45, element, 1e-9); } DoubleMatrix2D capVega = pricer.vegaFromCapletVols(capletVols); assertEquals(nCaps, capVega.getNumberOfRows()); assertEquals(pricer.getGridSize(), capVega.getNumberOfColumns()); } /** * the absolute strike caps have caplets that DO lie on a regular expiry-strike grid */ @Test public void regGridTest() { List<CapFloor> caps = getAllCapsExATM(); MultiCapFloorPricerGrid gridPricer = new MultiCapFloorPricerGrid(caps, getYieldCurves()); MultiCapFloorPricer pricer = new MultiCapFloorPricer(caps, getYieldCurves()); double[] strikes = gridPricer.getStrikes(); double[] expiries = gridPricer.getCapletExpiries(); int nStrikes = strikes.length; int nExp = expiries.length; assertEquals(nStrikes * nExp, gridPricer.getGridSize()); assertEquals(gridPricer.getGridSize(), gridPricer.getNumCaplets()); double[] capletVols = new double[pricer.getNumCaplets()]; Arrays.fill(capletVols, 0.35); DoubleMatrix2D vega1 = pricer.vegaFromCapletVols(capletVols); DoubleMatrix2D vega2 = gridPricer.vegaFromCapletVols(capletVols); AssertMatrix.assertEqualsMatrix(vega1, vega2, 1e-14); } @Test(expectedExceptions = IllegalArgumentException.class) public void wrongNumCapletVolsPriceTest() { List<CapFloor> caps = getATMCaps(); MultiCapFloorPricerGrid pricer = new MultiCapFloorPricerGrid(caps, getYieldCurves()); double[] capletVols = new double[pricer.getNumCaplets()]; Arrays.fill(capletVols, 0.35); pricer.priceFromCapletVols(capletVols); } @Test(expectedExceptions = IllegalArgumentException.class) public void wrongNumCapletVolsVegaTest() { List<CapFloor> caps = getATMCaps(); MultiCapFloorPricerGrid pricer = new MultiCapFloorPricerGrid(caps, getYieldCurves()); double[] capletVols = new double[pricer.getNumCaplets()]; Arrays.fill(capletVols, 0.35); pricer.vegaFromCapletVols(capletVols); } }