/** * 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 com.opengamma.analytics.financial.interestrate.capletstripping.SimpleCapFloorMaker.makeCap; import static org.testng.AssertJUnit.assertEquals; import java.util.Arrays; import org.testng.annotations.Test; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.model.volatility.SimpleOptionData; import com.opengamma.analytics.financial.model.volatility.surface.VolatilitySurface; import com.opengamma.analytics.math.surface.ConstantDoublesSurface; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; /** * */ @Test(groups = TestGroup.UNIT) public class CapFloorPricerTest extends CapletStrippingSetup { private static final double s_flatVol = 0.45; private static final VolatilitySurface s_vs = new VolatilitySurface(new ConstantDoublesSurface(s_flatVol)); @Test public void test() { IborIndex index = getIndex(); Currency ccy = index.getCurrency(); double strike = 0.003; //note - spot starting caps (floors) (usually) do not include the first caplet (floorlet), as the spot Libor is already //known, so is not an option but a fixed cash-flow. Hence in makeCap have start = 1 CapFloor cap = makeCap(ccy, index, 1, 20, strike, false); assertEquals(false, cap.isCap()); CapFloorPricer pricer = new CapFloorPricer(cap, getYieldCurves()); //see comment above as to why there are 19 rather than 20 caplets int nCaplets = 19; assertEquals(nCaplets, pricer.getNumberCaplets()); assertEquals("strike", strike, pricer.getStrike()); double[] expiries = pricer.getCapletExpiries(); assertEquals(nCaplets, expiries.length); for (int i = 0; i < nCaplets; i++) { assertEquals(0.25 * (1 + i), expiries[i]); } SimpleOptionData[] options = pricer.getCapletAsOptionData(); assertEquals(nCaplets, options.length); for (int i = 0; i < nCaplets; i++) { SimpleOptionData opt = options[i]; assertEquals(strike, opt.getStrike()); assertEquals(expiries[i], opt.getTimeToExpiry()); assertEquals(false, opt.isCall()); } //round trip test of cap volatility int nVols = 10; for (int i = 0; i < nVols; i++) { double v = 0.1 + 0.6 * i / (nVols - 1.0); double p = pricer.price(v); assertEquals("cap vols", v, pricer.impliedVol(p), 1e-9); } //set all caplet vols to the same value double vol = 0.37433; double[] capletVols = new double[nCaplets]; Arrays.fill(capletVols, vol); double capPrice = pricer.price(capletVols); double capVol = pricer.impliedVol(capPrice); assertEquals(vol, capVol, 1e-9); capVol = pricer.impliedVol(capletVols); assertEquals(vol, capVol, 1e-11); double capVega = pricer.vega(vol); assertEquals("vega", capVega, pricer.vega(capletVols), 1e-12); //test volatility surface access assertEquals(s_flatVol, pricer.impliedVol(s_vs), 1e-13); assertEquals(pricer.price(s_flatVol), pricer.price(s_vs), 1e-15); assertEquals(pricer.vega(s_flatVol), pricer.vega(s_vs), 1e-15); } }