/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.future.provider; import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionMarginTransaction; import com.opengamma.analytics.financial.provider.description.interestrate.ParameterProviderInterface; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.MultipleCurrencyAmount; /** * Method for the pricing of interest rate future options with daily margining. * @param <DATA_TYPE> Data type. Extends ParameterProviderInterface. */ public abstract class InterestRateFutureOptionMarginTransactionGenericMethod<DATA_TYPE extends ParameterProviderInterface> { /** * The method to compute the underlying security price and price curve sensitivity. */ private final InterestRateFutureOptionMarginSecurityGenericMethod<DATA_TYPE> _methodSecurity; /** * Constructor. * @param methodSecurity The method to compute the underlying security price and price curve sensitivity. */ public InterestRateFutureOptionMarginTransactionGenericMethod(InterestRateFutureOptionMarginSecurityGenericMethod<DATA_TYPE> methodSecurity) { _methodSecurity = methodSecurity; } /** * Returns the method to compute the underlying security price and price curve sensitivity. * @return The method. */ public InterestRateFutureOptionMarginSecurityGenericMethod<DATA_TYPE> getSecurityMethod() { return _methodSecurity; } /** * Compute the present value of a future transaction from a quoted price. * @param option The future option. * @param price The quoted price. * @return The present value. */ public MultipleCurrencyAmount presentValueFromPrice(final InterestRateFutureOptionMarginTransaction option, final double price) { ArgumentChecker.notNull(option, "Option on STIR futures"); double pv = (price - option.getReferencePrice()) * option.getUnderlyingSecurity().getUnderlyingFuture().getPaymentAccrualFactor() * option.getUnderlyingSecurity().getUnderlyingFuture().getNotional() * option.getQuantity(); return MultipleCurrencyAmount.of(option.getUnderlyingSecurity().getCurrency(), pv); } /** * Computes the present value of a transaction. * @param transaction The future option transaction. * @param data The data provider. * @return The present value. */ public MultipleCurrencyAmount presentValue(final InterestRateFutureOptionMarginTransaction transaction, final DATA_TYPE data) { ArgumentChecker.notNull(transaction, "Transaction on option on STIR futures"); ArgumentChecker.notNull(data, "data provider"); double priceSecurity = _methodSecurity.price(transaction.getUnderlyingSecurity(), data); MultipleCurrencyAmount pvTransaction = presentValueFromPrice(transaction, priceSecurity); return pvTransaction; } /** * Computes the present value curve sensitivity of a transaction. * @param transaction The future option transaction. * @param data The data provider. * @return The present value curve sensitivity. */ public MultipleCurrencyMulticurveSensitivity presentValueCurveSensitivity(final InterestRateFutureOptionMarginTransaction transaction, final DATA_TYPE data) { ArgumentChecker.notNull(transaction, "Transaction on option on STIR futures"); ArgumentChecker.notNull(data, "data provider"); MulticurveSensitivity securitySensitivity = _methodSecurity.priceCurveSensitivity(transaction.getUnderlyingSecurity(), data); return MultipleCurrencyMulticurveSensitivity.of( transaction.getCurrency(), securitySensitivity.multipliedBy(transaction.getQuantity() * transaction.getUnderlyingSecurity().getUnderlyingFuture().getNotional() * transaction.getUnderlyingSecurity().getUnderlyingFuture().getPaymentAccrualFactor())); } }