Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* (c) Copyright Christian P. Fries, Germany. Contact: [email protected].
*
* Created on 26.11.2012
*/
package net.finmath.marketdata2.calibration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import net.finmath.marketdata2.model.AnalyticModel;
import net.finmath.marketdata2.products.AnalyticProduct;
import net.finmath.montecarlo.RandomVariableFromDoubleArray;
import net.finmath.optimizer.SolverException;
import net.finmath.optimizer.StochasticOptimizer;
import net.finmath.optimizer.StochasticOptimizerFactory;
import net.finmath.optimizer.StochasticPathwiseOptimizerFactoryLevenbergMarquardt;
import net.finmath.stochastic.RandomVariable;
/**
* Generates a calibrated model for a given set
* of calibrationProducts with respect to given CurveFromInterpolationPointss.
*
* The model and the curve are assumed to be immutable, i.e., the solver
* will return a calibrate clone, containing clones for every curve
* which is part of the set of curves to be calibrated.
*
* The calibration is performed as a multi-threaded global optimization.
* I will greatly profit from a multi-core architecture.
*
* @author Christian Fries
* @version 1.0
*/
public class Solver {
private final AnalyticModel model;
private final List calibrationProducts;
private final List calibrationTargetValues;
private final double calibrationAccuracy;
private final ParameterTransformation parameterTransformation;
private StochasticOptimizerFactory optimizerFactory;
private final double evaluationTime;
private final int maxIterations = 1000;
private int iterations = 0;
private double accuracy = Double.POSITIVE_INFINITY;
/**
* Generate a solver for the given parameter objects (independents) and
* objective functions (dependents).
*
* @param model The model from which a calibrated clone should be created.
* @param calibrationProducts The objective functions.
* @param calibrationTargetValues Array of target values for the objective functions.
* @param parameterTransformation A parameter transformation, if any, otherwise null.
* @param evaluationTime Evaluation time applied to the calibration products.
* @param optimizerFactory A factory providing the optimizer (for the given objective function)
*/
public Solver(final AnalyticModel model, final Vector calibrationProducts, final List calibrationTargetValues, final ParameterTransformation parameterTransformation, final double evaluationTime, final StochasticOptimizerFactory optimizerFactory) {
super();
this.model = model;
this.calibrationProducts = calibrationProducts;
this.calibrationTargetValues = calibrationTargetValues;
this.parameterTransformation = parameterTransformation;
this.evaluationTime = evaluationTime;
this.optimizerFactory = optimizerFactory;
calibrationAccuracy = 0.0;
}
/**
* Generate a solver for the given parameter objects (independents) and
* objective functions (dependents).
*
* @param model The model from which a calibrated clone should be created.
* @param calibrationProducts The objective functions.
* @param calibrationTargetValues Array of target values for the objective functions.
* @param parameterTransformation A parameter transformation, if any, otherwise null.
* @param evaluationTime Evaluation time applied to the calibration products.
* @param calibrationAccuracy The error tolerance of the solver.
*/
public Solver(final AnalyticModel model, final Vector calibrationProducts, final List calibrationTargetValues, final ParameterTransformation parameterTransformation, final double evaluationTime, final double calibrationAccuracy) {
super();
this.model = model;
this.calibrationProducts = calibrationProducts;
this.calibrationTargetValues = calibrationTargetValues;
this.parameterTransformation = parameterTransformation;
this.evaluationTime = evaluationTime;
this.calibrationAccuracy = calibrationAccuracy;
optimizerFactory = null;
}
/**
* Generate a solver for the given parameter objects (independents) and
* objective functions (dependents).
*
* @param model The model from which a calibrated clone should be created.
* @param calibrationProducts The objective functions.
* @param calibrationTargetValues Array of target values for the objective functions.
* @param evaluationTime Evaluation time applied to the calibration products.
* @param calibrationAccuracy The error tolerance of the solver.
*/
public Solver(final AnalyticModel model, final Vector calibrationProducts, final List calibrationTargetValues, final double evaluationTime, final double calibrationAccuracy) {
this(model, calibrationProducts, calibrationTargetValues, null, evaluationTime, calibrationAccuracy);
}
/**
* Generate a solver for the given parameter objects (independents) and
* objective functions (dependents).
*
* @param model The model from which a calibrated clone should be created.
* @param calibrationProducts The objective functions.
* @param evaluationTime Evaluation time applied to the calibration products.
* @param calibrationAccuracy The error tolerance of the solver.
*/
public Solver(final AnalyticModel model, final Vector calibrationProducts, final double evaluationTime, final double calibrationAccuracy) {
this(model, calibrationProducts, null, null, evaluationTime, calibrationAccuracy);
}
/**
* Generate a solver for the given parameter objects (independents) and
* objective functions (dependents).
*
* @param model The model from which a calibrated clone should be created.
* @param calibrationProducts The objective functions.
*/
public Solver(final AnalyticModel model, final Vector calibrationProducts) {
this(model, calibrationProducts, 0.0, 0.0);
}
/**
* Find the model such that the equation
*
* objectiveFunctions.getValue(model) = 0
*
* holds.
*
* @param objectsToCalibrate The set of parameterized objects to calibrate.
* @return A reference to a calibrated clone of the given model.
* @throws net.finmath.optimizer.SolverException Thrown if the underlying optimizer does not find a solution.
*/
public AnalyticModel getCalibratedModel(final Set objectsToCalibrate) throws SolverException {
final ParameterAggregation parameterAggregate = new ParameterAggregation<>(objectsToCalibrate);
// Set solver parameters
final RandomVariable[] initialParameters;
// Apply parameter transformation to solver parameter space
if(parameterTransformation != null) {
initialParameters = parameterTransformation.getSolverParameter(parameterAggregate.getParameter());
} else {
initialParameters = parameterAggregate.getParameter();
}
final RandomVariable[] zeros = new RandomVariable[calibrationProducts.size()];
final RandomVariable[] ones = new RandomVariable[calibrationProducts.size()];
final RandomVariable[] lowerBound = new RandomVariable[initialParameters.length];
final RandomVariable[] upperBound = new RandomVariable[initialParameters.length];
java.util.Arrays.fill(zeros, new RandomVariableFromDoubleArray(0.0));
java.util.Arrays.fill(ones, new RandomVariableFromDoubleArray(1.0));
java.util.Arrays.fill(lowerBound, new RandomVariableFromDoubleArray(Double.NEGATIVE_INFINITY));
java.util.Arrays.fill(upperBound, new RandomVariableFromDoubleArray(Double.POSITIVE_INFINITY));
final StochasticOptimizer.ObjectiveFunction objectiveFunction = new StochasticOptimizer.ObjectiveFunction() {
@Override
public void setValues(final RandomVariable[] parameters, final RandomVariable[] values) throws SolverException {
RandomVariable[] modelParameters = parameters;
try {
if(parameterTransformation != null) {
modelParameters = parameterTransformation.getParameter(parameters);
// Copy back the parameter constrain to inform the optimizer
System.arraycopy(parameterTransformation.getSolverParameter(modelParameters), 0, parameters, 0, parameters.length);
}
final Map curvesParameterPairs = parameterAggregate.getObjectsToModifyForParameter(modelParameters);
final AnalyticModel modelClone = model.getCloneForParameter(curvesParameterPairs);
for(int i=0; i curvesParameterPairs = parameterAggregate.getObjectsToModifyForParameter(bestParameters);
calibratedModel = model.getCloneForParameter(curvesParameterPairs);
} catch (final CloneNotSupportedException e) {
throw new SolverException(e);
}
accuracy = 0.0;
for(int i=0; i