/*
 * (c) Copyright Christian P. Fries, Germany. All rights reserved. Contact: email@christianfries.com.
 *
 * Created on 07.09.2014
 */

package net.finmath.marketdata.model.volatilities;

import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import net.finmath.exception.CalculationException;
import net.finmath.marketdata.calibration.ParameterObjectInterface;
import net.finmath.marketdata.calibration.ParameterTransformation;
import net.finmath.marketdata.calibration.Solver;
import net.finmath.marketdata.model.AnalyticModelInterface;
import net.finmath.marketdata.products.AnalyticProductInterface;
import net.finmath.optimizer.SolverException;

/**
 * @author Christian Fries
 */
public abstract class AbstractVolatilitySurfaceParametric extends AbstractVolatilitySurface implements ParameterObjectInterface {

	public AbstractVolatilitySurfaceParametric(String name, Calendar referenceDate) {
		super(name, referenceDate);
	}

	/**
	 * Returns a clone of this volatility surface with modified parameters.
	 * 
	 * @param value Parameter array.
	 * @return Clone with new parameters.
	 * @throws CloneNotSupportedException Thrown if this object cannot be cloned.
	 */
	public abstract AbstractVolatilitySurfaceParametric getCloneForParameter(double[] value) throws CloneNotSupportedException;

	public AbstractVolatilitySurfaceParametric getCloneCalibrated(final AnalyticModelInterface calibrationModel, final Vector calibrationProducts, final List calibrationTargetValues, Map calibrationParameters) throws CalculationException, SolverException {
		if(calibrationParameters == null) calibrationParameters = new HashMap();
		Integer maxIterationsParameter	= (Integer)calibrationParameters.get("maxIterations");
		Double	accuracyParameter		= (Double)calibrationParameters.get("accuracy");
		Double	evaluationTimeParameter		= (Double)calibrationParameters.get("evaluationTime");

		// @TODO: These constants should become parameters. The numberOfPaths and seed is only relevant if Monte-Carlo products are used for calibration.
		int maxIterations	= maxIterationsParameter != null ? maxIterationsParameter.intValue() : 400;
		double accuracy		= accuracyParameter != null ? accuracyParameter.doubleValue() : 1E-8;
		double evaluationTime		= evaluationTimeParameter != null ? evaluationTimeParameter.doubleValue() : 0.0;

		AnalyticModelInterface model = calibrationModel.addVolatilitySurfaces(this);
		
		
		// @TODO We constrain the parameters to positive values - this is experimental and will bekome a parameter
		ParameterTransformation parameterTransformation = new ParameterTransformation() {
			@Override
			public double[] getSolverParameter(final double[] parameter) {
				double[] newParameter = parameter.clone(); 
				for(int i=0; i objectsToCalibrate = new HashSet();
		objectsToCalibrate.add(this);
		AnalyticModelInterface modelCalibrated = solver.getCalibratedModel(objectsToCalibrate);

		double lastAccuracy		= solver.getAccuracy();
		double lastIterations	= solver.getIterations();

		return (AbstractVolatilitySurfaceParametric)modelCalibrated.getVolatilitySurface(this.getName());
	}
}

 

Ads help maintain this website.