/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.equity.future.pricing; import com.opengamma.analytics.financial.equity.future.derivative.EquityFuture; import com.opengamma.analytics.financial.equity.future.derivative.EquityIndexDividendFuture; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter; import com.opengamma.analytics.financial.simpleinstruments.pricing.SimpleFutureDataBundle; import com.opengamma.util.ArgumentChecker; /** * */ public abstract class DividendYieldFuturesCalculator extends InstrumentDerivativeVisitorAdapter<SimpleFutureDataBundle, Double> { /* package */DividendYieldFuturesCalculator() { } @Override public Double visitEquityFuture(final EquityFuture future, final SimpleFutureDataBundle dataBundle) { ArgumentChecker.notNull(future, "future"); ArgumentChecker.notNull(dataBundle, "data bundle"); return getResult(dataBundle, future.getStrike(), future.getUnitAmount(), future.getTimeToSettlement()); } @Override public Double visitEquityIndexDividendFuture(final EquityIndexDividendFuture future, final SimpleFutureDataBundle dataBundle) { ArgumentChecker.notNull(future, "future"); ArgumentChecker.notNull(dataBundle, "data bundle"); return getResult(dataBundle, future.getStrike(), future.getUnitAmount(), future.getTimeToSettlement()); } abstract double getResult(SimpleFutureDataBundle dataBundle, double strike, double unitAmount, double t); /** * Calculates the present value */ public static final class PresentValueCalculator extends DividendYieldFuturesCalculator { private static final PresentValueCalculator INSTANCE = new PresentValueCalculator(); public static PresentValueCalculator getInstance() { return INSTANCE; } private PresentValueCalculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return (dataBundle.getMarketPrice() - strike) * unitAmount; } } /** * Calculates the spot delta */ public static final class SpotDeltaCalculator extends DividendYieldFuturesCalculator { private static final SpotDeltaCalculator INSTANCE = new SpotDeltaCalculator(); public static SpotDeltaCalculator getInstance() { return INSTANCE; } private SpotDeltaCalculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return unitAmount; } } /** * Calculates the rates delta */ public static final class RatesDeltaCalculator extends DividendYieldFuturesCalculator { private static final RatesDeltaCalculator INSTANCE = new RatesDeltaCalculator(); public static RatesDeltaCalculator getInstance() { return INSTANCE; } private RatesDeltaCalculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return t * dataBundle.getMarketPrice() * unitAmount; } } /** * Calculates the pv01 */ public static final class PV01Calculator extends DividendYieldFuturesCalculator { private static final PV01Calculator INSTANCE = new PV01Calculator(); public static PV01Calculator getInstance() { return INSTANCE; } private PV01Calculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return RatesDeltaCalculator.getInstance().getResult(dataBundle, strike, unitAmount, t) / 10000; } } /** * Gets the spot price */ public static final class SpotPriceCalculator extends DividendYieldFuturesCalculator { private static final SpotPriceCalculator INSTANCE = new SpotPriceCalculator(); public static SpotPriceCalculator getInstance() { return INSTANCE; } private SpotPriceCalculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return dataBundle.getSpotValue(); } } /** * Gets the forward price */ public static final class ForwardPriceCalculator extends DividendYieldFuturesCalculator { private static final ForwardPriceCalculator INSTANCE = new ForwardPriceCalculator(); public static ForwardPriceCalculator getInstance() { return INSTANCE; } private ForwardPriceCalculator() { } @Override double getResult(final SimpleFutureDataBundle dataBundle, final double strike, final double unitAmount, final double t) { return dataBundle.getMarketPrice(); } } }