/** * 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.demo; import java.util.Arrays; import org.testng.annotations.Test; import com.opengamma.analytics.financial.interestrate.capletstripping.CapletStripper; import com.opengamma.analytics.financial.interestrate.capletstripping.CapletStripperPSplineTermStructure; import com.opengamma.analytics.financial.interestrate.capletstripping.CapletStrippingResult; import com.opengamma.analytics.financial.interestrate.capletstripping.CapletStrippingSetup; import com.opengamma.analytics.financial.interestrate.capletstripping.CombinedCapletStrippingResults; import com.opengamma.analytics.financial.interestrate.capletstripping.MarketDataType; import com.opengamma.analytics.financial.interestrate.capletstripping.MultiCapFloorPricer; import com.opengamma.analytics.financial.model.volatility.surface.BasisSplineVolatilityTermStructureProvider; import com.opengamma.analytics.math.matrix.DoubleMatrix1D; /** * In this demo, we fit caps at each absolute strike in turn, using a P-spline curve to represent caplet volatility term * structure. These separate solutions are joined together to form a volatility surface; the output is this surface * sampled on a grid (101 by 101), such that it can be plotted as an Excel surface plot (or imported into some other * visualisation tool). */ public class CapletStrippingPSplineTermStructureDemo extends CapletStrippingSetup { @Test(description = "Demo of infering a caplet volatility surface by seperate P-spline fit of absolute strike quotes") public void singleStrikeTest() { final BasisSplineVolatilityTermStructureProvider vtsp = new BasisSplineVolatilityTermStructureProvider(0, 10.0, 10, 2); final int size = vtsp.getNumModelParameters(); final DoubleMatrix1D guess = new DoubleMatrix1D(size, 0.5); final double lambda = 1000; final int n = getNumberOfStrikes(); final CapletStrippingResult[] res = new CapletStrippingResult[n]; for (int i = 0; i < n; i++) { final MultiCapFloorPricer pricer = new MultiCapFloorPricer(getCaps(i), getYieldCurves()); final CapletStripper stripper = new CapletStripperPSplineTermStructure(pricer, vtsp, lambda); final double[] vols = getCapVols(i); final int nVols = vols.length; final double[] errors = new double[nVols]; Arrays.fill(errors, 1e-4); //1bps res[i] = stripper.solve(vols, MarketDataType.VOL, errors, guess); System.out.println(res[i].getChiSqr()); // res[i].printCapletVols(System.out); } final CombinedCapletStrippingResults comRes = new CombinedCapletStrippingResults(res); comRes.printSurface(System.out, 101, 101); } }