@Override public Double apply(Double x) { return price(forward, strike, timeToExpiry, x, isCall); } };
@Override public double price(double expiry, PutCall putCall, double strike, double forward, double volatility) { return BlackFormulaRepository.price(forward, strike, expiry, volatility, putCall.isCall()); }
public void putCallParityTest() { int n = VOLS.length; int m = STRIKES_INPUT.length; for (int i = 0; i < m; i++) { double fk = FORWARD - STRIKES_INPUT[i]; for (int j = 0; j < n; j++) { double call = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, VOLS[j], true); double put = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, VOLS[j], false); assertEquals(fk, call - put, 1e-13); } } }
public void nonEdgeCaseTest() { boolean isCall = true; int n = VOLS.length; int m = STRIKES_INPUT.length; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, VOLS[j], isCall); assertEquals(PRE_COMPUTER_PRICES[i][j], price, 1e-13 * price); } } }
public void massiveVolTest() { double vol = 8.0; // 800% vol boolean isCall = true; int n = STRIKES_INPUT.length; for (int i = 0; i < n; i++) { double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, vol, isCall); assertEquals(FORWARD, price, 1e-15); } }
public void zeroStikeTest() { boolean isCall = true; int n = VOLS.length; for (int i = 0; i < n; i++) { double price = BlackFormulaRepository.price(FORWARD, 0.0, TIME_TO_EXPIRY, VOLS[i], isCall); assertEquals(FORWARD, price, 1e-15); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void negativeVolErrorPriceTest() { BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[1], TIME_TO_EXPIRY, -0.5, true); }
public void zeroExpiryTest() { boolean isCall = false; int n = STRIKES_INPUT.length; for (int i = 0; i < n; i++) { double intrinic = Math.max(0, STRIKES_INPUT[i] - FORWARD); double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], 0.0, 0.3, isCall); assertEquals(intrinic, price, 1e-15); } }
@Override public double price(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility) { double shift = parameters.shift(expiry, tenor); return BlackFormulaRepository.price(forward + shift, strike + shift, expiry, volatility, putCall.isCall()); }
public void tinyVolTest() { double vol = 1e-4; boolean isCall = true; int n = STRIKES_INPUT.length; for (int i = 0; i < n; i++) { double intrinic = Math.max(0, FORWARD - STRIKES_INPUT[i]); double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, vol, isCall); assertEquals(intrinic, price, 1e-15); } }
public void shortExpiryTest() { double t = 1e-5; double vol = 0.4; boolean isCall = false; int n = STRIKES_INPUT.length; for (int i = 0; i < n; i++) { double intrinic = Math.max(0, STRIKES_INPUT[i] - FORWARD); double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], t, vol, isCall); assertEquals(intrinic, price, 1e-15); } }
public void zeroVolTest() { boolean isCall = true; int n = STRIKES_INPUT.length; for (int i = 0; i < n; i++) { double intrinic = Math.max(0, FORWARD - STRIKES_INPUT[i]); double price = BlackFormulaRepository.price(FORWARD, STRIKES_INPUT[i], TIME_TO_EXPIRY, 0.0, isCall); assertEquals(intrinic, price, 1e-15); } }
@Override public double price(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = shiftCurve.yValue(expiry); return BlackFormulaRepository.price(forward + shift, strike + shift, expiry, volatility, putCall.isCall()); }
@Override public double price(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = parameters.shift(expiry); return BlackFormulaRepository.price(forward + shift, strike + shift, expiry, volatility, putCall.isCall()); }
private void priceCheck(double[] strikes) { for (int i = 0; i < N; i++) { double ivBlackComputed = BlackFormulaRepository .impliedVolatilityFromNormalApproximated(FORWARD, strikes[i], TIME_TO_EXPIRY, SIGMA_NORMAL[i]); double priceBlackComputed = BlackFormulaRepository .price(FORWARD, strikes[i], TIME_TO_EXPIRY, ivBlackComputed, true); double priceNormal = NormalFormulaRepository .price(FORWARD, strikes[i], TIME_TO_EXPIRY, SIGMA_NORMAL[i], CALL); assertEquals(priceNormal, priceBlackComputed, TOLERANCE_PRICE); } }
private void priceCheck(double[] strikes) { for (int i = 0; i < N; i++) { double ivNormalComputed = NormalFormulaRepository .impliedVolatilityFromBlackApproximated(FORWARD, strikes[i], T, SIGMA_BLACK[i]); double priceNormalComputed = NormalFormulaRepository.price(FORWARD, strikes[i], T, ivNormalComputed, PutCall.CALL) * DF; double priceBlack = BlackFormulaRepository.price(FORWARD, strikes[i], T, SIGMA_BLACK[i], true) * DF; assertEquals(priceNormalComputed, priceBlack, TOLERANCE_PRICE); } }
@Override public ValueDerivatives apply(DoublesPair x) { double price = BlackFormulaRepository.price(spot, x.getSecond(), x.getFirst(), constantVol, true); return ValueDerivatives.of(price, DoubleArray.EMPTY); } };
public void test_price_from_future_price() { double futurePrice = 1.1d; double computed = OPTION_PRICER.price(FUTURE_OPTION_PRODUCT, RATE_PROVIDER, VOLS, futurePrice); double strike = FUTURE_OPTION_PRODUCT.getStrikePrice(); double expiryTime = ACT_365F.relativeYearFraction(VAL_DATE, FUTURE_OPTION_PRODUCT.getExpiryDate()); double logMoneyness = Math.log(strike / futurePrice); double vol = SURFACE.zValue(expiryTime, logMoneyness); double expected = BlackFormulaRepository.price(futurePrice, strike, expiryTime, vol, true); assertEquals(computed, expected, TOL); }
public void test_price() { double computed = OPTION_PRICER.price(FUTURE_OPTION_PRODUCT, RATE_PROVIDER, VOLS); double futurePrice = FUTURE_PRICER.price(FUTURE_OPTION_PRODUCT.getUnderlyingFuture(), RATE_PROVIDER); double strike = FUTURE_OPTION_PRODUCT.getStrikePrice(); double expiryTime = ACT_365F.relativeYearFraction(VAL_DATE, FUTURE_OPTION_PRODUCT.getExpiryDate()); double logMoneyness = Math.log(strike / futurePrice); double vol = SURFACE.zValue(expiryTime, logMoneyness); double expected = BlackFormulaRepository.price(futurePrice, strike, expiryTime, vol, true); assertEquals(computed, expected, TOL); }
public void present_value_formula() { double forward = PRICER_SWAP.parRate(RSWAP_REC, MULTI_USD); double pvbp = PRICER_SWAP.getLegPricer().pvbp(RSWAP_REC.getLegs(SwapLegType.FIXED).get(0), MULTI_USD); double volatility = BLACK_VOLS_USD_STD.volatility(SWAPTION_LONG_REC.getExpiry(), SWAP_TENOR_YEAR, STRIKE, forward); double expiry = BLACK_VOLS_USD_STD.relativeTime(SWAPTION_LONG_REC.getExpiry()); double pvExpected = Math.abs(pvbp) * BlackFormulaRepository.price(forward, STRIKE, expiry, volatility, false); CurrencyAmount pvComputed = PRICER_SWAPTION_BLACK.presentValue(SWAPTION_LONG_REC, MULTI_USD, BLACK_VOLS_USD_STD); assertEquals(pvComputed.getCurrency(), USD); assertEquals(pvComputed.getAmount(), pvExpected, TOLERANCE_PV); }