Example #1
0
        private SortedDictionary <double, double> GetCashflows(DateTime evaluationDate)
        {
            SortedDictionary <double, double> cashflows = new SortedDictionary <double, double>();
            double yearFrac;

            if (IsForward)
            {
                DateTime prevCashflowDate = IssueDate;
                DateTime cashflowDate     = IssueDate.AddMonths(CouponGapMonth());
                while (cashflowDate < MaturityDate)
                {
                    yearFrac = (cashflowDate - evaluationDate).TotalDays / 365;
                    if (yearFrac > 0)
                    {
                        cashflows.Add(yearFrac, CouponRate * (cashflowDate - prevCashflowDate).TotalDays / 365);
                    }
                    prevCashflowDate = cashflowDate;
                    cashflowDate     = cashflowDate.AddMonths(CouponGapMonth());
                }

                yearFrac = (MaturityDate - evaluationDate).TotalDays / 365;
                if (yearFrac > 0)
                {
                    cashflows.Add((MaturityDate - evaluationDate).TotalDays / 365, CouponRate * (MaturityDate - prevCashflowDate).TotalDays / 365);
                }
            }
            else
            {
                DateTime prevCashflowDate = MaturityDate.AddMonths(-CouponGapMonth());
                DateTime cashflowDate     = MaturityDate;
                while (prevCashflowDate > IssueDate)
                {
                    yearFrac = (cashflowDate - evaluationDate).TotalDays / 365;
                    if (yearFrac > 0)
                    {
                        cashflows.Add(yearFrac, CouponRate * (cashflowDate - prevCashflowDate).TotalDays / 365);
                    }
                    cashflowDate     = prevCashflowDate;
                    prevCashflowDate = prevCashflowDate.AddMonths(-CouponGapMonth());
                }

                yearFrac = (IssueDate - evaluationDate).TotalDays / 365;
                if (yearFrac > 0)
                {
                    cashflows.Add((IssueDate - evaluationDate).TotalDays / 365, CouponRate * (IssueDate - cashflowDate).TotalDays / 365);
                }
            }

            // Add principal
            if (cashflows.Count != 0)
            {
                double lastYearFrac = cashflows.Keys.Max();
                cashflows[lastYearFrac] += 1;
            }

            return(cashflows);
        }