/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.bondfuture; import org.threeten.bp.ZonedDateTime; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.instrument.future.BondFuturesTransactionDefinition; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorDelegate; import com.opengamma.analytics.financial.interestrate.future.calculator.FuturesPriceIssuerCalculator; import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesSecurity; import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesTransaction; import com.opengamma.analytics.financial.provider.calculator.discounting.PV01CurveParametersCalculator; import com.opengamma.analytics.financial.provider.calculator.issuer.CleanPriceFromCurvesCalculator; import com.opengamma.analytics.financial.provider.calculator.issuer.PresentValueCurveSensitivityIssuerCalculator; import com.opengamma.analytics.financial.provider.calculator.issuer.PresentValueIssuerCalculator; import com.opengamma.analytics.financial.provider.description.interestrate.ParameterIssuerProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.parameter.ParameterSensitivityParameterCalculator; import com.opengamma.analytics.util.amount.ReferenceAmount; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries; import com.opengamma.core.value.MarketDataRequirementNames; import com.opengamma.financial.analytics.conversion.BondAndBondFutureTradeConverter; import com.opengamma.financial.analytics.timeseries.HistoricalTimeSeriesBundle; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.sesame.trade.BondFutureTrade; import com.opengamma.util.money.Currency; import com.opengamma.util.money.MultipleCurrencyAmount; import com.opengamma.util.result.Result; import com.opengamma.util.tuple.Pair; /** * Discounting calculator for bond futures. */ public class BondFutureDiscountingCalculator implements BondFutureCalculator { /* calculators */ private static final PresentValueIssuerCalculator PVIC = PresentValueIssuerCalculator.getInstance(); private static final PresentValueCurveSensitivityIssuerCalculator PVCSIC = PresentValueCurveSensitivityIssuerCalculator.getInstance(); private static final FuturesPriceIssuerCalculator FPIC = FuturesPriceIssuerCalculator.getInstance(); private static final ParameterSensitivityParameterCalculator<ParameterIssuerProviderInterface> PSSFC = new ParameterSensitivityParameterCalculator<>(PVCSIC); private static final PV01CurveParametersCalculator<ParameterIssuerProviderInterface> PV01PC = new PV01CurveParametersCalculator<>(PVCSIC); public static final double BP = 0.0001; private final InstrumentDerivative _derivative; private final ParameterIssuerProviderInterface _curves; public BondFutureDiscountingCalculator(BondFutureTrade bondFutureTrade, ParameterIssuerProviderInterface curves, BondAndBondFutureTradeConverter bondFutureTradeConverter, ZonedDateTime valuationTime) { _curves = curves; _derivative = createInstrumentDerivative(bondFutureTrade, bondFutureTradeConverter, valuationTime); } @Override public Result<MultipleCurrencyAmount> calculatePV() { MultipleCurrencyAmount pv = _derivative.accept(PVIC, _curves); return Result.success(pv); } @Override public Result<ReferenceAmount<Pair<String, Currency>>> calculatePV01() { ReferenceAmount<Pair<String, Currency>> pv01 = _derivative.accept(PV01PC, _curves); return Result.success(pv01); } @Override public Result<MultipleCurrencyParameterSensitivity> calculateBucketedPV01() { MultipleCurrencyParameterSensitivity sensitivity = PSSFC.calculateSensitivity(_derivative, _curves); return Result.success(sensitivity.multipliedBy(BP)); } @Override public Result<Double> calculateSecurityModelPrice() { BondFuturesSecurity security = ((BondFuturesTransaction) _derivative).getUnderlyingSecurity(); Double price = security.accept(FPIC, _curves); return Result.success(price); } private InstrumentDerivative createInstrumentDerivative(BondFutureTrade bondFutureTrade, BondAndBondFutureTradeConverter converter, ZonedDateTime valuationTime) { double lastPrice = 0; InstrumentDefinition<?> definition = converter.convert(bondFutureTrade.getTrade()); return ((BondFuturesTransactionDefinition) definition).toDerivative(valuationTime, lastPrice); } }