/** * 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 TrigeorgisLatticeSpecification 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 dx = Math.sqrt(volatility * volatility * dt + mudt * mudt); final double upFactor = Math.exp(dx); final double downFactor = Math.exp(-dx); final double upProbability = 0.5 + 0.5 * mudt / dx; 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 volSq = volatility * volatility; final double mu = interestRate - 0.5 * volSq; final double mudt = mu * dt; final double mudtSq = mudt * mudt; final double dx = volatility * Math.sqrt(3. * dt); final double upFactor = Math.exp(dx); final double downFactor = Math.exp(-dx); final double part = (volSq * dt + mudtSq) / dx / dx; final double upProbability = 0.5 * (part + mudt / dx); final double middleProbability = 1. - part; final double downProbability = 0.5 * (part - mudt / dx); return new double[] {upFactor, 1., downFactor, upProbability, middleProbability, downProbability }; } }