/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.bond.method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.Validate; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.analytics.financial.interestrate.InterestRateCurveSensitivity; import com.opengamma.analytics.financial.interestrate.YieldCurveBundle; import com.opengamma.analytics.financial.interestrate.bond.definition.BillSecurity; import com.opengamma.analytics.financial.interestrate.method.PricingMethod; import com.opengamma.financial.convention.yield.SimpleYieldConvention; import com.opengamma.financial.convention.yield.YieldConvention; import com.opengamma.util.money.CurrencyAmount; import com.opengamma.util.tuple.DoublesPair; /** * Class with methods related to bill security valued by discounting. * <P> Reference: Bill pricing, version 1.0. OpenGamma documentation, January 2012. * @deprecated Use {@link com.opengamma.analytics.financial.interestrate.bond.provider.BillSecurityDiscountingMethod} */ @Deprecated public final class BillSecurityDiscountingMethod implements PricingMethod { /** * The unique instance of the class. */ private static final BillSecurityDiscountingMethod INSTANCE = new BillSecurityDiscountingMethod(); /** * Return the class instance. * @return The instance. */ public static BillSecurityDiscountingMethod getInstance() { return INSTANCE; } /** * Constructor */ private BillSecurityDiscountingMethod() { } /** * Computes the present value of the bill security by discounting. * @param bill The bill. * @param curves The curves. * @return The present value. */ public CurrencyAmount presentValue(final BillSecurity bill, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double pvBill = bill.getNotional() * curves.getCurve(bill.getCreditCurveName()).getDiscountFactor(bill.getEndTime()); return CurrencyAmount.of(bill.getCurrency(), pvBill); } @Override public CurrencyAmount presentValue(final InstrumentDerivative instrument, final YieldCurveBundle curves) { Validate.isTrue(instrument instanceof BillSecurity, "Bill Security"); return presentValue((BillSecurity) instrument, curves); } /** * Compute the bill price from the yield. The price is the relative price at settlement. The yield is in the bill yield convention. * @param bill The bill. * @param yield The yield in the bill yield convention. * @return The price. */ public double priceFromYield(final BillSecurity bill, final double yield) { return priceFromYield(bill.getYieldConvention(), yield, bill.getAccrualFactor()); } /** * Compute the bill price from the yield. The price is the relative price at settlement. * @param convention The yield convention. * @param yield The yield in the bill yield convention. * @param accrualFactor The accrual factor between settlement and maturity. * @return The price. */ public double priceFromYield(final YieldConvention convention, final double yield, final double accrualFactor) { if (convention == SimpleYieldConvention.DISCOUNT) { return 1.0 - accrualFactor * yield; } if (convention == SimpleYieldConvention.INTERESTATMTY) { return 1.0 / (1 + accrualFactor * yield); } throw new UnsupportedOperationException("The convention " + convention.getName() + " is not supported."); } /** * Computes the bill yield from the price. The yield is in the bill yield convention. * @param bill The bill. * @param price The price. The price is the relative price at settlement. * @return The yield. */ public double yieldFromPrice(final BillSecurity bill, final double price) { if (bill.getYieldConvention() == SimpleYieldConvention.DISCOUNT) { return (1.0 - price) / bill.getAccrualFactor(); } if (bill.getYieldConvention() == SimpleYieldConvention.INTERESTATMTY) { return (1.0 / price - 1) / bill.getAccrualFactor(); } throw new UnsupportedOperationException("The convention " + bill.getYieldConvention().getName() + " is not supported."); } /** * Computes the derivative of the bill yield with respect to the price. The yield is in the bill yield convention. * @param bill The bill. * @param price The price. The price is the relative price at settlement. * @return The yield derivative. */ public double yieldFromPriceDerivative(final BillSecurity bill, final double price) { if (bill.getYieldConvention() == SimpleYieldConvention.DISCOUNT) { return -1.0 / bill.getAccrualFactor(); } if (bill.getYieldConvention() == SimpleYieldConvention.INTERESTATMTY) { return -1.0 / (price * price * bill.getAccrualFactor()); } throw new UnsupportedOperationException("The convention " + bill.getYieldConvention().getName() + " is not supported."); } /** * Computes the present value of the bill security by discounting from its yield. * @param bill The bill. * @param yield The bill yield. * @param curves The curves. * @return The present value. */ public CurrencyAmount presentValueFromYield(final BillSecurity bill, final double yield, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double price = priceFromYield(bill, yield); return presentValueFromPrice(bill, price, curves); } /** * Computes the present value of the bill security by discounting from its price. * @param bill The bill. * @param price The (dirty) price at settlement. * @param curves The curves (for discounting from settlement to today) . * @return The present value. */ public CurrencyAmount presentValueFromPrice(final BillSecurity bill, final double price, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double pvBill = bill.getNotional() * price * curves.getCurve(bill.getDiscountingCurveName()).getDiscountFactor(bill.getSettlementTime()); return CurrencyAmount.of(bill.getCurrency(), pvBill); } /** * Compute the bill price from the curves. The price is the relative price at settlement. * @param bill The bill. * @param curves The curves. * @return The price. */ public double priceFromCurves(final BillSecurity bill, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double pvBill = bill.getNotional() * curves.getCurve(bill.getCreditCurveName()).getDiscountFactor(bill.getEndTime()); final double price = pvBill / (bill.getNotional() * curves.getCurve(bill.getDiscountingCurveName()).getDiscountFactor(bill.getSettlementTime())); return price; } /** * Computes the bill yield from the curves. The yield is in the bill yield convention. * @param bill The bill. * @param curves The curves. * @return The yield. */ public double yieldFromCurves(final BillSecurity bill, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double pvBill = bill.getNotional() * curves.getCurve(bill.getCreditCurveName()).getDiscountFactor(bill.getEndTime()); final double price = pvBill / (bill.getNotional() * curves.getCurve(bill.getDiscountingCurveName()).getDiscountFactor(bill.getSettlementTime())); return yieldFromPrice(bill, price); } /** * Computes the bill present value curve sensitivity. * @param bill The bill. * @param curves The curves. * @return The sensitivity. */ public InterestRateCurveSensitivity presentValueCurveSensitivity(final BillSecurity bill, final YieldCurveBundle curves) { Validate.notNull(bill, "Bill"); Validate.notNull(curves, "Curves"); final double dfEnd = curves.getCurve(bill.getCreditCurveName()).getDiscountFactor(bill.getEndTime()); // Backward sweep final double pvBar = 1.0; final double dfEndBar = bill.getNotional() * pvBar; final Map<String, List<DoublesPair>> resultMapCredit = new HashMap<>(); final List<DoublesPair> listDiscounting = new ArrayList<>(); listDiscounting.add(DoublesPair.of(bill.getEndTime(), -bill.getEndTime() * dfEnd * dfEndBar)); resultMapCredit.put(bill.getCreditCurveName(), listDiscounting); return new InterestRateCurveSensitivity(resultMapCredit); } }