Package com.opengamma.analytics.financial.model.finitedifference.applications

Source Code of com.opengamma.analytics.financial.model.finitedifference.applications.TwoStateMarkovChainPricerTest

/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.finitedifference.applications;

import static org.testng.AssertJUnit.assertEquals;

import org.testng.annotations.Test;

import com.opengamma.analytics.financial.model.finitedifference.ExponentialMeshing;
import com.opengamma.analytics.financial.model.finitedifference.HyperbolicMeshing;
import com.opengamma.analytics.financial.model.finitedifference.MarkovChain;
import com.opengamma.analytics.financial.model.finitedifference.MeshingFunction;
import com.opengamma.analytics.financial.model.finitedifference.PDEFullResults1D;
import com.opengamma.analytics.financial.model.finitedifference.PDEGrid1D;
import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve;

/**
*
*/
public class TwoStateMarkovChainPricerTest {

  private static final double SPOT = 0.03;
  private static final double RATE = 0.0;
  private static final double T = 5.0;

  private static final double VOL1 = 0.15;
  private static final double VOL2 = 0.70;
  private static final double LAMBDA12 = 0.3;
  private static final double LAMBDA21 = 4.0;
  private static final double P0 = 1.0;
  private static final double BETA = 0.6;

  private static final ForwardCurve FORWARD_CURVE;

  private static final TwoStateMarkovChainPricer PRICER;
  private static final MarkovChain CHAIN;

  static {
    FORWARD_CURVE = new ForwardCurve(SPOT, RATE);
    final TwoStateMarkovChainDataBundle chainData = new TwoStateMarkovChainDataBundle(VOL1, VOL2, LAMBDA12, LAMBDA21, P0, BETA, BETA);
    PRICER = new TwoStateMarkovChainPricer(FORWARD_CURVE, chainData);
    CHAIN = new MarkovChain(VOL1, VOL2, LAMBDA12, LAMBDA21, P0);
  }

  @Test
  public void test() {
    final double theta = 0.55;
    final int tNodes = 51;
    final int xNodes = 151;
    final MeshingFunction timeMesh = new ExponentialMeshing(0, T, tNodes, 7.5);
    final MeshingFunction spaceMesh = new HyperbolicMeshing(0, 10 * SPOT, SPOT, xNodes, 0.01);
    final PDEGrid1D grid = new PDEGrid1D(timeMesh, spaceMesh);
    final PDEFullResults1D res = PRICER.solve(grid, theta);

    final double[] expiries = timeMesh.getPoints();
    final double[] strikes = spaceMesh.getPoints();
    final double[] forwards = new double[tNodes];
    // double[] df = new double[tNodes];
    for (int i = 0; i < tNodes; i++) {

      forwards[i] = FORWARD_CURVE.getForward(expiries[i]);
    }

    final double[] sims = CHAIN.simulate(T, 1000);
    for (int i = 0; i < xNodes; i++) {

      if (strikes[i] < 0.08) {
        final double mcPrice = CHAIN.priceCEV(FORWARD_CURVE.getForward(T), FORWARD_CURVE.getSpot() / FORWARD_CURVE.getForward(T), strikes[i], T, BETA, sims);
        final double price = res.getFunctionValue(i, tNodes - 1);
        // System.out.println(strikes[i] + "\t" + mcPrice + "\t" + price);
        assertEquals(mcPrice, price, 1e-2 * mcPrice);
      }

    }

  }

}
TOP

Related Classes of com.opengamma.analytics.financial.model.finitedifference.applications.TwoStateMarkovChainPricerTest

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.