/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.payments.derivative; import org.apache.commons.lang.ObjectUtils; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Class describing a fixed coupon. */ public class CouponFixed extends Coupon { /** * The coupon fixed rate. */ private final double _fixedRate; /** * The paid amount. */ private final double _amount; /** * The start date of the coupon accrual period. Can be null if of no use. */ private final ZonedDateTime _accrualStartDate; /** * The end date of the coupon accrual period. Can be null if of no use. */ private final ZonedDateTime _accrualEndDate; /** * Constructor from all details but accrual dates. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param fundingCurveName Name of the funding curve. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param notional Coupon notional. * @param rate The coupon fixed rate. * @deprecated Use the constructor that does not take a curve name */ @Deprecated public CouponFixed(final Currency currency, final double paymentTime, final String fundingCurveName, final double paymentYearFraction, final double notional, final double rate) { super(currency, paymentTime, fundingCurveName, paymentYearFraction, notional); _fixedRate = rate; _accrualStartDate = null; _accrualEndDate = null; _amount = paymentYearFraction * notional * rate; } /** * Constructor from all details. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param fundingCurveName Name of the funding curve. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param notional Coupon notional. * @param rate The coupon fixed rate. * @param accrualStartDate The start date of the coupon accrual period. * @param accrualEndDate The end date of the coupon accrual period. * @deprecated Use the constructor that does not take a curve name */ @Deprecated public CouponFixed(final Currency currency, final double paymentTime, final String fundingCurveName, final double paymentYearFraction, final double notional, final double rate, final ZonedDateTime accrualStartDate, final ZonedDateTime accrualEndDate) { super(currency, paymentTime, fundingCurveName, paymentYearFraction, notional); _fixedRate = rate; _amount = paymentYearFraction * notional * rate; _accrualStartDate = accrualStartDate; _accrualEndDate = accrualEndDate; } /** * Constructor from details with notional defaulted to 1. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param fundingCurveName Name of the funding curve. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param rate The coupon fixed rate. * @deprecated Use the constructor that does not take a curve name */ @Deprecated public CouponFixed(final Currency currency, final double paymentTime, final String fundingCurveName, final double paymentYearFraction, final double rate) { this(currency, paymentTime, fundingCurveName, paymentYearFraction, 1.0, rate); } /** * Constructor from all details but accrual dates. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param notional Coupon notional. * @param rate The coupon fixed rate. */ public CouponFixed(final Currency currency, final double paymentTime, final double paymentYearFraction, final double notional, final double rate) { super(currency, paymentTime, paymentYearFraction, notional); _fixedRate = rate; _accrualStartDate = null; _accrualEndDate = null; _amount = paymentYearFraction * notional * rate; } /** * Constructor from all details. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param notional Coupon notional. * @param rate The coupon fixed rate. * @param accrualStartDate The start date of the coupon accrual period. * @param accrualEndDate The end date of the coupon accrual period. */ public CouponFixed(final Currency currency, final double paymentTime, final double paymentYearFraction, final double notional, final double rate, final ZonedDateTime accrualStartDate, final ZonedDateTime accrualEndDate) { super(currency, paymentTime, paymentYearFraction, notional); _fixedRate = rate; _amount = paymentYearFraction * notional * rate; _accrualStartDate = accrualStartDate; _accrualEndDate = accrualEndDate; } /** * Constructor from details with notional defaulted to 1. * @param currency The payment currency. * @param paymentTime Time (in years) up to the payment. * @param paymentYearFraction The year fraction (or accrual factor) for the coupon payment. * @param rate The coupon fixed rate. */ public CouponFixed(final Currency currency, final double paymentTime, final double paymentYearFraction, final double rate) { this(currency, paymentTime, paymentYearFraction, 1.0, rate); } /** * Gets the coupon fixed rate. * @return The fixed rate. */ public double getFixedRate() { return _fixedRate; } /** * Gets the start date of the coupon accrual period. * @return The accrual start date. */ public ZonedDateTime getAccrualStartDate() { return _accrualStartDate; } /** * Gets the end date of the coupon accrual period. * @return The accrual end date. */ public ZonedDateTime getAccrualEndDate() { return _accrualEndDate; } /** * Gets the paid amount. * @return The amount. */ public double getAmount() { return _amount; } /** * Creates a new coupon with the same characteristics, except the rate which is 1.0. * @return The new coupon. */ @SuppressWarnings("deprecation") public CouponFixed withUnitCoupon() { try { return new CouponFixed(getCurrency(), getPaymentTime(), getFundingCurveName(), getPaymentYearFraction(), getNotional(), 1); } catch (final IllegalStateException e) { return new CouponFixed(getCurrency(), getPaymentTime(), getPaymentYearFraction(), getNotional(), 1); } } /** * Create a new fixed coupon with all the details unchanged except that the rate is the one provided. * @param rate The new rate. * @return The coupon. */ @SuppressWarnings("deprecation") public CouponFixed withRate(final double rate) { try { return new CouponFixed(getCurrency(), getPaymentTime(), getFundingCurveName(), getPaymentYearFraction(), getNotional(), rate, getAccrualStartDate(), getAccrualEndDate()); } catch (final IllegalStateException e) { return new CouponFixed(getCurrency(), getPaymentTime(), getPaymentYearFraction(), getNotional(), rate, getAccrualStartDate(), getAccrualEndDate()); } } /** * Create a new fixed coupon with all the details unchanged except that the rate is shifted by the spread. * @param spread The rate spread. * @return The coupon. */ @SuppressWarnings("deprecation") public CouponFixed withRateShifted(final double spread) { try { return new CouponFixed(getCurrency(), getPaymentTime(), getFundingCurveName(), getPaymentYearFraction(), getNotional(), getFixedRate() + spread, getAccrualStartDate(), getAccrualEndDate()); } catch (final IllegalStateException e) { return new CouponFixed(getCurrency(), getPaymentTime(), getPaymentYearFraction(), getNotional(), getFixedRate() + spread, getAccrualStartDate(), getAccrualEndDate()); } } @SuppressWarnings("deprecation") @Override public CouponFixed withNotional(final double notional) { try { return new CouponFixed(getCurrency(), getPaymentTime(), getFundingCurveName(), getPaymentYearFraction(), notional, getFixedRate(), getAccrualStartDate(), getAccrualEndDate()); } catch (final IllegalStateException e) { return new CouponFixed(getCurrency(), getPaymentTime(), getPaymentYearFraction(), notional, getFixedRate(), getAccrualStartDate(), getAccrualEndDate()); } } /** * Returns a fixed payment with the same features (currency, payment time, amount) as the fixed coupon. * @return A fixed payment. */ @SuppressWarnings("deprecation") public PaymentFixed toPaymentFixed() { try { return new PaymentFixed(getCurrency(), getPaymentTime(), _amount, getFundingCurveName()); } catch (final IllegalStateException e) { return new PaymentFixed(getCurrency(), getPaymentTime(), _amount); } } @Override public <S, T> T accept(final InstrumentDerivativeVisitor<S, T> visitor, final S data) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitCouponFixed(this, data); } @Override public <T> T accept(final InstrumentDerivativeVisitor<?, T> visitor) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitCouponFixed(this); } @Override public String toString() { return super.toString() + ", [Rate=" + _fixedRate + ", notional=" + getNotional() + ", year fraction=" + getPaymentYearFraction() + "]"; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((_accrualEndDate == null) ? 0 : _accrualEndDate.hashCode()); result = prime * result + ((_accrualStartDate == null) ? 0 : _accrualStartDate.hashCode()); long temp; temp = Double.doubleToLongBits(_amount); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(_fixedRate); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } final CouponFixed other = (CouponFixed) obj; if (Double.doubleToLongBits(_amount) != Double.doubleToLongBits(other._amount)) { return false; } if (Double.doubleToLongBits(_fixedRate) != Double.doubleToLongBits(other._fixedRate)) { return false; } if (!ObjectUtils.equals(_accrualEndDate, other._accrualEndDate)) { return false; } if (!ObjectUtils.equals(_accrualStartDate, other._accrualStartDate)) { return false; } return true; } }