Beispiel #1
0
        /// <summary>
        /// Returns a list of non-interpolated values found in a immediate vicinity of requested point.
        /// <remarks>
        /// If a GetValue method returns a exact match - this method should be returning null.
        /// </remarks>
        /// </summary>
        /// <param name="termCurve"></param>
        /// <param name="baseDate"></param>
        /// <param name="dayCounter"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        public static Decimal InterpolateRate2(TermCurve termCurve, DateTime baseDate, IDayCounter dayCounter, DateTime date)
        {
            var dates  = termCurve.GetListTermDates();
            var values = termCurve.GetListMidValues();
            var index  = Array.BinarySearch(dates.ToArray(), date);

            if (index >= 0)
            {
                var result = termCurve.point[index].mid;
                return(result);
            }
            var nextIndex = ~index;
            var prevIndex = nextIndex - 1;
            var baseIndex = prevIndex - 1;

            if (prevIndex == 0)
            {
                return(values[prevIndex]);//TODO check this.
            }
            var time1 = dayCounter.YearFraction(baseDate, dates[baseIndex]);
            var time2 = dayCounter.YearFraction(baseDate, dates[nextIndex]);
            var timei = dayCounter.YearFraction(baseDate, date);
            var i1    = (time2 - timei) / (time2 - time1);
            var i2    = (timei - time1) / (time2 - time1);
            var r1    = (double)values[baseIndex];
            var r2    = (double)values[nextIndex];
            var rate  = (i1 * r1 * time1 + i2 * r2 * time2) / timei;

            //TODO check for DateTime1D point and return the date.
            return((decimal)rate);
        }
Beispiel #2
0
        /// <summary>
        /// Returns a list of non-interpolated values found in a immediate vicinity of requested point.
        /// <remarks>
        /// If a GetValue method returns a exact match - this method should be returning null.
        /// </remarks>
        /// </summary>
        /// <param name="termCurve"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        public static TermPoint GetPreviousPoint(TermCurve termCurve, DateTime date)
        {
            var dates  = termCurve.GetListTermDates();//GetDiscreteSpace().GetCoordinateArray(1);
            var values = termCurve.GetListMidValues();
            var index  = Array.BinarySearch(dates.ToArray(), date);

            if (index >= 0)
            {
                return(termCurve.point[index]);
            }
            var nextIndex = ~index;
            var prevIndex = nextIndex - 1;
            //TODO check for DateTime1D point and return the date.
            var prevPoint = TermPointFactory.Create(values[prevIndex], dates[prevIndex]);

            return(prevPoint);
        }
        ///// <summary>
        ///// Returns a list of non-interpolated values found in a immediate vicinity of requested point.
        ///// <remarks>
        ///// If a GetValue method returns a exact match - this method should be returning null.
        ///// </remarks>
        ///// </summary>
        ///// <param name="termCurve"></param>
        ///// <param name="baseDate"></param>
        ///// <param name="dayCounter"></param>
        ///// <param name="date"></param>
        ///// <returns></returns>
        //public static decimal InterpolateRate2(TermCurve termCurve, DateTime baseDate, IDayCounter dayCounter, DateTime date)
        //{
        //    var dates = termCurve.GetListTermDates();
        //    var values = termCurve.GetListMidValues();
        //    var index = Array.BinarySearch(dates.ToArray(), date);
        //    if (index >= 0)
        //    {
        //        var result = termCurve.point[index].mid;
        //        return result;
        //    }
        //    var nextIndex = ~index;
        //    var prevIndex = nextIndex - 1;
        //    var baseIndex = prevIndex - 1;
        //    if (prevIndex == 0)
        //    {
        //        return values[prevIndex];//TODO check this.
        //    }
        //    var time1 = dayCounter.YearFraction(baseDate, dates[baseIndex]);
        //    var time2 = dayCounter.YearFraction(baseDate, dates[nextIndex]);
        //    var timei = dayCounter.YearFraction(baseDate, date);
        //    var i1 = (time2 - timei) / (time2 - time1);
        //    var i2 = (timei - time1) / (time2 - time1);
        //    var r1 = (double)values[baseIndex];
        //    var r2 = (double)values[nextIndex];
        //    var rate = (i1 * r1 * time1 + i2 * r2 * time2) / timei;
        //    return (decimal)rate;
        //}

        private static List <Tuple <DateTime, decimal> > ProcessTermCurve(TermCurve termCurve)
        {
            var result    = new List <Tuple <DateTime, decimal> >();
            var termDates = termCurve.GetListTermDates();
            var values    = termCurve.GetListMidValues();
            int counter   = 0;

            if (termDates.Count == values.Count)
            {
                foreach (var date in termDates)
                {
                    var tuple = new Tuple <DateTime, decimal>(date, values[counter]);
                    result.Add(tuple);
                    counter++;
                }
            }
            return(result);
        }
Beispiel #4
0
        ///<summary>
        ///</summary>
        ///<param name="discountCurve"></param>
        ///<param name="baseDate"></param>
        ///<param name="forwardRateTenor"></param>
        ///<param name="priceableXibor"></param>
        ///<returns></returns>
        public TermCurve ToPriceableXiborForwardCurve(TermCurve discountCurve, DateTime baseDate,
                                                      Period forwardRateTenor, PriceableXibor priceableXibor) //TODO
        {
            //CompoundingFrequency frequency = CompoundingFrequencyHelper.Create("Annual");
            var dates         = discountCurve.GetListTermDates();
            var yearFractions = new List <double>();

            foreach (var date in dates)
            {
                var yearFraction = (date - baseDate).TotalDays / 365.0;//TODO extend this with a general daycountraction.
                yearFractions.Add(yearFraction);
            }
            var midValues        = discountCurve.GetListMidValues();
            var discountFactors  = new List <double>(Array.ConvertAll(midValues.ToArray(), Convert.ToDouble));
            var forwardTermCurve = TermCurve.Create(new List <TermPoint>());
            var index            = 0;

            foreach (var startOfPeriodDateTime in dates)
            {
                var yearFractionsbeginPeriod  = yearFractions[index];
                var endOfPeriodDateTime       = forwardRateTenor.Add(startOfPeriodDateTime);
                var yearFractionAtEndOfPeriod = (endOfPeriodDateTime - baseDate).TotalDays / 365.0;
                //get df corresponding to end of period
                //
                IInterpolation interpolation = new LinearRateInterpolation();
                interpolation.Initialize(yearFractions.ToArray(), discountFactors.ToArray());
                var dfAtEndOfPeriod         = interpolation.ValueAt(yearFractionAtEndOfPeriod, true);
                var dfAtTheBeginingOfPeriod = discountFactors[index];
                var forwardRate             = (dfAtTheBeginingOfPeriod / dfAtEndOfPeriod - 1) /
                                              (yearFractionAtEndOfPeriod - yearFractionsbeginPeriod);
                var zeroPoint = TermPointFactory.Create(Convert.ToDecimal(forwardRate), startOfPeriodDateTime);
                forwardTermCurve.Add(zeroPoint);
                ++index;
            }
            return(forwardTermCurve);
        }