Package com.opengamma.analytics.financial.model.option.pricing.tree

Source Code of com.opengamma.analytics.financial.model.option.pricing.tree.TimeVaryingLatticeSpecification

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

import org.apache.commons.lang.NotImplementedException;

import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.statistics.descriptive.MeanCalculator;

/**
*
*/
public class TimeVaryingLatticeSpecification extends LatticeSpecification {

  @Override
  public double[] getParameters(final double spot, final double strike, final double timeToExpiry, final double volatility, final double interestRate, final int nSteps, final double dt) {
    throw new NotImplementedException();
  }

  /**
   * Overloaded getParameters method
   * @param vol Volatility
   * @param nu Computed by getShiftedDrift method
   * @param spaceStep Space step
   * @return {(modified time step), (up probability)}
   */
  public double[] getParameters(final double vol, final double nu, final double spaceStep) {
    final double[] res = new double[2];

    final double volSq = vol * vol;
    final double nuSq = nu * nu;
    res[0] = 0.5 * (-volSq + Math.sqrt(volSq * volSq + 4. * nuSq * spaceStep * spaceStep)) / nuSq;
    res[1] = 0.5 + 0.5 * nu * res[0] / spaceStep;

    return res;
  }

  /**
   * Parameters for trinomial tree
   * @param vol Volatility
   * @param nu Computed by getShiftedDrift method
   * @param dt Time step
   * @param spaceStep Homogeneous space step
   * @return {(up probability), (middle probability), (down probability)}
   */
  public double[] getParametersTrinomial(final double vol, final double nu, final double dt, final double spaceStep) {
    final double nudt = nu * dt;
    final double dx = vol * Math.sqrt(3. * dt);

    final double part = (vol * vol * dt + nudt * nudt) / dx / dx;
    final double upProbability = 0.5 * (part + nudt / dx);
    final double middleProbability = 1. - part;
    final double downProbability = 0.5 * (part - nudt / dx);

    return new double[] {upProbability, middleProbability, downProbability };
  }

  @Override
  public double getTheta(final double spot, final double volatility, final double interestRate, final double dividend, final double dt, final double[] greeksTmp) {
    return 0.5 * (greeksTmp[3] - greeksTmp[0]) / dt;
  }

  /**
   * Finite difference approximation of theta. Note that the time step is not homogeneous in the time varying volatility lattice.
   * @param dt0 First time step
   * @param dt1 Second time step
   * @param greeksTmp asset price at (0,0) in  greeksTmp[0] and asset price at (2,1) in greeksTmp[3]
   * @return Option theta
   */
  public double getTheta(final double dt0, final double dt1, final double[] greeksTmp) {
    return (greeksTmp[3] - greeksTmp[0]) / (dt0 + dt1);
  }

  /**
   * @param volatility Volatility
   * @param interestRate Interest rate
   * @param dividend Dividend
   * @return (interest rate) - (dividend) - 0.5 * volatility * volatility for all layers
   */
  public double[] getShiftedDrift(final double[] volatility, final double[] interestRate, final double[] dividend) {
    final int nSteps = volatility.length;
    final double[] res = new double[nSteps];

    for (int i = 0; i < nSteps; ++i) {
      res[i] = interestRate[i] - dividend[i] - 0.5 * volatility[i] * volatility[i];
    }
    return res;
  }

  /**
   * @param timeToExpiry Time to expiry
   * @param volatility Volatility
   * @param nSteps Number of steps
   * @param nu Computed by getShiftedDrift method
   * @return space step
   */
  public double getSpaceStep(final double timeToExpiry, final double[] volatility, final int nSteps, final double[] nu) {
    final Function1D<double[], Double> calculator = new MeanCalculator();
    final double meanNu = calculator.evaluate(nu);
    final double meanVol = calculator.evaluate(volatility);
    final double dt = timeToExpiry / nSteps;

    return Math.sqrt(meanVol * meanVol * dt + meanNu * meanNu * dt * dt);
  }

  /**
   * @param volatility Volatility
   * @param nu Computed by getShiftedDrift method
   * @param dt time step
   * @return space step
   */
  public double getSpaceStepTrinomial(final double[] volatility, final double[] nu, final double dt) {
    final Function1D<double[], Double> calculator = new MeanCalculator();
    final double meanNu = calculator.evaluate(nu);
    final double meanVol = calculator.evaluate(volatility);

    return Math.sqrt(3. * meanVol * meanVol * dt + meanNu * meanNu * dt * dt);
  }
}
TOP

Related Classes of com.opengamma.analytics.financial.model.option.pricing.tree.TimeVaryingLatticeSpecification

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.