/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.stochastic;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.model.option.definition.OptionDefinition;
import com.opengamma.analytics.financial.model.option.definition.StandardOptionDataBundle;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.function.Function2D;
/**
*
* @param <T>
* @param <U>
*/
public class BlackScholesGeometricBrownianMotionProcess<T extends OptionDefinition, U extends StandardOptionDataBundle> extends StochasticProcess<T, U> {
@Override
public Function1D<Double, Double> getPathGeneratingFunction(final T t, final U u, final int steps) {
Validate.notNull(t);
Validate.notNull(u);
if (steps < 1) {
throw new IllegalArgumentException("Number of steps must be greater than zero");
}
final double k = t.getStrike();
final double m = t.getTimeToExpiry(u.getDate());
final double sigma = u.getVolatility(m, k);
final double b = u.getCostOfCarry();
final double dt = m / steps;
final double sigmaSq = sigma * sigma;
final double nu = dt * (b - 0.5 * sigmaSq);
final double sigmaDt = sigma * Math.sqrt(dt);
return new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double e) {
return nu + sigmaDt * e;
}
};
}
@Override
public Double getInitialValue(final T t, final U u) {
return Math.log(u.getSpot());
}
@Override
public Double getFinalValue(final Double x) {
return Math.exp(x);
}
@Override
public Function2D<Double, Double> getPathAccumulationFunction() {
return new Function2D<Double, Double>() {
@Override
public Double evaluate(final Double x1, final Double x2) {
return x1 + x2;
}
};
}
}