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.
/*
* Created on 09.02.2004
*/
package net.finmath.montecarlo.interestrate.simple;
import java.util.Arrays;
import java.util.Map;
import net.finmath.montecarlo.BrownianMotion;
import net.finmath.montecarlo.BrownianMotionFromMersenneRandomNumbers;
import net.finmath.montecarlo.RandomVariableFromDoubleArray;
import net.finmath.montecarlo.interestrate.models.LIBORMarketModelFromCovarianceModel;
import net.finmath.montecarlo.interestrate.models.covariance.LIBORCorrelationModel;
import net.finmath.montecarlo.interestrate.models.covariance.LIBORCorrelationModelExponentialDecay;
import net.finmath.montecarlo.interestrate.models.covariance.LIBORCovarianceModel;
import net.finmath.montecarlo.interestrate.models.covariance.LIBORCovarianceModelFromVolatilityAndCorrelation;
import net.finmath.montecarlo.interestrate.models.covariance.LIBORVolatilityModel;
import net.finmath.montecarlo.process.MonteCarloProcess;
import net.finmath.stochastic.RandomVariable;
import net.finmath.time.TimeDiscretization;
/**
* Implements a basic LIBOR market model with a some drift approximation methods.
*
* This is a simpler version. Useful for studying.
*
* A more flexible / complex version of the model can be created by using {@link net.finmath.montecarlo.interestrate.models.LIBORMarketModelFromCovarianceModel}
* as an input to an {@link net.finmath.montecarlo.process.EulerSchemeFromProcessModel}.
*
* @author Christian Fries
* @version 0.5
* @since finmath-lib 4.1.0
*/
public class SimpleLIBORMarketModel extends AbstractLIBORMarketModel {
public enum Driftapproximation { EULER, LINE_INTEGRAL, PREDICTOR_CORRECTOR }
public enum Measure { SPOT, TERMINAL }
private final double[] liborInitialValues;
private LIBORCovarianceModel covarianceModel;
private Driftapproximation driftAproximationMethod = Driftapproximation.EULER;
private Measure measure = Measure.SPOT;
/**
* Creates a LIBOR Market Model for given covariance.
*
* @param timeDiscretization The time discretization of the process (simulation time).
* @param liborPeriodDiscretization The discretization of the interest rate curve into forward rates (tenor structure).
* @param numberOfPaths The number of paths.
* @param liborInitialValues The initial values for the forward rates.
* @param covarianceModel The covariance model to use.
*/
public SimpleLIBORMarketModel(
final TimeDiscretization timeDiscretization,
final TimeDiscretization liborPeriodDiscretization,
final int numberOfPaths,
final double[] liborInitialValues,
final LIBORCovarianceModel covarianceModel
) {
super( liborPeriodDiscretization,
new BrownianMotionFromMersenneRandomNumbers(timeDiscretization, covarianceModel.getNumberOfFactors(), numberOfPaths, 3141 /* seed */)
);
this.liborInitialValues = liborInitialValues;
this.covarianceModel = covarianceModel;
}
/**
* Creates a LIBOR Market Model for given covariance.
*
* @param liborPeriodDiscretization The discretization of the interest rate curve into forward rates (tenor structure).
* @param liborInitialValues The initial values for the forward rates.
* @param covarianceModel The covariance model to use.
* @param brownianMotion The brownian driver for the Monte-Carlo simulation.
*/
public SimpleLIBORMarketModel(
final TimeDiscretization liborPeriodDiscretization,
final double[] liborInitialValues,
final LIBORCovarianceModel covarianceModel,
final BrownianMotion brownianMotion
) {
super(liborPeriodDiscretization, brownianMotion);
if(covarianceModel.getNumberOfFactors() > brownianMotion.getNumberOfFactors()) {
throw new RuntimeException("Number of factors in covariance model is larger than number of Brownian drivers.");
}
this.liborInitialValues = liborInitialValues;
this.covarianceModel = covarianceModel;
}
/**
* Creates a LIBOR Market Model for given volatility and correlation model.
*
* @param timeDiscretizationFromArray The time discretization of the process (simulation time).
* @param liborPeriodDiscretization The discretization of the interest rate curve into forward rates (tenor structure).
* @param numberOfPaths The number of paths.
* @param liborInitialValues The initial values for the forward rates.
* @param volatilityModel The volatility model to use.
* @param correlationModel The correlation model to use.
*/
public SimpleLIBORMarketModel(
final TimeDiscretization timeDiscretizationFromArray,
final TimeDiscretization liborPeriodDiscretization,
final int numberOfPaths,
final double[] liborInitialValues,
final LIBORVolatilityModel volatilityModel,
final LIBORCorrelationModel correlationModel
) {
super( liborPeriodDiscretization,
new BrownianMotionFromMersenneRandomNumbers(timeDiscretizationFromArray, correlationModel.getNumberOfFactors(), numberOfPaths, 3141 /* seed */)
);
this.liborInitialValues = liborInitialValues;
covarianceModel = new LIBORCovarianceModelFromVolatilityAndCorrelation(timeDiscretizationFromArray, liborPeriodDiscretization, volatilityModel, correlationModel);
}
/**
* Creates a one factor LIBOR Market Model (correlation = 1).
*
* @param timeDiscretizationFromArray The time discretization of the process (simulation time).
* @param liborPeriodDiscretization The discretization of the interest rate curve into forward rates (tenor structure).
* @param numberOfPaths The number of paths.
* @param liborInitialValues The initial values for the forward rates.
* @param volatilityModel The volatility model to use.
*/
public SimpleLIBORMarketModel(
final TimeDiscretization timeDiscretizationFromArray,
final TimeDiscretization liborPeriodDiscretization,
final int numberOfPaths,
final double[] liborInitialValues,
final LIBORVolatilityModel volatilityModel
) {
super( liborPeriodDiscretization,
new BrownianMotionFromMersenneRandomNumbers(timeDiscretizationFromArray, 1 /* numberOfFactors */, numberOfPaths, 3141 /* seed */)
);
this.liborInitialValues = liborInitialValues;
covarianceModel = new LIBORCovarianceModelFromVolatilityAndCorrelation(timeDiscretizationFromArray, liborPeriodDiscretization, volatilityModel, new LIBORCorrelationModelExponentialDecay(timeDiscretizationFromArray, liborPeriodDiscretization, 1, 0.0, false));
}
/* (non-Javadoc)
* @see com.spacelike.fdml.monteCarlo.stockOptionPricing.LogNormalProcess#getInitialValue()
*/
@Override
public RandomVariable[] getInitialValue() {
final RandomVariable[] initialValueRandomVariable = new RandomVariable[getNumberOfComponents()];
for(int componentIndex=0; componentIndex= this.getLiborPeriod(componentIndex)) {
drift[componentIndex] = null;
continue;
}
drift[componentIndex] = this.getDrift(timeIndex, componentIndex, realizationAtTimeIndex, realizationPredictor);
}
return drift;
}
/* (non-Javadoc)
* @see com.spacelike.fdml.monteCarlo.stockOptionPricing.LogNormalProcess#getDrift(int, int)
*/
@Override
public RandomVariable getDrift(final int timeIndex, final int componentIndex, final RandomVariable[] realizationAtTimeIndex, final RandomVariable[] realizationPredictor) {
// The following is the drift of the LIBOR component
final int numberOfPaths = getNumberOfPaths();
final double time = getTime(timeIndex);
/*
* We implemented several different methods to calculate the drift
*/
final RandomVariable[] liborVectorStart = realizationAtTimeIndex;
final RandomVariable[] liborVectorEnd = realizationPredictor;
if(driftAproximationMethod == Driftapproximation.PREDICTOR_CORRECTOR && liborVectorEnd != null) {
final double[] drift = getLMMTerminasureDriftEuler(timeIndex, componentIndex, liborVectorStart);
final double[] driftEulerWithPredictor = getLMMTerminasureDriftEuler(timeIndex, componentIndex, liborVectorEnd);
for(int pathIndex=0; pathIndexRandomVariable
*/
@Override
public RandomVariable getNumeraire(final int timeIndex)
{
final double time = getTime(timeIndex);
// Get the start of the product
int firstLiborIndex = this.getLiborPeriodIndex(time);
// while(liborPeriodDiscretization[firstLiborIndex] < time) firstLiborIndex++;
// Get the end of the product
int lastLiborIndex = getLiborPeriodDiscretization().getNumberOfTimeSteps()-1;
if(measure == Measure.SPOT) {
// Spot measure
firstLiborIndex = 0;
lastLiborIndex = this.getLiborPeriodIndex(time)-1;
if(lastLiborIndex < -1) {
System.out.println("Interpolation on Numeraire not supported.");
}
}
/**
* Calculation of the numeraire (terminal measure)
*/
final double[] numeraire = new double[getNumberOfPaths()];
// Initialize to 1.0
Arrays.fill(numeraire,1.0);
// The product
for(int liborIndex = firstLiborIndex; liborIndex<=lastLiborIndex; liborIndex++) {
final RandomVariable libor = getProcessValue(Math.min(timeIndex,liborIndex), liborIndex);
final double periodLength = getLiborPeriodDiscretization().getTimeStep(liborIndex);
if(measure == Measure.SPOT) {
for(int path=0; path dataModified) {
throw new RuntimeException("Method not implemented");
}
@Override
public Object getCloneWithModifiedSeed(final int seed) {
return new SimpleLIBORMarketModel(
getLiborPeriodDiscretization(),
liborInitialValues,
getCovarianceModel(),
new BrownianMotionFromMersenneRandomNumbers(getTimeDiscretization(), covarianceModel.getNumberOfFactors(), getNumberOfPaths(), seed)
);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.interestrate.LIBORModelMonteCarloSimulationModel#getModel()
*/
@Override
public LIBORMarketModelFromCovarianceModel getModel() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.interestrate.LIBORModelMonteCarloSimulationModel#getProcess()
*/
@Override
public MonteCarloProcess getProcess() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.MonteCarloSimulationModel#getRandomVariableForConstant(double)
*/
@Override
public RandomVariable getRandomVariableForConstant(final double value) {
return getBrownianMotion().getRandomVariableForConstant(value);
}
@Override
public Map getModelParameters() {
// TODO Add implementation
throw new UnsupportedOperationException();
}
}