public void TestLinearRateInterpolation()
        {
            TearDown();
            double[] exp           = SetUp();
            Random   r             = new Random(Environment.TickCount);
            var      interpolation = new LinearRateInterpolation();

            double[] temp = new double[exp.Length];
            exp.CopyTo(temp, 0);
            interpolation.Initialize(_times, temp);
            for (int i = 0; i < 10; ++i)
            {
                double time       = i + r.Next(-10000, 10000) / 10000;
                double interpRate = interpolation.ValueAt(time, true);
                Debug.WriteLine($"interpolatedRate : {interpRate} Time: {time}");
            }
            int index = 0;

            foreach (double time in _times)
            {
                double interpRate  = interpolation.ValueAt(time, true);
                double interpValue = exp[index];
                Assert.AreEqual(interpRate, interpValue);
                index++;
            }
        }
Esempio n. 2
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);
        }