/** * 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 JarrowRuddLatticeSpecification 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 mudt = (interestRate - 0.5 * volatility * volatility) * dt; final double sigmaRootT = volatility * Math.sqrt(dt); final double upFactor = Math.exp(mudt + sigmaRootT); final double downFactor = Math.exp(mudt - sigmaRootT); return new double[] {upFactor, downFactor, 0.5, 0.5 }; } @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 halfVolSq = 0.5 * volatility * volatility; final double nu = interestRate - halfVolSq; final double u = Math.exp(lambda * volatility * rootT); final double d = 1 / u; final double logK = halfVolSq * dt; final double k = Math.exp(logK); final double kQuar = Math.exp(4. * logK); final double upProbability = (kQuar - (d + 1.) * k + d) / (u - d) / (u - 1.); final double downProbability = (kQuar - (u + 1.) * k + u) / (u - d) / (1. - d); final double middleFactor = Math.exp(nu * dt); final double upFactor = middleFactor * u; final double downFactor = middleFactor / u; return new double[] {upFactor, middleFactor, downFactor, upProbability, 1. - upProbability - downProbability, downProbability }; } }