/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.method;
import com.opengamma.analytics.financial.forex.method.FXMatrix;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivative;
import com.opengamma.analytics.financial.model.interestrate.definition.InflationZeroCouponCapFloorParameters;
import com.opengamma.analytics.financial.model.option.parameters.BlackSmileCapInflationZeroCouponParameters;
import com.opengamma.analytics.financial.provider.calculator.inflation.PresentValueBlackSmileInflationZeroCouponCalculator;
import com.opengamma.analytics.financial.provider.description.inflation.BlackSmileCapInflationZeroCouponProvider;
import com.opengamma.analytics.financial.provider.description.inflation.InflationProviderInterface;
import com.opengamma.analytics.math.interpolation.Interpolator2D;
import com.opengamma.util.money.Currency;
/**
* Specific objective function for cap floor zero coupon in price index model model calibration.
*/
public class SuccessiveRootFinderInflationZeroCouponCapFloorCalibrationObjective extends SuccessiveRootFinderCalibrationObjectivewithInflation {
/**
* The pricing method used to price the cap/floor.
*/
private static final PresentValueBlackSmileInflationZeroCouponCalculator PVIC = PresentValueBlackSmileInflationZeroCouponCalculator.getInstance();
/**
* The cap floor Zero Coupon in price index model parameters before calibration. The calibration is done on the last volatility.
*/
private final InflationZeroCouponCapFloorParameters _inflationCapZeroCouponParameters;
/**
* The currency for which the cap floor year on year in price index model parameters are valid.
*/
private final Currency _ccyInflationcapZeroCoupon;
/**
* The inflation year on year parameters and curves bundle.
*/
private BlackSmileCapInflationZeroCouponProvider _inflationCapZeroCouponProvider;
/**
* The expiry index for the calibration.
*/
private int _expiryIndex;
/**
* The strike index for the calibration.
*/
private int _strikeIndex;
/**
* The initial volatilities before calibration.
*/
private final double[][] _volatilityInit;
/**
* Constructor of the objective function with the year on year cap/floor parameters. The parameters range and accuracy are set at some default value
* (minimum: 1.0E-6; maximum: 1.0, function value accuracy: 1.0E-4; parameter absolute accuracy: 1.0E-9).
* @param parameters The Zero Coupon cap/floor parameters.
* @param ccy The currency for which the Hull-White parameters are valid.
*/
public SuccessiveRootFinderInflationZeroCouponCapFloorCalibrationObjective(final InflationZeroCouponCapFloorParameters parameters, final Currency ccy) {
super(new FXMatrix(ccy), ccy);
_inflationCapZeroCouponParameters = parameters;
_ccyInflationcapZeroCoupon = ccy;
setMinimumParameter(1.0E-6);
setMaximumParameter(1.0);
setFunctionValueAccuracy(1.0E-4);
setVariableAbsoluteAccuracy(1.0E-9);
_volatilityInit = new double[parameters.getNumberOfExpiryTimes()][parameters.getNumberOfStrikes()];
for (int loopperiod = 0; loopperiod < parameters.getNumberOfExpiryTimes(); loopperiod++) {
for (int loopfact = 0; loopfact < parameters.getNumberOfStrikes(); loopfact++) {
_volatilityInit[loopperiod][loopfact] = parameters.getVolatility()[loopperiod][loopfact];
}
}
}
/**
* Sets the year on year cap/floor curve bundle using the Hull-White parameters and a given set of curves.
* @param inflation The multi-curves provider.
*/
@Override
public void setInflation(final InflationProviderInterface inflation) {
_inflationCapZeroCouponProvider = new BlackSmileCapInflationZeroCouponProvider(inflation, new BlackSmileCapInflationZeroCouponParameters(_inflationCapZeroCouponParameters));
}
/**
* Gets the inflation Zero Couponr cap/floor data.
* @return The inflation Zero Coupon cap/floor data.
*/
public InflationZeroCouponCapFloorParameters getInflationCapZeroCouponParameters() {
return _inflationCapZeroCouponParameters;
}
/**
* Sets the inflation Zero Coupon cap/floor curve bundle.
* @return The inflation Zero Coupon cap/floor curve bundle.
*/
public BlackSmileCapInflationZeroCouponProvider getInflationCapZeroCouponProvider() {
return _inflationCapZeroCouponProvider;
}
@Override
public void setInstrument(final InstrumentDerivative instrument) {
super.setInstrument(instrument);
}
/**
* Gets the expiry index.
* @return The expiry index.
*/
public int getExpiryIndex() {
return _expiryIndex;
}
/**
* Sets the expiry index.
* @param index The expiry index.
*/
public void setExpiryIndex(final int index) {
_expiryIndex = index;
}
/**
* Gets the strike index.
* @return The strike index.
*/
public int getStrikeIndex() {
return _strikeIndex;
}
/**
* Sets the strike index.
* @param index The strike index.
*/
public void setStrikeIndex(final int index) {
_strikeIndex = index;
}
@Override
public Double evaluate(final Double x) {
// setting the volatility in the volatility matrix
_inflationCapZeroCouponParameters.setVolatility(x, _expiryIndex, _strikeIndex);
// creating the new volatility surface using the new volatility matrix
final Interpolator2D interpolator = _inflationCapZeroCouponProvider.getBlackParameters().getVolatilitySurface().getInterpolator();
final BlackSmileCapInflationZeroCouponParameters blackSmileCapInflationZeroCouponParameters = new BlackSmileCapInflationZeroCouponParameters(_inflationCapZeroCouponParameters, interpolator);
final BlackSmileCapInflationZeroCouponProvider blackSmileCapInflationZeroCouponProvider = new BlackSmileCapInflationZeroCouponProvider(_inflationCapZeroCouponProvider.getInflationProvider(),
blackSmileCapInflationZeroCouponParameters);
return _inflationCapZeroCouponProvider.getMulticurveProvider().getFxRates().convert(getInstrument().accept(PVIC, blackSmileCapInflationZeroCouponProvider), _ccyInflationcapZeroCoupon).getAmount()
- getPrice();
}
}