/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
/**
* @deprecated This class tests deprecated functionality
*/
@Deprecated
@Test(groups = TestGroup.UNIT)
public class BlackFormulaTest {
private static final double FORWARD = 134.5;
private static final double T = 4.5;
private static final double SIGMA = 0.2;
private static final boolean ISCALL = false;
// Construct an at-the-money BlackFormula with null price. Set params as required thereafter
private static final BlackFormula FORMULA = new BlackFormula(FORWARD, FORWARD, T, SIGMA, null, ISCALL);
private static final double EPS = 1.0E-9;
private static final int N = 10;
private static final double[] PRICES;
private static final double[] STRIKES;
static {
PRICES = new double[N];
STRIKES = new double[N];
for (int i = 0; i < N; i++) {
STRIKES[i] = FORWARD * (0.5 + i / (N - 1));
FORMULA.setStrike(STRIKES[i]);
PRICES[i] = FORMULA.computePrice();
}
}
@Test
public void testImpliedVols() {
for (int i = 0; i < N; i++) {
FORMULA.setStrike(STRIKES[i]);
FORMULA.setMtm(PRICES[i]);
final double vol = FORMULA.computeImpliedVolatility();
assertEquals(SIGMA, vol, 1e-6);
}
}
@Test
public void testAtmPrices() {
final BlackFormula call = new BlackFormula(FORWARD, FORWARD, T, SIGMA, null, true);
final BlackFormula put = new BlackFormula(FORWARD, FORWARD, T, SIGMA, null, false);
assertEquals(call.computePrice(), put.computePrice(), EPS);
// System.err.println("atm put price = " + put.computePrice());
}
@Test
public void testAtmForwardDeltas() {
final double deltaneutralstrike = FORWARD * Math.exp(0.5 * SIGMA * SIGMA * T);
final BlackFormula deltaneutralcall = new BlackFormula(FORWARD, deltaneutralstrike, T, SIGMA, null, true);
final BlackFormula deltaneutralput = new BlackFormula(FORWARD, deltaneutralstrike, T, SIGMA, null, false);
assertEquals(0.0, deltaneutralcall.computeForwardDelta() + deltaneutralput.computeForwardDelta(), EPS);
final BlackFormula atmcall = new BlackFormula(FORWARD, FORWARD, T, SIGMA, null, true);
final BlackFormula atmput = new BlackFormula(FORWARD, FORWARD, T, SIGMA, null, false);
assertEquals(atmcall.computeForwardDelta() - 0.5, atmput.computeForwardDelta() + 0.5, EPS);
/* System.err.println("deltaneutralstrike = " + deltaneutralstrike);
System.err.println("delta neutral put = " + deltaneutralput.computeForwardDelta());
System.err.println("delta neutral call = " + deltaneutralcall.computeForwardDelta());
System.err.println("delta of atmcall = " + atmcall.computeForwardDelta());
System.err.println("delta of atmput = " + atmput.computeForwardDelta());
System.err.println("atmcall - 0.5 = " + (atmcall.computeForwardDelta()-0.5));
System.err.println("atmput - 0.5 = " + (0.5 + atmput.computeForwardDelta()));
*/
}
@Test
public void testStrikeImpliedFromFwdDelta() {
final double strike50Call = FORMULA.computeStrikeImpliedByForwardDelta(0.5, true);
assertEquals(FORWARD * Math.exp(0.5 * SIGMA * SIGMA * T), strike50Call);
final double strike50Put = FORMULA.computeStrikeImpliedByForwardDelta(-0.5, false);
assertEquals(strike50Call, strike50Put, EPS);
final double strike10Call = FORMULA.computeStrikeImpliedByForwardDelta(0.10, true);
final double strike25Call = FORMULA.computeStrikeImpliedByForwardDelta(0.25, true);
final double strike75Call = FORMULA.computeStrikeImpliedByForwardDelta(0.75, true);
final double strike90Call = FORMULA.computeStrikeImpliedByForwardDelta(0.90, true);
// System.err.println("strike90Call = " + strike90Call);
final double strike90Put = FORMULA.computeStrikeImpliedByForwardDelta(-0.90, false);
final double strike75Put = FORMULA.computeStrikeImpliedByForwardDelta(-0.75, false);
final double strike25Put = FORMULA.computeStrikeImpliedByForwardDelta(-0.25, false);
final double strike10Put = FORMULA.computeStrikeImpliedByForwardDelta(-0.10, false);
assertEquals(strike10Call, strike90Put, EPS);
assertEquals(strike25Call, strike75Put, EPS);
assertEquals(strike75Call, strike25Put, EPS);
assertEquals(strike90Call, strike10Put, EPS);
assertTrue((strike10Call > strike25Call) && (strike25Call > strike50Call) && (strike50Call > strike75Call) && (strike75Call > strike90Call));
}
@Test
public void testStrikeImpliedFromFwdDeltaEasy() {
final double strike25PutEasy = FORMULA.computeStrikeImpliedByForwardDelta(-0.25, false);
final double strike25PutHard = FORMULA.computeStrikeImpliedByDeltaViaRootFinding(0.25, false);
assertEquals(strike25PutEasy, strike25PutHard, EPS);
final double strike75PutEasy = FORMULA.computeStrikeImpliedByForwardDelta(-0.75, false);
final double strike75PutHard = FORMULA.computeStrikeImpliedByDeltaViaRootFinding(0.75, false);
assertEquals(strike75PutEasy, strike75PutHard, EPS);
}
}