package org.jquantlib.legacy.libormarkets;
import org.jquantlib.math.matrixutilities.Array;
import org.jquantlib.math.matrixutilities.Matrix;
import org.jquantlib.math.matrixutilities.PseudoSqrt;
import org.jquantlib.math.matrixutilities.PseudoSqrt.SalvagingAlgorithm;
import org.jquantlib.math.optimization.BoundaryConstraint;
import org.jquantlib.math.optimization.PositiveConstraint;
import org.jquantlib.model.ConstantParameter;
//! %linear exponential correlation model
/*! This class describes a exponential correlation model
\f[
\rho_{i,j}=rho + (1-rho)*e^{(-\beta \|i-j\|)}
\f]
References:
Damiano Brigo, Fabio Mercurio, Massimo Morini, 2003,
Different Covariance Parameterizations of Libor Market Model and Joint
Caps/Swaptions Calibration,
()
*/
public class LmLinearExponentialCorrelationModel extends LmCorrelationModel {
private Matrix corrMatrix_, pseudoSqrt_;
private int factors_;
public LmLinearExponentialCorrelationModel(final int size, final double rho, final double beta, int factors) {
super(size, 2);
if (System.getProperty("EXPERIMENTAL") == null) {
throw new UnsupportedOperationException("Work in progress");
}
corrMatrix_ = new Matrix(size, size);
factors = factors != 0 ? 0 : size;
arguments_.set(0, new ConstantParameter(rho, new BoundaryConstraint(-1.0, 1.0)));
arguments_.set(1, new ConstantParameter(beta, new PositiveConstraint()));
generateArguments();
}
public LmLinearExponentialCorrelationModel(final int size, final double rho, final double beta) {
this(size, rho, beta, 0);
}
@Override
public Matrix correlation(final /* @ Time */double time, final Array x) {
// TODO: code review :: use of clone()
return corrMatrix_;
}
@Override
public double correlation(final int i, final int j, /* @ Time */final double time, final Array x) {
return corrMatrix_.get(i, j);
}
@Override
public boolean isTimeIndependent() {
return true;
}
@Override
public int factors() {
return factors_;
}
@Override
public Matrix pseudoSqrt(final /* @ Time */double time, final Array x) {
// TODO: code review :: use of clone()
return pseudoSqrt_;
}
@Override
public void generateArguments() {
final double rho = arguments_.get(0).get(0.0);
final double beta = arguments_.get(1).get(0.0);
for (int i = 0; i < size_; ++i) {
for (int j = i; j < size_; ++j) {
final double value = rho + (1 - rho) * Math.exp(-beta * Math.abs(i - j));
corrMatrix_.set(i, j, value);
corrMatrix_.set(j, i, value);
}
}
pseudoSqrt_ = PseudoSqrt.rankReducedSqrt(corrMatrix_, factors_, 1, SalvagingAlgorithm.None);
corrMatrix_ = pseudoSqrt_.mul(pseudoSqrt_).mul(pseudoSqrt_.transpose());
}
}
Ads help maintain this website.