/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.singlevalue;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesOptionMarginSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesYieldAverageSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.FederalFundsFutureSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionMarginSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.SwapFuturesPriceDeliverableSecurity;
/**
* Computes the par rate for different instrument. The meaning of "par rate" is instrument dependent.
*/
public final class FuturesMarginIndexFromPriceCalculator extends InstrumentDerivativeVisitorAdapter<Double, Double> {
/**
* The unique instance of the calculator.
*/
private static final FuturesMarginIndexFromPriceCalculator INSTANCE = new FuturesMarginIndexFromPriceCalculator();
/**
* Gets the calculator instance.
* @return The calculator.
*/
public static FuturesMarginIndexFromPriceCalculator getInstance() {
return INSTANCE;
}
/**
* Constructor.
*/
private FuturesMarginIndexFromPriceCalculator() {
}
// ----- Futures -----
@Override
public Double visitInterestRateFutureSecurity(final InterestRateFutureSecurity futures, final Double quotedPrice) {
return quotedPrice * futures.getNotional() * futures.getPaymentAccrualFactor();
}
@Override
public Double visitBondFuturesSecurity(final BondFuturesSecurity futures, final Double quotedPrice) {
return quotedPrice * futures.getNotional();
}
@Override
public Double visitFederalFundsFutureSecurity(final FederalFundsFutureSecurity futures, final Double quotedPrice) {
return quotedPrice * futures.getNotional() * futures.getPaymentAccrualFactor();
}
@Override
public Double visitSwapFuturesPriceDeliverableSecurity(final SwapFuturesPriceDeliverableSecurity futures, final Double quotedPrice) {
return quotedPrice * futures.getNotional();
}
@Override
public Double visitBondFuturesYieldAverageSecurity(final BondFuturesYieldAverageSecurity futures, final Double quotedPrice) {
final double yield = 1.0d - quotedPrice;
final double dirtyPrice = dirtyPriceFromYield(yield, futures.getCouponRate(), futures.getTenor(), futures.getNumberCouponPerYear());
return dirtyPrice * futures.getNotional();
}
/**
* The dirty price from the standard yield.
* @param yield The yield
* @param coupon The coupon
* @param tenor The tenor (in year)
* @param couponPerYear Number of coupon per year.
* @return The price.
*/
private double dirtyPriceFromYield(final double yield, final double coupon, final int tenor, final int couponPerYear) {
final double v = 1.0d + yield / couponPerYear;
final int n = tenor * couponPerYear;
final double vn = Math.pow(v, -n);
return coupon / yield * (1 - vn) + vn;
}
//----- Futures options -----
@Override
public Double visitInterestRateFutureOptionMarginSecurity(final InterestRateFutureOptionMarginSecurity option, Double quotedPrice) {
return quotedPrice * option.getUnderlyingFuture().getNotional() * option.getUnderlyingFuture().getPaymentAccrualFactor();
}
@Override
public Double visitBondFuturesOptionMarginSecurity(final BondFuturesOptionMarginSecurity option, Double quotedPrice) {
return quotedPrice * option.getUnderlyingFuture().getNotional();
}
}