/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.option.pricing.montecarlo; import org.apache.commons.lang.Validate; import com.opengamma.analytics.financial.model.option.definition.OptionDefinition; import com.opengamma.analytics.financial.model.option.definition.OptionPayoffFunction; import com.opengamma.analytics.financial.model.option.definition.StandardOptionDataBundle; import com.opengamma.analytics.financial.model.stochastic.StochasticProcess; import com.opengamma.analytics.math.function.Function1D; import com.opengamma.analytics.math.function.Function2D; import com.opengamma.analytics.math.random.RandomNumberGenerator; /** * */ public class EuropeanMonteCarloOptionModel extends MonteCarloOptionModel<OptionDefinition, StandardOptionDataBundle> { public EuropeanMonteCarloOptionModel(final int n, final int steps, final StochasticProcess<OptionDefinition, StandardOptionDataBundle> process, final RandomNumberGenerator generator) { super(n, steps, process, generator); } @Override public Function1D<StandardOptionDataBundle, Double> getPricingFunction(final OptionDefinition definition) { Validate.notNull(definition, "definition"); final OptionPayoffFunction<StandardOptionDataBundle> payoffFunction = definition.getPayoffFunction(); final int steps = getSteps(); final int n = getN(); final RandomNumberGenerator randomNumbers = getGenerator(); final StochasticProcess<OptionDefinition, StandardOptionDataBundle> process = getProcess(); final Function2D<Double, Double> accumulator = process.getPathAccumulationFunction(); return new Function1D<StandardOptionDataBundle, Double>() { @Override public Double evaluate(final StandardOptionDataBundle data) { Validate.notNull(data, "data"); final Function1D<Double, Double> generator = process.getPathGeneratingFunction(definition, data, steps); double[] e; final double s0 = process.getInitialValue(definition, data); double st; double sum = 0; for (int i = 0; i < n; i++) { e = randomNumbers.getVector(steps); st = s0; for (int j = 0; j < steps; j++) { st = accumulator.evaluate(generator.evaluate(e[j]), st); } sum += payoffFunction.getPayoff(data.withSpot(process.getFinalValue(st)), 0.); } final double t = definition.getTimeToExpiry(data.getDate()); final double r = data.getInterestRate(t); return Math.exp(-r * t) * sum / n; } }; } }