Package com.opengamma.analytics.financial.model.volatility.smile.function

Source Code of com.opengamma.analytics.financial.model.volatility.smile.function.MixedBivariateLogNormalModelVolatilityTest

/**
* 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;

/**
*
*/
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);
      }
    }
  }

}
TOP

Related Classes of com.opengamma.analytics.financial.model.volatility.smile.function.MixedBivariateLogNormalModelVolatilityTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.