예제 #1
0
        /// <summary>
        /// </summary>
        /// <param name="discountCurve"></param>
        /// <param name="tenor"></param>
        /// <param name="baseDate"></param>
        /// <param name="interpolatedCurve"></param>
        /// <param name="paymentCalendar"></param>
        /// <param name="dayCounter"></param>
        /// <returns></returns>
        /// <exception cref="System.Exception"></exception>
        public static TermCurve ToForwardCurve(TermCurve discountCurve, Period tenor, DateTime baseDate,
                                               InterpolatedCurve interpolatedCurve, IBusinessCalendar paymentCalendar, IDayCounter dayCounter)
        {
            TermCurve result = TermCurve.Create(new List <TermPoint>());
            var       length = discountCurve.point.Length;
            var       offset = new Offset
            {
                dayType          = DayTypeEnum.Calendar,
                dayTypeSpecified = true,
                period           = tenor.period,
                periodMultiplier = tenor.periodMultiplier,
                periodSpecified  = true
            };

            if (paymentCalendar == null)
            {
                return(result);
            }
            for (int i = 0; i < length - 1; i++) //This will only go to the penultimate point. Extrapolation required for more.
            {
                var      pointStart        = discountCurve.point[i];
                DateTime startDate         = XsdClassesFieldResolver.TimeDimensionGetDate(pointStart.term);
                var      endDate           = paymentCalendar.Advance(startDate, offset, BusinessDayConventionEnum.FOLLOWING);
                var      endPoint          = new DateTimePoint1D(baseDate, endDate);
                var      endDF             = interpolatedCurve.Value(endPoint);
                double   time              = dayCounter.YearFraction(startDate, endDate);
                var      forwardRateDouble =
                    RateAnalytics.DiscountFactorsToForwardRate((double)pointStart.mid, endDF, time);
                TermPoint forwardPoint = TermPointFactory.Create(Convert.ToDecimal(forwardRateDouble), startDate);
                forwardPoint.id = tenor.id;
                result.Add(forwardPoint);
            }
            return(result);
        }
