net.finmath.montecarlo.assetderivativevaluation.MonteCarloAssetModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of finmath-lib Show documentation
Show all versions of finmath-lib Show documentation
finmath lib is a Mathematical Finance Library in Java.
It provides algorithms and methodologies related to mathematical finance.
/*
* (c) Copyright Christian P. Fries, Germany. Contact: [email protected].
*
* Created on 20.01.2004
*/
package net.finmath.montecarlo.assetderivativevaluation;
import java.time.LocalDateTime;
import java.util.Map;
import net.finmath.exception.CalculationException;
import net.finmath.montecarlo.model.AbstractProcessModel;
import net.finmath.montecarlo.model.ProcessModel;
import net.finmath.montecarlo.process.MonteCarloProcess;
import net.finmath.stochastic.RandomVariable;
import net.finmath.time.TimeDiscretization;
/**
* This class glues together an AbstractProcessModel
and a Monte-Carlo implementation of a MonteCarloProcessFromProcessModel
* and implements AssetModelMonteCarloSimulationModel
.
*
* The model is specified via the object implementing ProcessModel
.
*
* @author Christian Fries
* @see net.finmath.montecarlo.process.MonteCarloProcess The interface for numerical schemes.
* @see net.finmath.montecarlo.model.ProcessModel The interface for models provinding parameters to numerical schemes.
* @version 1.0
*/
public class MonteCarloAssetModel implements AssetModelMonteCarloSimulationModel {
private final ProcessModel model;
/**
* Create a Monte-Carlo simulation using given process discretization scheme.
*
* @param model The model to be used.
* @param process The numerical scheme to be used.
*/
public MonteCarloAssetModel(
ProcessModel model,
MonteCarloProcess process) {
super();
this.model = model;
// Link model and process for delegation
process.setModel(model);
model.setProcess(process);
}
@Override
public RandomVariable getAssetValue(double time, int assetIndex) throws CalculationException {
return getAssetValue(getTimeIndex(time), assetIndex);
}
@Override
public RandomVariable getAssetValue(int timeIndex, int assetIndex) throws CalculationException {
return model.getProcess().getProcessValue(timeIndex, assetIndex);
}
@Override
public RandomVariable getNumeraire(int timeIndex) throws CalculationException {
double time = getTime(timeIndex);
return model.getNumeraire(time);
}
@Override
public RandomVariable getNumeraire(double time) throws CalculationException {
return model.getNumeraire(time);
}
@Override
public RandomVariable getMonteCarloWeights(double time) throws CalculationException {
return getMonteCarloWeights(getTimeIndex(time));
}
@Override
public int getNumberOfAssets() {
return 1;
}
@Override
public AssetModelMonteCarloSimulationModel getCloneWithModifiedData(Map dataModified) throws CalculationException {
MonteCarloProcess process = model.getProcess();
ProcessModel newModel = model.getCloneWithModifiedData(dataModified);
MonteCarloProcess newProcess;
try {
newProcess = process.getCloneWithModifiedData(dataModified);
}
catch(UnsupportedOperationException e) {
newProcess = process;
}
// In the case where the model has changed we need a new process anyway
if(newModel != model && newProcess == process) {
newProcess = process.clone();
}
return new MonteCarloAssetModel(newModel, newProcess);
}
@Override
public AssetModelMonteCarloSimulationModel getCloneWithModifiedSeed(int seed) {
throw new UnsupportedOperationException("Method not implemented");
}
@Override
public int getNumberOfPaths() {
return model.getProcess().getNumberOfPaths();
}
@Override
public LocalDateTime getReferenceDate() {
return model.getReferenceDate();
}
@Override
public TimeDiscretization getTimeDiscretization() {
return model.getProcess().getTimeDiscretization();
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.MonteCarloSimulationModel#getTime(int)
*/
@Override
public double getTime(int timeIndex) {
return model.getProcess().getTime(timeIndex);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.MonteCarloSimulationModel#getTimeIndex(double)
*/
@Override
public int getTimeIndex(double time) {
return model.getProcess().getTimeIndex(time);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.MonteCarloSimulationModel#getRandomVariableForConstant(double)
*/
@Override
public RandomVariable getRandomVariableForConstant(double value) {
return model.getRandomVariableForConstant(value);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.MonteCarloSimulationModel#getMonteCarloWeights(int)
*/
@Override
public RandomVariable getMonteCarloWeights(int timeIndex) throws CalculationException {
return model.getProcess().getMonteCarloWeights(timeIndex);
}
/**
* Returns the {@link AbstractProcessModel} used for this Monte-Carlo simulation.
*
* @return the model
*/
public ProcessModel getModel() {
return model;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy