@Override public String toString() { return "LeastSquareResults [chiSq=" + getChiSq() + ", fit parameters=" + getFitParameters().toString() + ", model parameters= " + getModelParameters().toString() + ", covariance=" + getCovariance().toString() + "]"; }
private void setModelParameterSensitivityToData() { DoubleMatrix invJac = _transform.inverseJacobian(getFitParameters()); _inverseJacobianModelPararms = (DoubleMatrix) MA.multiply(invJac, getFittingParameterSensitivityToData()); }
/** * This a matrix where the i,j-th element is the (infinitesimal) sensitivity of the i-th model parameter * to the j-th data point, when the fitting parameter are such that the chi-squared is minimised. * So it is a type of (inverse) Jacobian, but should not be confused with the model jacobian * (sensitivity of model parameters to internal parameters used in calibration procedure) or its inverse. * @return a matrix */ public DoubleMatrix getModelParameterSensitivityToData() { if (_inverseJacobianModelPararms == null) { setModelParameterSensitivityToData(); } return _inverseJacobianModelPararms; }
fixed.set(1); LeastSquareResultsWithTransform results = _nosiyFitter.solve(start, fixed); double[] res = results.getModelParameters().toArray(); double eps = 1e-2; assertEquals(ALPHA, res[0], eps); assertEquals(RHO, res[2], eps); assertEquals(NU, res[3], eps); assertEquals(0.0, results.getChiSq(), 10.0d); DoubleMatrix sensitivity = results.getModelParameterSensitivityToData(); double shiftFd = 1.0E-5; for (int i = 0; i < _cleanVols.length; i++) { DoubleArray.copyOf(volBumpedP), DoubleArray.copyOf(_errors), getModel()); LeastSquareResultsWithTransform resultsBumpedP = fitterP.solve(start, fixed); DoubleArray parameterBumpedP = resultsBumpedP.getModelParameters(); double[] volBumpedM = _noisyVols.clone(); volBumpedM[i] -= shiftFd; DoubleArray.copyOf(volBumpedM), DoubleArray.copyOf(_errors), getModel()); LeastSquareResultsWithTransform resultsBumpedM = fitterM.solve(start, fixed); DoubleArray parameterBumpedM = resultsBumpedM.getModelParameters(); DoubleArray sensitivityColumnFd = parameterBumpedP.minus(parameterBumpedM).dividedBy(2 * shiftFd); assertTrue(sensitivityColumnFd.equalWithTolerance(sensitivity.column(i), 1.0E-2));
public void testExactFitOddStart() { double[] start = new double[] {0.01, 0.99, 0.9, 0.4}; LeastSquareResultsWithTransform results = _fitter.solve(DoubleArray.copyOf(start)); double[] res = results.getModelParameters().toArray(); double eps = 1e-6; assertEquals(ALPHA, res[0], eps); assertEquals(BETA, res[1], eps); assertEquals(RHO, res[2], eps); assertEquals(NU, res[3], eps); assertEquals(0.0, results.getChiSq(), eps); }
transFunc.getFittingJacobian(), transform.transform(initialValues)); LeastSquareResultsWithTransform resTransform = new LeastSquareResultsWithTransform(res, transform); vols = updateParameters(sabrDefinition, vols, resTransform.getModelParameters());
private void checkCalibrationBlack( DoubleArray moneyness, DoubleArray blackVol, DoubleArray startParameters, BitSet fixed, double shift, double tolerance) { Pair<LeastSquareResultsWithTransform, DoubleArray> rComputed = SABR_CALIBRATION .calibrateLsShiftedFromBlackVolatilities(BDA, CALIBRATION_TIME, ACT_365F, EXPIRY_PERIOD, FORWARD, moneyness, ValueType.SIMPLE_MONEYNESS, blackVol, 0.0, startParameters, fixed, shift); SabrFormulaData sabrComputed = SabrFormulaData.of(rComputed.getFirst().getModelParameters().toArrayUnsafe()); for (int i = 0; i < moneyness.size(); i++) { double ivComputed = SABR_FORMULA.volatility( FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, sabrComputed.getAlpha(), sabrComputed.getBeta(), sabrComputed.getRho(), sabrComputed.getNu()); double priceComputed = BlackFormulaRepository.price(FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, ivComputed, true); double priceBlack = BlackFormulaRepository.price(FORWARD, FORWARD + moneyness.get(i), TIME_EXPIRY, blackVol.get(i), true); assertEquals(priceComputed, priceBlack, tolerance); // System.out.println("Black: " + priceComputed + " / " + priceBlack); } }
public LeastSquareResultsWithTransform(LeastSquareResults transformedFitResult) { super(transformedFitResult); _transform = null; _modelParameters = transformedFitResult.getFitParameters(); _inverseJacobianModelPararms = getFittingParameterSensitivityToData(); }
public LeastSquareResultsWithTransform(LeastSquareResults transformedFitResult, NonLinearParameterTransforms transform) { super(transformedFitResult); ArgChecker.notNull(transform, "null transform"); _transform = transform; _modelParameters = transform.inverseTransform(getFitParameters()); }
/** * Solve using a user supplied NonLinearParameterTransforms. * <p> * This returns {@link LeastSquareResults}. * * @param start the first guess at the parameter values * @param transform transform from model parameters to fitting parameters, and vice versa * @return the calibration results */ public LeastSquareResultsWithTransform solve(DoubleArray start, NonLinearParameterTransforms transform) { NonLinearTransformFunction transFunc = new NonLinearTransformFunction(volFunc, volAdjointFunc, transform); LeastSquareResults solRes = SOLVER.solve(marketValues, errors, transFunc.getFittingFunction(), transFunc.getFittingJacobian(), transform.transform(start), getConstraintFunction(transform), getMaximumStep()); return new LeastSquareResultsWithTransform(solRes, transform); }
fixed.set(1); LeastSquareResultsWithTransform results = _fitter.solve(start, fixed); double[] res = results.getModelParameters().toArray(); double eps = 1e-6; assertEquals(ALPHA, res[0], eps); assertEquals(RHO, res[2], eps); assertEquals(NU, res[3], eps); assertEquals(0.0, results.getChiSq(), eps); DoubleMatrix sensitivity = results.getModelParameterSensitivityToData(); double shiftFd = 1.0E-5; for (int i = 0; i < _cleanVols.length; i++) { DoubleArray.copyOf(volBumpedP), DoubleArray.copyOf(_errors), getModel()); LeastSquareResultsWithTransform resultsBumpedP = fitterP.solve(start, fixed); DoubleArray parameterBumpedP = resultsBumpedP.getModelParameters(); double[] volBumpedM = _cleanVols.clone(); volBumpedM[i] -= shiftFd; DoubleArray.copyOf(volBumpedM), DoubleArray.copyOf(_errors), getModel()); LeastSquareResultsWithTransform resultsBumpedM = fitterM.solve(start, fixed); DoubleArray parameterBumpedM = resultsBumpedM.getModelParameters(); DoubleArray sensitivityColumnFd = parameterBumpedP.minus(parameterBumpedM).dividedBy(2 * shiftFd); assertTrue(sensitivityColumnFd.equalWithTolerance(sensitivity.column(i), 1.0E-6));
public void testExactFitWithTransform() { double[] start = new double[] {0.01, 0.99, 0.9, 0.4}; NonLinearParameterTransforms transf = _fitter.getTransform(DoubleArray.copyOf(start)); LeastSquareResultsWithTransform results = _fitter.solve(DoubleArray.copyOf(start), transf); double[] res = results.getModelParameters().toArray(); double eps = 1e-6; assertEquals(ALPHA, res[0], eps); assertEquals(BETA, res[1], eps); assertEquals(RHO, res[2], eps); assertEquals(NU, res[3], eps); assertEquals(0.0, results.getChiSq(), eps); }
LeastSquareResults res = solver.solve(adjustedPrices, errors, transFunc.getFittingFunction(), transFunc.getFittingJacobian(), transform.transform(start)); LeastSquareResultsWithTransform resTransform = new LeastSquareResultsWithTransform(res, transform); vols = updateParameters(vols, nExpiries, i, betaFix, resTransform.getModelParameters()); totalChiSq += res.getChiSq(); prevExpiry = capList.get(startIndex[i + 1] - 1).getFinalFixingDateTime();
private void checkCalibrationNormal( DoubleArray moneyness, DoubleArray normalVol, DoubleArray startParameters, BitSet fixed, double shift, double tolerance) { Pair<LeastSquareResultsWithTransform, DoubleArray> rComputed = SABR_CALIBRATION .calibrateLsShiftedFromNormalVolatilities(BDA, CALIBRATION_TIME, ACT_365F, EXPIRY_PERIOD, FORWARD, moneyness, ValueType.SIMPLE_MONEYNESS, normalVol, startParameters, fixed, shift); SabrFormulaData sabrComputed = SabrFormulaData.of(rComputed.getFirst().getModelParameters().toArrayUnsafe()); for (int i = 0; i < moneyness.size(); i++) { double ivComputed = SABR_FORMULA.volatility( FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, sabrComputed.getAlpha(), sabrComputed.getBeta(), sabrComputed.getRho(), sabrComputed.getNu()); double priceComputed = BlackFormulaRepository.price(FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, ivComputed, true); double priceNormal = NormalFormulaRepository.price(FORWARD, FORWARD + moneyness.get(i), TIME_EXPIRY, normalVol.get(i), PutCall.CALL); assertEquals(priceComputed, priceNormal, tolerance); } }
if (r.getFirst().getChiSq() < chi2) { // Keep best calibration sabrCalibrationResult = r; chi2 = r.getFirst().getChiSq(); SabrFormulaData.of(sabrCalibrationResult.getFirst().getModelParameters().toArrayUnsafe()); DoubleMatrix parameterSensitivityToBlackShifted = sabrCalibrationResult.getFirst().getModelParameterSensitivityToData(); DoubleArray blackVolSensitivitytoRawData = sabrCalibrationResult.getSecond();
@SuppressWarnings("unused") public void testExactFit() { double[][] start = getStartValues(); BitSet[] fixed = getFixedValues(); int nStartPoints = start.length; ArgChecker.isTrue(fixed.length == nStartPoints); for (int trys = 0; trys < nStartPoints; trys++) { LeastSquareResultsWithTransform results = _fitter.solve(DoubleArray.copyOf(start[trys]), fixed[trys]); DoubleArray res = results.getModelParameters(); assertEquals(0.0, results.getChiSq(), _chiSqEps); int n = res.size(); T data = getModelData(); assertEquals(data.getNumberOfParameters(), n); for (int i = 0; i < n; i++) { assertEquals(data.getParameter(i), res.get(i), _paramValueEps); } } }
.calibrateLsShiftedFromPrices(BDA, CALIBRATION_TIME, ACT_365F, EXPIRY_PERIOD, FORWARD, moneyness, ValueType.SIMPLE_MONEYNESS, DoubleArray.ofUnsafe(prices), startParameters, fixed, shift); SabrFormulaData sabrComputed = SabrFormulaData.of(rComputed.getFirst().getModelParameters().toArrayUnsafe()); for (int i = 0; i < moneyness.size(); i++) { double ivComputed = SABR_FORMULA.volatility(
public void testNoisyFit() { double[][] start = getStartValues(); BitSet[] fixed = getFixedValues(); int nStartPoints = start.length; ArgChecker.isTrue(fixed.length == nStartPoints); for (int trys = 0; trys < nStartPoints; trys++) { LeastSquareResultsWithTransform results = _nosiyFitter.solve(DoubleArray.copyOf(start[trys]), fixed[trys]); DoubleArray res = results.getModelParameters(); double eps = 1e-2; assertTrue(results.getChiSq() < 7); int n = res.size(); T data = getModelData(); assertEquals(data.getNumberOfParameters(), n); for (int i = 0; i < n; i++) { assertEquals(data.getParameter(i), res.get(i), eps); } } }