예제 #2
0
        //  need a based date?
        //
        ///<summary>
        ///</summary>
        ///<param name="discountCurve"></param>
        ///<param name="baseDate"></param>
        ///<param name="frequency"></param>
        ///<param name="dayCounter"></param>
        ///<returns></returns>
        ///<exception cref="System.Exception"></exception>
        public static TermCurve ToZeroCurve(TermCurve discountCurve, DateTime baseDate,
                                            CompoundingFrequencyEnum frequency, IDayCounter dayCounter)
        {
            TermCurve result = TermCurve.Create(new List <TermPoint>());

            foreach (TermPoint point in discountCurve.point)
            {
                DateTime pointDate = XsdClassesFieldResolver.TimeDimensionGetDate(point.term);
                double   zeroRateDouble;
                if (baseDate != pointDate)
                {
                    double time = dayCounter.YearFraction(baseDate, pointDate);
                    zeroRateDouble = RateAnalytics.DiscountFactorToZeroRate((double)point.mid, time, frequency);
                }
                else
                {
                    // set after the loop
                    zeroRateDouble = 0;
                }
                TermPoint zeroPoint = TermPointFactory.Create(Convert.ToDecimal(zeroRateDouble), pointDate);
                zeroPoint.id = point.id;
                result.Add(zeroPoint);
            }
            if (result.point[0].mid == 0)
            {
                result.point[0].mid = result.point[1].mid;
            }
            return(result);
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pointToAdd"></param>
        public void Add(TermPoint pointToAdd)
        {
            var list = new List <TermPoint>(point)
            {
                pointToAdd
            };

            point = list.ToArray();
        }
예제 #4
0
        public void Add(TermPoint pointToAdd)
        {
            List <TermPoint> list = new List <TermPoint>(this.point)
            {
                pointToAdd
            };

            this.point = list.ToArray();
        }
예제 #5
0
        /// <summary>
        /// Returns a term curve.
        /// This means the discount factor curve for a YieldCurve,
        /// an fx forward curve for an Fx curve,
        /// a recovery rate curve for a credit curve.
        /// A volatility matrix is not handled.
        /// </summary>
        /// <returns></returns>
        public TermCurve GetTermCurve()
        {
            // we need to extract the curve.
            if (Items1 == null)
            {
                return(null);
            }
            var psv = Items1[0];
            var ycv = psv as YieldCurveValuation;

            if (ycv?.zeroCurve != null)
            {
                return(ycv.zeroCurve.rateCurve ?? ycv.discountFactorCurve);
            }
            if (psv is FxCurveValuation fxv)
            {
                return(fxv.fxForwardCurve);
            }
            if (psv is CreditCurveValuation crv)
            {
                return(crv.recoveryRateCurve);
            }
            //This only works for volatility curves.
            if (psv is VolatilityMatrix vm)
            {
                var points     = vm.dataPoints?.point;
                var termPoints = new List <TermPoint>();
                if (points != null && vm.baseDate?.Value is DateTime baseDate)
                {
                    foreach (var point in points)
                    {
                        var tenor  = point.coordinate[0]?.expiration[0];
                        var period = tenor?.Items[0];
                        if (period is Period numDaysPeriod)
                        {
                            var newDate = baseDate.AddDays(Convert.ToInt16(numDaysPeriod.periodMultiplier));
                            var time    = new TimeDimension {
                                Items = new object[1]
                            };
                            time.Items[0] = newDate;
                            var termPoint = new TermPoint
                            {
                                term         = time,
                                mid          = point.value,
                                midSpecified = true
                            };
                            termPoints.Add(termPoint);
                        }
                    }
                }
                var termCurve = new TermCurve {
                    point = termPoints.ToArray()
                };
                return(termCurve);
            }
            return(null);
        }
예제 #6
0
        public static TermPoint Create(decimal mid, TimeDimension term)
        {
            var termPoint = new TermPoint
            {
                mid          = mid,
                midSpecified = true,
                term         = term
            };

            return(termPoint);
        }
예제 #7
0
        public static TermPoint Create(decimal mid, DateTime term)
        {
            var termPoint = new TermPoint
            {
                mid          = mid,
                midSpecified = true
            };
            var timeDimension = new TimeDimension();

            XsdClassesFieldResolver.TimeDimensionSetDate(timeDimension, term);
            termPoint.term = timeDimension;
            return(termPoint);
        }
예제 #8
0
        public static TermPoint Create(decimal mid, TimeDimension term)
        {
            var termPoint = new TermPoint
            {
                mid          = mid,
                midSpecified = true
            };
            var timeDimension = new TimeDimension {
                Items = new object[] { term }
            };

            termPoint.term = timeDimension;
            return(termPoint);
        }
        internal static TermCurve ConstructDiscountFactors(ILogger logger, ICoreCache cache, string nameSpace, TermCurve inputCurve, DateTime baseDate, string currency)
        {
            List <DateTime> dates      = inputCurve.point.Select(a => (DateTime)a.term.Items[0]).ToList();
            List <decimal>  values     = inputCurve.point.Select(a => a.mid).ToList();
            var             properties = new NamedValueSet();

            properties.Set(CurveProp.PricingStructureType, PricingStructureTypeEnum.RateCurve.ToString());
            properties.Set(CurveProp.Market, "ConstructDiscountFactors");
            properties.Set(CurveProp.IndexTenor, "0M");
            properties.Set(CurveProp.Currency1, currency);
            properties.Set(CurveProp.IndexName, "XXX-XXX");
            properties.Set(CurveProp.Algorithm, "FastLinearZero");
            properties.Set(CurveProp.BaseDate, baseDate);
            var curveId         = new RateCurveIdentifier(properties);
            var algorithmHolder = new PricingStructureAlgorithmsHolder(logger, cache, nameSpace, curveId.PricingStructureType, curveId.Algorithm);
            var curve           = new RateCurve(properties, algorithmHolder, dates, values);
            var termPoints      = new List <TermPoint>();

            for (DateTime date = dates.First(); date <= dates.Last(); date = date.AddMonths(1))
            {
                var discountFactor = (decimal)curve.GetDiscountFactor(date);
                var timeDimension  = new TimeDimension();
                XsdClassesFieldResolver.TimeDimensionSetDate(timeDimension, date);
                var termPoint = new TermPoint
                {
                    mid          = discountFactor,
                    midSpecified = true,
                    term         = timeDimension
                };
                termPoints.Add(termPoint);
            }
            var termCurve = new TermCurve {
                point = termPoints.ToArray()
            };

            return(termCurve);
        }
예제 #10
0
        public static DateTime GetDate(TermPoint termPoint)
        {
            DateTime date = XsdClassesFieldResolver.TimeDimensionGetDate(termPoint.term);

            return(date);
        }
예제 #11
0
        /// <summary>
        /// Gets the termpoints from a priceablespreadasset controller.
        /// </summary>
        /// <param name="spreadAsset"></param>
        /// <returns></returns>
        public static TermPoint[] SpreadAssetMapper(IPriceableSpreadAssetController spreadAsset)
        {
            var points = new TermPoint[1];

            return(points);
        }