示例#1
0
        public double ZeroRate(BusinessDay day)
        {
            double t = (day.DateTime <= _startDate.DateTime ? 0 : 1) * day.YearsBetween(_startDate, DayCountConvention.Act365);

            return(ZeroRate(t));
        }
示例#2
0
        public double PresentValue(BusinessDay day, double spread)
        {
            double t = day.YearsBetween(_startDate, DayCountConvention.Act365);

            return(PresentValue(t, spread));
        }
示例#3
0
        private void _addCashFlow(CashFlowRate cashFlow)
        {
            // Console.WriteLine("Add Cashflow:" + cashFlow.Rate + " " + cashFlow.MaturityType + " " + cashFlow.Maturity + " " + cashFlow.FrequencyType + " " + cashFlow.Frequency + " " + cashFlow.DayCount);

            double rate = cashFlow.Rate;
            InterestRateTenorType frequencyType = cashFlow.FrequencyType;
            int frequency = cashFlow.Frequency;
            InterestRateTenorType maturityType = cashFlow.MaturityType;
            int maturity = cashFlow.Maturity;
            DayCountConvention dayCount = cashFlow.DayCount;

            BusinessDay expiryDate = null;

            switch (maturityType)
            {
            case InterestRateTenorType.Daily:
                expiryDate = _startDate.AddActualDays(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddActualDays(maturity, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Weekly:
                expiryDate = _startDate.AddActualDays(maturity * 7, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddActualDays(maturity * 7, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Monthly:
                expiryDate = _startDate.AddMonths(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddMonths(maturity, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Yearly:
                expiryDate = _startDate.AddYears(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddYears(maturity, BusinessDaySearchType.Next);
                break;

            default:
                break;
            }

            BusinessDay runningDate = _startDate;

            if (frequencyType == maturityType && frequency == maturity)
            {
                double t  = expiryDate.YearsBetween(_startDate, dayCount);
                double pv = 1 / (1 + rate * t);
                t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365);
                _zeroRates.TryAdd(t, -Math.Log(pv) / t);
            }
            else
            {
                int    counter = 1;
                double pvs     = 0;
                double PV      = 0;
                double t       = 0;

                bool        flag         = true;
                BusinessDay previousDate = _startDate;

                while (flag)
                {
                    previousDate = runningDate;
                    if (frequencyType == InterestRateTenorType.Daily)
                    {
                        runningDate = runningDate.AddBusinessDays(frequency * counter);
                    }
                    else if (frequencyType == InterestRateTenorType.Weekly)
                    {
                        runningDate = _startDate.AddActualDays(7 * frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddActualDays(7 * frequency * counter, BusinessDaySearchType.Next);
                    else if (frequencyType == InterestRateTenorType.Monthly)
                    {
                        runningDate = _startDate.AddMonths(frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddMonths(frequency * counter, BusinessDaySearchType.Next);
                    else if (frequencyType == InterestRateTenorType.Yearly)
                    {
                        runningDate = _startDate.AddYears(frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddYears(frequency * counter, BusinessDaySearchType.Next);

                    flag = (runningDate.DateTime < expiryDate.DateTime);

                    if (flag)
                    {
                        counter++;
                        t    = runningDate.YearsBetween(previousDate, dayCount);
                        pvs += rate * t * PresentValue(runningDate.YearsBetween(_startDate, DayCountConvention.Act365));
                        t    = expiryDate.YearsBetween(runningDate, dayCount);
                        PV   = (1 - pvs) / (1 + rate * t);
                    }
                }


                t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365);
                double zeroRate = -Math.Log(PV) / t;
                _zeroRates.TryAdd(t, zeroRate);
            }
        }