/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.capletstripping; import com.opengamma.analytics.financial.interestrate.payments.derivative.CapFloorIbor; import com.opengamma.analytics.financial.model.volatility.SimpleOptionData; import com.opengamma.analytics.financial.provider.calculator.discounting.ParRateDiscountingCalculator; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderInterface; import com.opengamma.util.ArgumentChecker; /** * Decomposes a {@link CapFloor} into an array of {@link SimpleOptionData} */ public final class CapFloorDecomposer { private static final ParRateDiscountingCalculator PRC = ParRateDiscountingCalculator.getInstance(); /** * Private constructor */ private CapFloorDecomposer() { } /** * Express a cap or floor as a strip of European call or put options * @param cap The cap or floor * @param curves yield curves (i.e. discount and Ibor-projection curves) * @return strip of European call or put options */ public static SimpleOptionData[] toOptions(final CapFloor cap, final MulticurveProviderInterface curves) { ArgumentChecker.notNull(cap, "null curve"); return toOptions(cap.getPayments(), curves); } public static SimpleOptionData[] toOptions(final CapFloorIbor[] caplets, final MulticurveProviderInterface curves) { ArgumentChecker.noNulls(caplets, "null caplets"); ArgumentChecker.notNull(curves, "null yield curves"); final int n = caplets.length; final SimpleOptionData[] options = new SimpleOptionData[n]; for (int i = 0; i < n; i++) { options[i] = toOption(caplets[i], curves); } return options; } /** * Turn a caplet/floorlet (as a {@link CapFloorIbor}) into a {@link SimpleOptionData} * @param caplet The caplet/floorlet * @param curves The yield curves * @return a {@link SimpleOptionData} */ public static SimpleOptionData toOption(final CapFloorIbor caplet, final MulticurveProviderInterface curves) { ArgumentChecker.notNull(caplet, "caplet"); ArgumentChecker.notNull(curves, "null yield curves"); double fwd = caplet.accept(PRC, curves); double t = caplet.getFixingTime(); // Vol is at fixing time, discounting from payment. This included the year fraction double df = curves.getDiscountFactor(caplet.getCurrency(), caplet.getPaymentTime()) * caplet.getPaymentYearFraction(); SimpleOptionData options = new SimpleOptionData(fwd, caplet.getStrike(), t, df, caplet.isCap()); return options; } }