Example #1
0
        /// <summary>
        /// Calculates the present value of the fixed coupon bond trade with z-spread.
        /// <para>
        /// The present value of the trade is the value on the valuation date.
        /// The result is expressed using the payment currency of the bond.
        /// </para>
        /// <para>
        /// The z-spread is a parallel shift applied to continuously compounded rates or periodic
        /// compounded rates of the discounting curve.
        /// </para>
        /// <para>
        /// Coupon payments of the underlying product are considered based on the settlement date of the trade.
        ///
        /// </para>
        /// </summary>
        /// <param name="trade">  the trade </param>
        /// <param name="provider">  the discounting provider </param>
        /// <param name="zSpread">  the z-spread </param>
        /// <param name="compoundedRateType">  the compounded rate type </param>
        /// <param name="periodsPerYear">  the number of periods per year </param>
        /// <returns> the present value of the fixed coupon bond trade </returns>
        public virtual CurrencyAmount presentValueWithZSpread(ResolvedFixedCouponBondTrade trade, LegalEntityDiscountingProvider provider, double zSpread, CompoundedRateType compoundedRateType, int periodsPerYear)
        {
            LocalDate      settlementDate = this.settlementDate(trade, provider.ValuationDate);
            CurrencyAmount pvProduct      = productPricer.presentValueWithZSpread(trade.Product, provider, zSpread, compoundedRateType, periodsPerYear, settlementDate);

            return(presentValueFromProductPresentValue(trade, provider, pvProduct));
        }
        public virtual void test_presentValueWithZSpread_continuous()
        {
            CurrencyAmount computed = PRICER.presentValueWithZSpread(PRODUCT, PROVIDER, Z_SPREAD, CONTINUOUS, 0);
            CurrencyAmount expected = PRICER_NOMINAL.presentValueWithSpread(PRODUCT.NominalPayment, DSC_FACTORS_ISSUER, Z_SPREAD, CONTINUOUS, 0);
            int            size     = PRODUCT.PeriodicPayments.size();
            double         pvcCupon = 0d;

            for (int i = 2; i < size; ++i)
            {
                FixedCouponBondPaymentPeriod payment = PRODUCT.PeriodicPayments.get(i);
                pvcCupon += PRICER_COUPON.presentValueWithSpread(payment, IssuerCurveDiscountFactors.of(DSC_FACTORS_ISSUER, GROUP_ISSUER), Z_SPREAD, CONTINUOUS, 0);
            }
            expected = expected.plus(pvcCupon);
            assertEquals(computed.Currency, EUR);
            assertEquals(computed.Amount, expected.Amount, NOTIONAL * TOL);
        }