/*
* (c) Copyright Christian P. Fries, Germany. All rights reserved. Contact: email@christian-fries.de.
*
* Created on 08.08.2005
*/
package net.finmath.montecarlo.interestrate.modelplugins;
import java.util.Arrays;
import net.finmath.montecarlo.RandomVariable;
import net.finmath.stochastic.RandomVariableInterface;
import net.finmath.time.TimeDiscretizationInterface;
/**
* @author Christian Fries
*/
public class LIBORVolatilityModelMaturityDependentFourParameterExponentialForm extends LIBORVolatilityModel {
private double[] a;
private double[] b;
private double[] c;
private double[] d;
/**
* @param timeDiscretization The simulation time discretization t<sub>j</sub>.
* @param liborPeriodDiscretization The period time discretization T<sub>i</sub>.
* @param a The parameter a: an initial volatility level.
* @param b The parameter b: the slope at the short end (shortly before maturity).
* @param c The parameter c: exponential decay of the volatility in time-to-maturity.
* @param d The parameter d: if c > 0 this is the very long term volatility level.
*/
public LIBORVolatilityModelMaturityDependentFourParameterExponentialForm(TimeDiscretizationInterface timeDiscretization, TimeDiscretizationInterface liborPeriodDiscretization, double a, double b, double c, double d) {
super(timeDiscretization, liborPeriodDiscretization);
this.a = new double[liborPeriodDiscretization.getNumberOfTimeSteps()]; Arrays.fill(this.a, a);
this.b = new double[liborPeriodDiscretization.getNumberOfTimeSteps()]; Arrays.fill(this.b, b);
this.c = new double[liborPeriodDiscretization.getNumberOfTimeSteps()]; Arrays.fill(this.c, c);
this.d = new double[liborPeriodDiscretization.getNumberOfTimeSteps()]; Arrays.fill(this.d, d);
}
/**
* @param timeDiscretization The simulation time discretization t<sub>j</sub>.
* @param liborPeriodDiscretization The period time discretization T<sub>i</sub>.
* @param a The parameter a: an initial volatility level.
* @param b The parameter b: the slope at the short end (shortly before maturity).
* @param c The parameter c: exponential decay of the volatility in time-to-maturity.
* @param d The parameter d: if c > 0 this is the very long term volatility level.
*/
public LIBORVolatilityModelMaturityDependentFourParameterExponentialForm(TimeDiscretizationInterface timeDiscretization, TimeDiscretizationInterface liborPeriodDiscretization, double[] a, double[] b, double[] c, double[] d) {
super(timeDiscretization, liborPeriodDiscretization);
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
@Override
public double[] getParameter() {
double[] parameter = new double[4];
parameter[0] = a[0];
parameter[1] = b[0];
parameter[2] = c[0];
parameter[3] = d[0];
return parameter;
}
@Override
public void setParameter(double[] parameter) {
Arrays.fill(this.a, parameter[0]);
Arrays.fill(this.b, parameter[1]);
Arrays.fill(this.c, parameter[2]);
Arrays.fill(this.d, parameter[3]);
}
/* (non-Javadoc)
* @see net.finmath.montecarlo.interestrate.modelplugins.LIBORVolatilityModel#getVolatility(int, int)
*/
@Override
public RandomVariableInterface getVolatility(int timeIndex, int liborIndex) {
// Create a very simple volatility model here
double time = getTimeDiscretization().getTime(timeIndex);
double maturity = getLiborPeriodDiscretization().getTime(liborIndex);
double timeToMaturity = maturity-time;
double volatilityInstanteaneous;
if(timeToMaturity <= 0)
{
volatilityInstanteaneous = 0.0; // This forward rate is already fixed, no volatility
}
else
{
volatilityInstanteaneous = (a[liborIndex] + b[liborIndex] * timeToMaturity) * Math.exp(-c[liborIndex] * timeToMaturity) + d[liborIndex];
}
if(volatilityInstanteaneous < 0.0) volatilityInstanteaneous = Math.max(volatilityInstanteaneous,0.0);
return new RandomVariable(getTimeDiscretization().getTime(timeIndex),volatilityInstanteaneous);
}
public void setParameters(double[] a, double[] b, double[] c, double[] d) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
@Override
public Object clone() {
return new LIBORVolatilityModelMaturityDependentFourParameterExponentialForm(
super.getTimeDiscretization(),
super.getLiborPeriodDiscretization(),
a,
b,
c,
d
);
}
}