Example #1
0
        public List <CashFlow> expectedCashflows()
        {
            calcBondFactor();

            List <CashFlow> expectedcashflows = new List <CashFlow>();

            List <double> notionals = new InitializedList <double>(schedule_.Count);

            notionals[0] = notionals_[0];
            for (int i = 0; i < schedule_.Count - 1; ++i)
            {
                double currentNotional = notionals[i];
                double smm             = SMM(schedule_[i]);
                double prepay          = (notionals[i] * bondFactors_[i + 1]) / bondFactors_[i] * smm;
                double actualamort     = currentNotional * (1 - bondFactors_[i + 1] / bondFactors_[i]);
                notionals[i + 1] = currentNotional - actualamort - prepay;

                // ADD
                CashFlow c1 = new VoluntaryPrepay(prepay, schedule_[i + 1]);
                CashFlow c2 = new AmortizingPayment(actualamort, schedule_[i + 1]);
                CashFlow c3 = new FixedRateCoupon(schedule_[i + 1], currentNotional, new InterestRate(PassThroughRate_, dCounter_, Compounding.Simple, Frequency.Annual), schedule_[i], schedule_[i + 1]);
                expectedcashflows.Add(c1);
                expectedcashflows.Add(c2);
                expectedcashflows.Add(c3);
            }
            notionals[notionals.Count - 1] = 0.0;

            return(expectedcashflows);
        }
Example #2
0
        void addEffectiveInterestRateAmortizing()
        {
            // Amortizing Schedule
            Schedule schedule = new Schedule(_tradeDate, _maturityDate, new Period(_payFrequency),
                                             _calendar, BusinessDayConvention.Unadjusted, BusinessDayConvention.Unadjusted,
                                             DateGeneration.Rule.Backward, false);
            double currentNominal = _marketValue;
            Date   prevDate       = _tradeDate;
            Date   actualDate     = _tradeDate;

            for (int i = 1; i < schedule.Count; ++i)
            {
                actualDate = schedule[i];
                InterestRate    rate = new InterestRate(_yield, _dCounter, Compounding.Simple, Frequency.Annual);
                InterestRate    rate2 = new InterestRate(_couponRate, _dCounter, Compounding.Simple, Frequency.Annual);
                FixedRateCoupon r, r2;
                if (i > 1)
                {
                    r  = new FixedRateCoupon(actualDate, currentNominal, rate, prevDate, actualDate, prevDate, actualDate);
                    r2 = new FixedRateCoupon(actualDate, currentNominal, rate2, prevDate, actualDate, prevDate, actualDate, null, _originalPayment);
                }

                else
                {
                    Calendar nullCalendar = new NullCalendar();
                    Period   p1           = new Period(_payFrequency);
                    Date     testDate     = nullCalendar.advance(actualDate, -1 * p1);

                    r  = new FixedRateCoupon(actualDate, currentNominal, rate, testDate, actualDate, prevDate, actualDate);
                    r2 = new FixedRateCoupon(actualDate, currentNominal, rate2, testDate, actualDate, prevDate, actualDate, null, _originalPayment);
                }

                double amort = Math.Round(Math.Abs(_originalPayment - r.amount()), 2);

                AmortizingPayment p = new AmortizingPayment(amort, actualDate);
                if (_isPremium)
                {
                    currentNominal -= Math.Abs(amort);
                }
                else
                {
                    currentNominal += Math.Abs(amort);
                }


                cashflows_.Add(r2);
                cashflows_.Add(p);
                prevDate = actualDate;
            }

            // Add single redemption for yield calculation
            setSingleRedemption(_faceValue, 100, _maturityDate);
        }
Example #3
0
        /*! This method can be called by derived classes in order to
         *  build redemption payments from the existing cash flows.
         *  It must be called after setting up the cashflows_ vector
         *  and will fill the notionalSchedule_, notionals_, and
         *  redemptions_ data members.
         *
         *  If given, the elements of the redemptions vector will
         *  multiply the amount of the redemption cash flow.  The
         *  elements will be taken in base 100, i.e., a redemption
         *  equal to 100 does not modify the amount.
         *
         *  \pre The cashflows_ vector must contain at least one
         *       coupon and must be sorted by date.
         */
        protected void addRedemptionsToCashflows(List <double> redemptions = null)
        {
            if (redemptions == null)
            {
                redemptions = new List <double>();
            }

            // First, we gather the notional information from the cashflows
            calculateNotionalsFromCashflows();
            // Then, we create the redemptions based on the notional
            // information and we add them to the cashflows vector after
            // the coupons.
            redemptions_.Clear();
            for (int i = 1; i < notionalSchedule_.Count; ++i)
            {
                double R = i < redemptions.Count ? redemptions[i] :
                           !redemptions.empty() ? redemptions.Last() :
                           100.0;
                double   amount = (R / 100.0) * (notionals_[i - 1] - notionals_[i]);
                CashFlow payment;
                if (i < notionalSchedule_.Count - 1)
                {
                    payment = new AmortizingPayment(amount, notionalSchedule_[i]);
                }
                else
                {
                    payment = new Redemption(amount, notionalSchedule_[i]);
                }

                cashflows_.Add(payment);
                redemptions_.Add(payment);
            }
            // stable_sort now moves the AmortizingPayment and Redemptions to the right places
            // while ensuring that they follow coupons with the same date.
            cashflows_ = cashflows_.OrderBy(x => x.date()).ToList();
        }