/** * Calculates the rho parameter for time to expiry. * * @param expiry the time to expiry as a year fraction * @return the rho parameter */ public double rho(double expiry) { return rhoCurve.yValue(expiry); }
@Override public CurrencyParameterSensitivities parameterSensitivity(ZeroRateSensitivity pointSens) { double yearFraction = pointSens.getYearFraction(); double rp = curve.yValue(yearFraction); double rcBar = 1.0; double rpBar = 1.0 / (1 + rp / frequency) * rcBar; UnitParameterSensitivity unitSens = curve.yValueParameterSensitivity(yearFraction).multipliedBy(rpBar); CurrencyParameterSensitivity curSens = unitSens.multipliedBy(pointSens.getCurrency(), pointSens.getSensitivity()); return CurrencyParameterSensitivities.of(curSens); }
/** * Calculates the alpha parameter for time to expiry. * * @param expiry the time to expiry as a year fraction * @return the alpha parameter */ public double alpha(double expiry) { return alphaCurve.yValue(expiry); }
/** * Calculates the shift parameter for time to expiry. * * @param expiry the time to expiry as a year fraction * @return the shift parameter */ public double shift(double expiry) { return shiftCurve.yValue(expiry); }
@Override public double discountFactor(double yearFraction) { // read discount factor directly off curve return curve.yValue(yearFraction); }
@Override public double discountFactor(double yearFraction) { // convert zero rate to discount factor return Math.exp(-yearFraction * curve.yValue(yearFraction)); }
@Override public double zeroRate(double yearFraction) { double ratePeriod = curve.yValue(yearFraction); return frequency * Math.log(1d + ratePeriod / frequency); }
@Override public double discountFactor(double relativeYearFraction) { // convert zero rate periodically compounded to discount factor return Math.pow(1d + curve.yValue(relativeYearFraction) / frequency, -relativeYearFraction * frequency); }
@Override public double priceTheta(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = shiftCurve.yValue(expiry); return BlackFormulaRepository.driftlessTheta(forward + shift, strike + shift, expiry, volatility); }
@Override public double volatility(double expiry, double strike, double forward) { double shift = shiftCurve.yValue(expiry); return surface.zValue(expiry, strike + shift); }
@Override public double priceGamma(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = shiftCurve.yValue(expiry); return BlackFormulaRepository.gamma(forward + shift, strike + shift, expiry, volatility); }
@Override public double priceVega(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = shiftCurve.yValue(expiry); return BlackFormulaRepository.vega(forward + shift, strike + shift, expiry, volatility); }
@Override public double discountFactorTimeDerivative(double yearFraction) { double zr = curve.yValue(yearFraction); double periodIF = 1d + zr / frequency; double df = Math.pow(periodIF, -yearFraction * frequency); return -frequency * df * (Math.log(periodIF) + yearFraction / periodIF * curve.firstDerivative(yearFraction) / frequency); }
@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 rateIgnoringFixings(IborIndexObservation observation) { double relativeYearFraction = relativeYearFraction(observation.getMaturityDate()); return curve.yValue(relativeYearFraction); }
@Override public double priceDelta(double expiry, PutCall putCall, double strike, double forward, double volatility) { double shift = shiftCurve.yValue(expiry); return BlackFormulaRepository.delta(forward + shift, strike + shift, expiry, volatility, putCall.isCall()); }
private CurrencyParameterSensitivity parameterSensitivity(IborCapletFloorletSensitivity point) { double expiry = point.getExpiry(); double strike = point.getStrike(); double shift = shiftCurve.yValue(expiry); UnitParameterSensitivity unitSens = surface.zValueParameterSensitivity(expiry, strike + shift); return unitSens.multipliedBy(point.getCurrency(), point.getSensitivity()); }
public void test_of() { Curve test = ParallelShiftedCurve.of(CONSTANT_CURVE, ShiftType.RELATIVE, 0.1d); assertThat(test.yValue(0)).isEqualTo(3.3d, offset(1e-10)); assertThat(test.yValue(1)).isEqualTo(3.3d, offset(1e-10)); assertThat(test.getName()).isEqualTo(METADATA.getCurveName()); assertThat(test.getParameterCount()).isEqualTo(2); assertThat(test.getParameter(0)).isEqualTo(3d); assertThat(test.getParameter(1)).isEqualTo(0.1d); assertThat(test.getParameterMetadata(0)).isEqualTo(ParameterMetadata.empty()); assertThat(test.getParameterMetadata(1)).isEqualTo(LabelParameterMetadata.of("RelativeShift")); assertThat(test.getMetadata()).isEqualTo(METADATA); }