package com.opengamma.sesame.irfutureoption;
import org.threeten.bp.Period;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.provider.description.interestrate.BlackSTIRFuturesProviderInterface;
import com.opengamma.analytics.financial.provider.description.interestrate.BlackSTIRFuturesSmileProvider;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolatorFactory;
import com.opengamma.analytics.math.interpolation.GridInterpolator2D;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.analytics.math.surface.InterpolatedDoublesSurface;
import com.opengamma.analytics.math.surface.Surface;
import com.opengamma.financial.convention.businessday.ModifiedFollowingBusinessDayConvention;
import com.opengamma.financial.convention.daycount.DayCounts;
import com.opengamma.sesame.DiscountingMulticurveCombinerFn;
import com.opengamma.sesame.Environment;
import com.opengamma.sesame.MulticurveBundle;
import com.opengamma.sesame.trade.IRFutureOptionTrade;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.result.Result;
/**
* Internal test function to use the multicurve construction to build a MulticurveDiscountProvider and a static list
* of vols.
*/
public final class TestBlackSTIRFuturesProviderFn implements BlackSTIRFuturesProviderFn {
private final DiscountingMulticurveCombinerFn _discountingMulticurveCombinerFn;
public TestBlackSTIRFuturesProviderFn(DiscountingMulticurveCombinerFn discountingMulticurveCombinerFn) {
ArgumentChecker.notNull(discountingMulticurveCombinerFn, "discountingMulticurveCombinerFn");
_discountingMulticurveCombinerFn = discountingMulticurveCombinerFn;
}
@Override
public Result<BlackSTIRFuturesProviderInterface> getBlackSTIRFuturesProvider(Environment env, IRFutureOptionTrade trade) {
Result<MulticurveBundle> bundleResult = _discountingMulticurveCombinerFn.getMulticurveBundle(env, trade);
if (bundleResult.isSuccess()) {
MulticurveProviderDiscount multicurve = bundleResult.getValue().getMulticurveProvider();
IborIndex index = new IborIndex(Currency.USD, Period.ofMonths(3), 2, DayCounts.ACT_360, new ModifiedFollowingBusinessDayConvention(), true, "USD");
Surface<Double, Double, Double> blackParameters = testSurface;
BlackSTIRFuturesProviderInterface black = new BlackSTIRFuturesSmileProvider(multicurve, blackParameters, index);
return Result.success(black);
}
return Result.failure(bundleResult);
}
private static final Interpolator1D LINEAR_FLAT =
CombinedInterpolatorExtrapolatorFactory.getInterpolator(Interpolator1DFactory.LINEAR,
Interpolator1DFactory.FLAT_EXTRAPOLATOR,
Interpolator1DFactory.FLAT_EXTRAPOLATOR);
private static final GridInterpolator2D INTERPOLATOR_2D = new GridInterpolator2D(LINEAR_FLAT, LINEAR_FLAT);
private final InterpolatedDoublesSurface testSurface = InterpolatedDoublesSurface.from(
new double[] { 10, 20, 30 },
new double[] { 10, 20, 30 },
new double[] { 10, 20, 30 },
INTERPOLATOR_2D
);
}