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); }
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); }
@Override public String toString() { return "LeastSquareResults [chiSq=" + getChiSq() + ", fit parameters=" + getFitParameters().toString() + ", model parameters= " + getModelParameters().toString() + ", covariance=" + getCovariance().toString() + "]"; }
transform.transform(initialValues)); LeastSquareResultsWithTransform resTransform = new LeastSquareResultsWithTransform(res, transform); vols = updateParameters(sabrDefinition, vols, resTransform.getModelParameters());
fixed.set(1); LeastSquareResultsWithTransform results = _nosiyFitter.solve(start, fixed); double[] res = results.getModelParameters().toArray(); double eps = 1e-2; assertEquals(ALPHA, res[0], eps); 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));
fixed.set(1); LeastSquareResultsWithTransform results = _fitter.solve(start, fixed); double[] res = results.getModelParameters().toArray(); double eps = 1e-6; assertEquals(ALPHA, res[0], eps); 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));
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();
@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); } } }
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); } } }
SabrFormulaData.of(sabrCalibrationResult.getFirst().getModelParameters().toArrayUnsafe()); DoubleMatrix parameterSensitivityToBlackShifted = sabrCalibrationResult.getFirst().getModelParameterSensitivityToData();
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); } }
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); } }
.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(