/// <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); }
// 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); }
/// <summary> /// /// </summary> /// <param name="pointToAdd"></param> public void Add(TermPoint pointToAdd) { var list = new List <TermPoint>(point) { pointToAdd }; point = list.ToArray(); }
public void Add(TermPoint pointToAdd) { List <TermPoint> list = new List <TermPoint>(this.point) { pointToAdd }; this.point = list.ToArray(); }
/// <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); }
public static TermPoint Create(decimal mid, TimeDimension term) { var termPoint = new TermPoint { mid = mid, midSpecified = true, term = term }; return(termPoint); }
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); }
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); }
public static DateTime GetDate(TermPoint termPoint) { DateTime date = XsdClassesFieldResolver.TimeDimensionGetDate(termPoint.term); return(date); }
/// <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); }