@Override protected Object propertyGet(Bean bean, String propertyName, boolean quiet) { switch (propertyName.hashCode()) { case 2039569265: // convention return ((NormalSwaptionExpiryStrikeVolatilities) bean).getConvention(); case -949589828: // valuationDateTime return ((NormalSwaptionExpiryStrikeVolatilities) bean).getValuationDateTime(); case -1853231955: // surface return ((NormalSwaptionExpiryStrikeVolatilities) bean).getSurface(); } return super.propertyGet(bean, propertyName, quiet); }
@Override public NormalSwaptionExpiryStrikeVolatilities build() { return new NormalSwaptionExpiryStrikeVolatilities( convention, valuationDateTime, surface); }
int nData = TIME.size(); for (int i = 0; i < NB_TEST; i++) { double expiryTime = VOLS.relativeTime(TEST_OPTION_EXPIRY[i]); SwaptionSensitivity point = SwaptionSensitivity.of( VOLS.getName(), expiryTime, TEST_TENOR, TEST_STRIKE[i], TEST_FORWARD, GBP, TEST_SENSITIVITY[i]); CurrencyParameterSensitivities sensActual = VOLS.parameterSensitivity(point); CurrencyParameterSensitivity sensi = sensActual.getSensitivity(SURFACE.getName(), GBP); DoubleArray computed = sensi.getSensitivity(); InterpolatedNodalSurface.of(METADATA, TIME, STRIKE, volDataDw, INTERPOLATOR_2D); NormalSwaptionExpiryStrikeVolatilities provUp = NormalSwaptionExpiryStrikeVolatilities.of(CONVENTION, VAL_DATE_TIME, paramUp); NormalSwaptionExpiryStrikeVolatilities provDw = NormalSwaptionExpiryStrikeVolatilities.of(CONVENTION, VAL_DATE_TIME, paramDw); double volUp = provUp.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR, TEST_STRIKE[i], TEST_FORWARD); double volDw = provDw.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR, TEST_STRIKE[i], TEST_FORWARD); double fd = 0.5 * (volUp - volDw) / eps; map.put(DoublesPair.of(TIME.get(j), STRIKE.get(j)), fd);
@Override public CurrencyParameterSensitivities parameterSensitivity(PointSensitivities pointSensitivities) { CurrencyParameterSensitivities sens = CurrencyParameterSensitivities.empty(); for (PointSensitivity point : pointSensitivities.getSensitivities()) { if (point instanceof SwaptionSensitivity) { SwaptionSensitivity pt = (SwaptionSensitivity) point; if (pt.getVolatilitiesName().equals(getName())) { sens = sens.combinedWith(parameterSensitivity(pt)); } } } return sens; }
public void test_valuationDate() { assertEquals(VOLS.getValuationDateTime(), VAL_DATE_TIME); }
public void test_swapConvention() { assertEquals(VOLS.getConvention(), CONVENTION); }
public void test_volatility() { for (int i = 0; i < NB_TEST; i++) { double expiryTime = VOLS.relativeTime(TEST_OPTION_EXPIRY[i]); double volExpected = SURFACE.zValue(expiryTime, TEST_STRIKE[i]); double volComputed = VOLS.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR, TEST_STRIKE[i], TEST_FORWARD); assertEquals(volComputed, volExpected, TOLERANCE_VOL); } }
public void test_relativeTime() { double test1 = VOLS.relativeTime(VAL_DATE_TIME); assertEquals(test1, 0d); double test2 = VOLS.relativeTime(date(2018, 2, 17).atStartOfDay(LONDON_ZONE)); double test3 = VOLS.relativeTime(date(2012, 2, 17).atStartOfDay(LONDON_ZONE)); assertEquals(test2, -test3); // consistency checked }
public void coverage() { NormalSwaptionExpiryStrikeVolatilities test1 = NormalSwaptionExpiryStrikeVolatilities.of(CONVENTION, VAL_DATE_TIME, SURFACE); coverImmutableBean(test1); NormalSwaptionExpiryStrikeVolatilities test2 = NormalSwaptionExpiryStrikeVolatilities.of(CONVENTION, VAL_DATE.atStartOfDay(ZoneOffset.UTC), SURFACE); coverBeanEquals(test1, test2); }
private Object readResolve() { return new NormalSwaptionExpiryStrikeVolatilities(convention, valuationDateTime, surface); }
/** * Obtains an instance from the implied volatility surface and the date-time for which it is valid. * <p> * The surface is specified by an instance of {@link Surface}, such as {@link InterpolatedNodalSurface}. * The surface must contain the correct metadata: * <ul> * <li>The x-value type must be {@link ValueType#YEAR_FRACTION} * <li>The y-value type must be {@link ValueType#STRIKE} * <li>The z-value type must be {@link ValueType#NORMAL_VOLATILITY} * <li>The day count must be set in the additional information using {@link SurfaceInfoType#DAY_COUNT} * </ul> * Suitable surface metadata can be created using * {@link Surfaces#normalVolatilityByExpiryStrike(String, DayCount)}. * * @param convention the swap convention that the volatilities are to be used for * @param valuationDateTime the valuation date-time * @param surface the implied volatility surface * @return the volatilities */ public static NormalSwaptionExpiryStrikeVolatilities of( FixedIborSwapConvention convention, ZonedDateTime valuationDateTime, Surface surface) { return new NormalSwaptionExpiryStrikeVolatilities(convention, valuationDateTime, surface); }
@Override public NormalSwaptionExpiryStrikeVolatilities withParameter(int parameterIndex, double newValue) { return new NormalSwaptionExpiryStrikeVolatilities( convention, valuationDateTime, surface.withParameter(parameterIndex, newValue)); }
@Override public NormalSwaptionExpiryStrikeVolatilities withPerturbation(ParameterPerturbation perturbation) { return new NormalSwaptionExpiryStrikeVolatilities( convention, valuationDateTime, surface.withPerturbation(perturbation)); }