com.opengamma.analytics.financial.model.option.pricing.montecarlo.EuropeanMonteCarloOptionModel.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.financial.model.option.pricing.montecarlo.EuropeanMonteCarloOptionModel.java

Source

/**
 * 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;
            }
        };
    }
}