public void price_comparison_normal() { priceCheck(STRIKES); priceCheck(STRIKES_ATM); }
/** Tests second order Algorithmic Differentiation version of BlackFunction with several data sets. */ public void testPriceAdjoint2() { // forward, numeraire, sigma, strike, time double[][] testData = { {104.0d, 0.9d, 0.50d, 94.0d, 4.5d}, {104.0d, 0.9d, 0.50d, 124.0d, 4.5d}, {104.0d, 0.9d, 0.50d, 104.0d, 4.5d}, {0.0250d, 1000.0d, 0.25d, 0.0150d, 10.0d}, {0.0250d, 1000.0d, 0.25d, 0.0400d, 10.0d}, {1700.0d, 0.9d, 1.00d, 1500.0d, 0.01d}, {1700.0d, 0.9d, 1.00d, 1900.0d, 20.0d} }; int nbTest = testData.length; for (int i = 0; i < nbTest; i++) { testPriceAdjointSecondOrder(testData[i][0], testData[i][1], testData[i][2], testData[i][3], testData[i][4], CALL, i); testPriceAdjointSecondOrder(testData[i][0], testData[i][1], testData[i][2], testData[i][3], testData[i][4], PUT, i); } }
@Test public void testBlackFormula() { double fwd = 5; double strike = 6.5; double t = 1.5; double vol = 0.35; double expected = BlackFormulaRepository.price(fwd, strike, t, vol, true); Function<Double, Double> func = getBlackIntergrand(fwd, strike, t, vol); Function<Double, Double> fullIntergrand = new Function<Double, Double>() { @Override public Double apply(Double x) { return func.apply(x) * Math.exp(-x * x); } }; RungeKuttaIntegrator1D rk = new RungeKuttaIntegrator1D(1e-15); double resRK = rk.integrate(fullIntergrand, 0., 10.); //The strike > fwd, so can start the integration at z=0 (i.e. s = fwd) assertEquals(expected, resRK, 1e-15, "Runge Kutta"); GaussHermiteQuadratureIntegrator1D gh = new GaussHermiteQuadratureIntegrator1D(40); double resGH = gh.integrateFromPolyFunc(func); assertEquals(expected, resGH, 1e-2, "Gauss Hermite"); //terrible accuracy even with 40 points }