com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed.java

Source

/**
 * 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;
    }

}