/**
* 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;
/**
*
*/
public class CoxRossRubinsteinLatticeSpecification 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) {
final double upFactor = Math.exp(volatility * Math.sqrt(dt));
final double downFactor = 1. / upFactor;
final double upProbability = (Math.exp(interestRate * dt) - downFactor) / (upFactor - downFactor);
return new double[] {upFactor, downFactor, upProbability, 1. - upProbability };
}
@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;
}
@Override
public double[] getParametersTrinomial(final double spot, final double strike, final double timeToExpiry, final double volatility, final double interestRate, final int nSteps, final double dt) {
final double lambda = Math.sqrt(1.5);
final double rootT = Math.sqrt(dt);
final double lambdaSq = 1.5;
final double nu = interestRate - 0.5 * volatility * volatility;
final double dx = lambda * volatility * rootT;
final double upFactor = Math.exp(dx);
final double middleFactor = 1.;
final double downFactor = Math.exp(-dx);
final double upProbability = 0.5 / lambdaSq + 0.5 * nu * rootT / lambda / volatility;
final double middleProbability = 1. - 1. / lambdaSq;
final double downProbability = 0.5 / lambdaSq - 0.5 * nu * rootT / lambda / volatility;
return new double[] {upFactor, middleFactor, downFactor, upProbability, middleProbability, downProbability };
}
/**
* Parameters for two-dimensional extension of CRR trinomial model, here lambda = 1. is used
* This choice results in negative probabilities, but is numerically stable
* @param volatility Volatility
* @param interestRate The interest rate
* @param dt Time step
* @return {up factor, middle factor, down Factor, up Probability, middle probability, down Probability}
*/
public double[] getParametersTrinomial(final double volatility, final double interestRate, final double dt) {
final double lambda = Math.sqrt(1.);
final double rootT = Math.sqrt(dt);
final double lambdaSq = 1.;
final double nu = interestRate - 0.5 * volatility * volatility;
final double dx = lambda * volatility * rootT;
final double upFactor = Math.exp(dx);
final double middleFactor = 1.;
final double downFactor = Math.exp(-dx);
final double upProbability = 0.5 / lambdaSq + 0.5 * nu * rootT / lambda / volatility;
final double middleProbability = 1. - 1. / lambdaSq;
final double downProbability = 0.5 / lambdaSq - 0.5 * nu * rootT / lambda / volatility;
return new double[] {upFactor, middleFactor, downFactor, upProbability, middleProbability, downProbability };
}
}