/// <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); }
/// <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); }
///<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); }