void OptionletStripperTest::testTermVolatilityStrippingShiftedLogNormalVol() { BOOST_TEST_MESSAGE( "Testing forward/forward vol stripping from non-flat normal vol term " "vol surface for normal vol setup using OptionletStripper1 class..."); CommonVars vars; Real shift = 0.03; Settings::instance().evaluationDate() = Date(30, April, 2015); vars.setRealCapFloorTermVolSurface(); shared_ptr< IborIndex > iborIndex(new Euribor6M(vars.forwardingYTS)); boost::shared_ptr< OptionletStripper > optionletStripper1( new OptionletStripper1(vars.capFloorVolRealSurface, iborIndex, Null< Rate >(), vars.accuracy, 100, vars.discountingYTS, ShiftedLognormal, shift, true)); boost::shared_ptr< StrippedOptionletAdapter > strippedOptionletAdapter = boost::shared_ptr< StrippedOptionletAdapter >( new StrippedOptionletAdapter(optionletStripper1)); Handle< OptionletVolatilityStructure > vol(strippedOptionletAdapter); vol->enableExtrapolation(); boost::shared_ptr< BlackCapFloorEngine > strippedVolEngine( new BlackCapFloorEngine(vars.discountingYTS, vol)); boost::shared_ptr< CapFloor > cap; for (Size strikeIndex = 0; strikeIndex < vars.strikes.size(); ++strikeIndex) { for (Size tenorIndex = 0; tenorIndex < vars.optionTenors.size(); ++tenorIndex) { cap = MakeCapFloor(CapFloor::Cap, vars.optionTenors[tenorIndex], iborIndex, vars.strikes[strikeIndex], 0 * Days).withPricingEngine(strippedVolEngine); Real priceFromStrippedVolatility = cap->NPV(); boost::shared_ptr< PricingEngine > blackCapFloorEngineConstantVolatility(new BlackCapFloorEngine( vars.discountingYTS, vars.termV[tenorIndex][strikeIndex], vars.capFloorVolRealSurface->dayCounter(), shift)); cap->setPricingEngine(blackCapFloorEngineConstantVolatility); Real priceFromConstantVolatility = cap->NPV(); Real error = std::fabs(priceFromStrippedVolatility - priceFromConstantVolatility); if (error > vars.tolerance) BOOST_FAIL( "\noption tenor: " << vars.optionTenors[tenorIndex] << "\nstrike: " << io::rate(vars.strikes[strikeIndex]) << "\nstripped vol price: " << io::rate(priceFromStrippedVolatility) << "\nconstant vol price: " << io::rate(priceFromConstantVolatility) << "\nerror: " << io::rate(error) << "\ntolerance: " << io::rate(vars.tolerance)); } } }