/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.volatility.smile.function;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.model.option.pricing.analytic.formula.EuropeanVanillaOption;
import com.opengamma.analytics.financial.model.volatility.BlackFormulaRepository;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class MixedBivariateLogNormalModelVolatilityTest {
private static final double EPS = 1.e-15;
private static final double INF = 1. / 0.;
/**
*
*/
@Test
public void trivialValuesTest() {
final double[] wghts = {0.5, 0.5 };
final double[] sigsX = {0.5, 0.5 };
final double[] sigsY = {0.5, 0.5 };
final double[] rpfsX = {1.0, 1.0 };
final double[] rpfsY = {1.0, 1.0 };
final double[] rhs = {0., 0. };
final double timeToExpiry = 1.;
final double forwardX = 1.;
final double forwardY = 1.;
final double forwardZ = forwardX / forwardY;
final double k = 1.;
final MixedBivariateLogNormalModelVolatility volObjZ1 = new MixedBivariateLogNormalModelVolatility(wghts, sigsX,
sigsY, rpfsX, rpfsY, rhs);
final MixedBivariateLogNormalModelVolatility volObjZ2 = new MixedBivariateLogNormalModelVolatility(wghts, sigsX,
sigsY, rhs);
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, timeToExpiry, true);
assertEquals(volObjZ1.getImpliedVolatilityZ(option, forwardZ), Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ2.getImpliedVolatilityZ(option, forwardZ), Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ1.getSigmasZ()[0], Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ1.getSigmasZ()[1], Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ2.getSigmasZ()[0], Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ2.getSigmasZ()[1], Math.pow(0.5, 0.5), EPS);
assertEquals(volObjZ1.getRelativeForwardsZ()[0], 1., EPS); // Note that this is NOT Math.exp(0.25) due to driftcorrection
assertEquals(volObjZ1.getRelativeForwardsZ()[1], 1., EPS);
assertEquals(volObjZ2.getRelativeForwardsZ()[0], 1., EPS);
assertEquals(volObjZ2.getRelativeForwardsZ()[1], 1., EPS);
assertEquals(volObjZ1.getPriceZ(option, forwardZ), BlackFormulaRepository.price(forwardZ, k, timeToExpiry, Math.pow(0.5, 0.5), true), EPS);
assertEquals(volObjZ2.getPriceZ(option, forwardZ), BlackFormulaRepository.price(forwardZ, k, timeToExpiry, Math.pow(0.5, 0.5), true), EPS);
assertEquals(volObjZ1.getInvExpDriftCorrection(), 1. / Math.exp(0.25), EPS);
assertEquals(volObjZ2.getInvExpDriftCorrection(), 1. / Math.exp(0.25), EPS);
// assertEquals(volObjZ2.getSigmasZ()[1], Math.pow(0.5, 0.5), EPS);
}
/**
* Parameters for X,Y are also resorted corresponding to sorting of sigmaZ
*/
@Test
public void reorderedDataTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
final MixedBivariateLogNormalModelVolatility volObjZ1 = new MixedBivariateLogNormalModelVolatility(wghts, sigsX,
sigsY, rpfsX, rpfsY, rhs);
final MixedBivariateLogNormalModelVolatility volObjZ2 = new MixedBivariateLogNormalModelVolatility(wghts, sigsX,
sigsY, rhs);
assertEquals(volObjZ1.getOrderedRelativePartialForwardsX()[0], rpfsX[1], EPS);
assertEquals(volObjZ1.getOrderedRelativePartialForwardsX()[1], rpfsX[0], EPS);
assertEquals(volObjZ1.getOrderedRelativePartialForwardsY()[0], rpfsY[1], EPS);
assertEquals(volObjZ1.getOrderedRelativePartialForwardsY()[1], rpfsY[0], EPS);
assertEquals(volObjZ1.getOrderedSigmasX()[0], sigsX[1], EPS);
assertEquals(volObjZ1.getOrderedSigmasX()[1], sigsX[0], EPS);
assertEquals(volObjZ1.getOrderedSigmasY()[0], sigsY[1], EPS);
assertEquals(volObjZ1.getOrderedSigmasY()[1], sigsY[0], EPS);
assertEquals(volObjZ2.getOrderedSigmasX()[0], sigsX[1], EPS);
assertEquals(volObjZ2.getOrderedSigmasX()[1], sigsX[0], EPS);
assertEquals(volObjZ2.getOrderedSigmasY()[0], sigsY[1], EPS);
assertEquals(volObjZ2.getOrderedSigmasY()[1], sigsY[0], EPS);
assertEquals(volObjZ1.getOrderedWeights()[0], wghts[1], EPS);
assertEquals(volObjZ1.getOrderedWeights()[1], wghts[0], EPS);
assertEquals(volObjZ2.getOrderedWeights()[0], wghts[1], EPS);
assertEquals(volObjZ2.getOrderedWeights()[1], wghts[0], EPS);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullWghts1Test() {
double[] wghts = new double[2];
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
wghts = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullWghts2Test() {
double[] wghts = new double[2];
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
wghts = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullsigX1Test() {
final double[] wghts = {0.2, 0.8 };
double[] sigsX = new double[2];
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
sigsX = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullsigX2Test() {
final double[] wghts = {0.2, 0.8 };
double[] sigsX = new double[2];
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
sigsX = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullsigsY1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
double[] sigsY = new double[2];
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
sigsY = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullsigsY2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
double[] sigsY = new double[2];
final double[] rhs = {0., 1. };
sigsY = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullrpfsXTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = null;
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullrpfsYTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
double[] rpfsY = new double[2];
final double[] rhs = {0., 1. };
rpfsY = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullrhs1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
double[] rhs = new double[2];
rhs = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullrhs2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
double[] rhs = new double[2];
rhs = null;
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFwghts1Test() {
final double[] wghts = {INF, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFwghts2Test() {
final double[] wghts = {INF, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFsigsX1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {INF, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFsigsX2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {INF, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFsigsY1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {INF, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFsigsY2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {INF, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFrpfsXTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {INF, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFrpfsYTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {INF, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFrhs1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {INF, 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void iNFrhs2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {INF, 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNwghts1Test() {
final double[] wghts = {Double.NaN, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNwghts2Test() {
final double[] wghts = {Double.NaN, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNsigsX1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {Double.NaN, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNsigsX2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {Double.NaN, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNsigsY1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {Double.NaN, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNsigsY2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {Double.NaN, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNrpfsXTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {Double.NaN, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNrpfsYTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {Double.NaN, 0.78 / 0.8 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNrhs1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1.05, 0.79 / 0.8 };
final double[] rpfsY = {1.1, 0.78 / 0.8 };
final double[] rhs = {Double.NaN, 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void naNrhs2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {Double.NaN, 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthWghts1Test() {
final double[] wghts = {0.2, 0.7, 0.1 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1., 1. };
final double[] rpfsY = {1., 1. };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthWghts2Test() {
final double[] wghts = {0.2, 0.7, 0.1 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthSigsX1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6, 0.7 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1., 1. };
final double[] rpfsY = {1., 1. };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthSigsX2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6, 0.7 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthSigsY1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55, 0.7 };
final double[] rpfsX = {1., 1. };
final double[] rpfsY = {1., 1. };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthSigsY2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55, 0.7 };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthRpfsXTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1., 1., 1., };
final double[] rpfsY = {1., 1. };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthRpfsYTest() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1., 1. };
final double[] rpfsY = {1., 1., 1. };
final double[] rhs = {0., 1. };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthRhs1Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rpfsX = {1., 1. };
final double[] rpfsY = {1., 1. };
final double[] rhs = {0., 1., 0.1 };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rpfsX, rpfsY, rhs);
}
/**
*
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongLengthRhs2Test() {
final double[] wghts = {0.2, 0.8 };
final double[] sigsX = {0.4, 0.6 };
final double[] sigsY = {0.45, 0.55 };
final double[] rhs = {0., 1., 0.1 };
new MixedBivariateLogNormalModelVolatility(wghts, sigsX, sigsY, rhs);
}
/**
* Tests below are for debugging
*/
@Test
(enabled = false)
public void printTest() {
// final double[] constWeights = {0.6, 0.3, 0.1 };
// final double[] sigmasX = {0.1, 0.5, 0.9 };
// final double[] sigmasY = {0.2, 0.7, 1.2 };
// final double[] relativePartialForwardsX = {1., 1., 1. };
// final double[] relativePartialForwardsY = {1., 1., 1. };
// final double[] rhos = {0.4, 0.5, 0.6 };
// final double[] constWeights = {0.6, 0.3, 0.1 };
// final double[] sigmasX = {0.3, 0.4, 0.5 };
// final double[] sigmasY = {0.2, 0.6, 0.9 };
// final double[] relativePartialForwardsX = {1., 1., 1. };
// final double[] relativePartialForwardsY = {1., 1., 1. };
// final double[] rhos = {-0.5, 0.5, 0.9 };
final double[] constWeights = {0.8, 0.2 };
final double[] sigmasX = {0.3, 0.4 };
final double[] sigmasY = {0.1, 0.2 };
final double[] relativePartialForwardsX = {1.1, 0.6 };
final double[] relativePartialForwardsY = {1.0, 1.0 };
final double[] rhos = {0.1, 0.8 };
final double[] weights = constWeights;
final MixedBivariateLogNormalModelVolatility objZ = new MixedBivariateLogNormalModelVolatility(weights, sigmasX,
sigmasY, relativePartialForwardsX, relativePartialForwardsY, rhos);
final MixedLogNormalModelData objX = new MixedLogNormalModelData(weights, sigmasX, relativePartialForwardsX);
final MixedLogNormalModelData objY = new MixedLogNormalModelData(weights, sigmasY, relativePartialForwardsY);
// final MixedBivariateLogNormalModelVolatility objZ = new MixedBivariateLogNormalModelVolatility(weights, sigmasX,
// sigmasY, rhos);
// final MixedLogNormalModelData objX = new MixedLogNormalModelData(constWeights, sigmasX);
// final MixedLogNormalModelData objY = new MixedLogNormalModelData(constWeights, sigmasY);
final double forwardX = 1.1;
final double forwardY = 0.9;
final double forwardZ = forwardX / forwardY;
final double timeToExpiry = 0.6;
final MixedLogNormalVolatilityFunction volfunc = MixedLogNormalVolatilityFunction.getInstance();
for (int i = 0; i < 101; i++) {
final double k = forwardZ * (0.5 + 1. * i / 100.);
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, timeToExpiry, true);
final double vol1 = objZ.getImpliedVolatilityZ(option, forwardZ);
final double vol2 = volfunc.getVolatility(option, forwardX, objX);
final double vol3 = volfunc.getVolatility(option, forwardY, objY);
System.out.println(k + "\t" + vol1 + "\t" + vol2 + "\t" + vol3);
}
}
/**
*
*/
@Test
(enabled = false)
public void printTestStrikeTime() {
// final double[] constWeights = {0.6, 0.3, 0.1 };
// final double[] sigmasX = {0.1, 0.5, 0.9 };
// final double[] sigmasY = {0.2, 0.7, 1.2 };
// final double[] relativePartialForwardsX = {1., 1., 1. };
// final double[] relativePartialForwardsY = {1., 1., 1. };
// final double[] rhos = {0.4, 0.5, 0.6 };
// final double[] constWeights = {0.6, 0.3, 0.1 };
// final double[] sigmasX = {0.3, 0.4, 0.5 };
// final double[] sigmasY = {0.2, 0.6, 0.9 };
// final double[] relativePartialForwardsX = {1., 1., 1. };
// final double[] relativePartialForwardsY = {1., 1., 1. };
// final double[] rhos = {-0.5, 0.5, 0.9 };
final double[] constWeights = {0.8, 0.2 };
final double[] sigmasX = {0.3, 0.4 };
final double[] sigmasY = {0.1, 0.2 };
final double[] relativePartialForwardsX = {1.1, 0.6 };
final double[] relativePartialForwardsY = {1.0, 1.0 };
final double[] rhos = {0.1, 0.8 };
final double[] weights = constWeights;
final MixedBivariateLogNormalModelVolatility objZ = new MixedBivariateLogNormalModelVolatility(weights, sigmasX,
sigmasY, relativePartialForwardsX, relativePartialForwardsY, rhos);
// final MixedBivariateLogNormalModelVolatility objZ = new MixedBivariateLogNormalModelVolatility(weights, sigmasX,
// sigmasY, rhos);
// final MixedLogNormalModelData objX = new MixedLogNormalModelData(constWeights, sigmasX);
// final MixedLogNormalModelData objY = new MixedLogNormalModelData(constWeights, sigmasY);
final double forwardX = 1.1;
final double forwardY = 0.9;
final double forwardZ = forwardX / forwardY;
for (int j = 0; j < 51; j++) {
final double time = 0.5 * (0.5 + 2. * j / 100.);
for (int i = 0; i < 51; i++) {
final double k = forwardZ * (0.5 + 1. * i / 100.);
final EuropeanVanillaOption option = new EuropeanVanillaOption(k, time, true);
final double vol1 = objZ.getImpliedVolatilityZ(option, forwardZ);
System.out.println(k + "\t" + time + "\t" + vol1);
}
}
}
}