
net.finmath.singleswaprate.calibration.SABRCubeParallelCalibration Maven / Gradle / Ivy
package net.finmath.singleswaprate.calibration;
import java.time.LocalDate;
import net.finmath.marketdata.model.volatilities.SwaptionDataLattice;
import net.finmath.singleswaprate.annuitymapping.AnnuityMapping.AnnuityMappingType;
import net.finmath.singleswaprate.model.VolatilityCubeModel;
import net.finmath.singleswaprate.model.volatilities.SABRVolatilityCubeParallel;
import net.finmath.singleswaprate.model.volatilities.SABRVolatilityCubeParallelFactory;
import net.finmath.singleswaprate.model.volatilities.VolatilityCube;
/**
* Calibrates a {@link SABRVolatilityCubeParallel}.
*
* @author Christian Fries
* @author Roland Bachl
*
*/
public class SABRCubeParallelCalibration extends AbstractCubeCalibration {
private double initialCorrelationDecay = 0;
private double initialIborOisDecorrelation = 1;
private double initialDisplacement = 0.25;
private double initialBeta = 0.5;
private double initialRho = 0.1;
private double initialVolvol = 0.0001;
private SwaptionDataLattice physicalATMSwaptions;
/**
* Create the calibrator.
*
* @param referenceDate The reference date of the cube.
* @param cashPayerPremiums The lattice containing market targets for cash settled payer swaptions. The lattice needs to be quoted in QuotingConvention.PRICE.
* @param cashReceiverPremiums The lattice containing market targets for cash settled receiver swaptions. The lattice needs to be quoted in QuotingConvention.PRICE.
* @param physicalATMSwaptions Lattice containing at-the-money values of physically settled swaptions.
* @param model The model providing context.
* @param annuityMappingType The type of annuity mapping to be used for calibration.
*/
public SABRCubeParallelCalibration(LocalDate referenceDate, SwaptionDataLattice cashPayerPremiums, SwaptionDataLattice cashReceiverPremiums,
SwaptionDataLattice physicalATMSwaptions, VolatilityCubeModel model, AnnuityMappingType annuityMappingType) {
super(referenceDate, cashPayerPremiums, cashReceiverPremiums, model, annuityMappingType);
this.physicalATMSwaptions = physicalATMSwaptions;
}
@Override
protected VolatilityCube buildCube(String name, double[] parameters) {
return SABRVolatilityCubeParallelFactory.createSABRVolatilityCubeParallel(name, getReferenceDate(), physicalATMSwaptions.getFixMetaSchedule(),
physicalATMSwaptions.getFloatMetaSchedule(), initialDisplacement, initialBeta, parameters[0], parameters[1],
initialCorrelationDecay, initialIborOisDecorrelation, physicalATMSwaptions, getModel(), getForwardCurveName());
}
@Override
protected void initializeParameters() {
setInitialParameters(new double[] { initialRho, initialVolvol });
}
@Override
protected double[] applyParameterBounds(double[] parameters) {
double[] boundedParameters = new double[parameters.length];
// boundedParameters[0] = Math.max(0, Math.min(0.99, parameters[0])); // Math.max(0, parameters[0]);
boundedParameters[0] = Math.max(-0.999999, Math.min(0.999999, parameters[0])); // parameters[1];
boundedParameters[1] = Math.max(parameters[1], 0);
return boundedParameters;
}
public double getInitialCorrelationDecay() {
return initialCorrelationDecay;
}
public void setInitialCorrelationDecay(double initialCorrelationDecay) {
this.initialCorrelationDecay = initialCorrelationDecay;
}
public double getInitialIborOisDecorrelation() {
return initialIborOisDecorrelation;
}
public void setInitialIborOisDecorrelation(double initialIborOisDecorrelation) {
this.initialIborOisDecorrelation = initialIborOisDecorrelation;
}
public double getInitialDisplacement() {
return initialDisplacement;
}
public void setInitialDisplacement(double initialDisplacement) {
this.initialDisplacement = initialDisplacement;
}
public double getInitialBeta() {
return initialBeta;
}
public void setInitialBeta(double initialBeta) {
this.initialBeta = initialBeta;
}
public double getInitialRho() {
return initialRho;
}
public void setInitialRho(double initialRho) {
this.initialRho = initialRho;
}
public double getInitialVolvol() {
return initialVolvol;
}
public void setInitialVolvol(double initialVolvol) {
this.initialVolvol = initialVolvol;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy