/** * Copyright (C) 2014 - 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 FlexibleLatticeSpecification 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 rootDt = Math.sqrt(dt); final double sigRootDt = volatility * rootDt; final double ref = 0.5 * Math.log(strike / spot) / sigRootDt + 0.5 * nSteps; int position = (int) ref; position = Math.abs(ref - position - 1.) < 1.e-12 ? position + 1 : position; final double cf = Math.exp(sigRootDt); final double mod = Math.pow(strike / spot * Math.pow(cf, nSteps - 2 * position), 1. / nSteps); final double upFactor = mod * cf; final double downFactor = mod / cf; final double upProbability = (Math.exp(interestRate * dt) - downFactor) / (upFactor - downFactor); return new double[] {upFactor, downFactor, upProbability, 1. - upProbability }; } }