//To transform par to discount, get the par rates needed private static Curve GetParCurveForTransformationToDiscount(Curve curve) { var inputTermsAndRates = curve.TermsAndRates; var freqTimesteps = decimal.Divide(1, (decimal)curve.CompoundingFrequency.Value);; var requiredTerms = Array.ConvertAll(CreateArrayConstantIncrement((decimal)inputTermsAndRates.Keys.Max(), freqTimesteps, freqTimesteps), x => (double)x); if (requiredTerms.Any(x => !inputTermsAndRates.ContainsKey(x))) { Log.Info("Par rates have not been given for every cashflow frequency. Linear interpolation will be done on the par rates for missing rates! If you would like to use a different interpolation method, interpolate before calling this method."); } var interpolator = new InterpolationModifier(InterpolationType.Linear, inputTermsAndRates); var interpolatedTermsAndRates = interpolator.Interpolate(requiredTerms.ToArray()); var interpolatedParCurve = curve.Copy(); interpolatedParCurve.SetTermsAndRates(interpolatedTermsAndRates); return(interpolatedParCurve); }
static void Main() { var curveInfoFilePath = @"C:\Users\flori\OneDrive\Documents\Learning\C# Curves\Inputs\TestCurveInformation.csv"; var ratesFilePath = @"C:\Users\flori\OneDrive\Documents\Learning\C# Curves\Inputs\TestRates.csv"; var outputPathCurves = @"C:\Users\flori\OneDrive\Documents\Learning\C# Curves\Outputs\TransformedCurves.csv"; var curves = ParseCurves(curveInfoFilePath, ratesFilePath); var adjustedCurves = new Dictionary <string, Curve>(); foreach (var curveWithName in curves) { var name = curveWithName.Key; var curve = curveWithName.Value; adjustedCurves.Add($"{name}_1base", curve); //interpolated curve example var interpolatedCurve = curve.Copy(); var interpolator = new InterpolationModifier(InterpolationType.Spline, curve.TermsAndRates); interpolator.Interpolate(interpolatedCurve, MaturityType.Quarterly); adjustedCurves.Add($"{name}_2interpolated", interpolatedCurve); //extrapolated curve example var extrapolatedCurve = interpolatedCurve.Copy(); var extrapolator = new ExtrapolationModifier(ExtrapolationType.Constant, interpolatedCurve.TermsAndRates); extrapolator.Extrapolate(extrapolatedCurve, 100); adjustedCurves.Add($"{name}_3extrapolated", extrapolatedCurve); //transformed curve example forward var transformedCurveDisc = extrapolatedCurve.Copy(); var curveTypeTransformerDisc = new CurveTypeTransformerFactory().GetTransformer(CurveType.Discount); curveTypeTransformerDisc.Transform(transformedCurveDisc); adjustedCurves.Add($"{name}_4transformedDisc", transformedCurveDisc); //transformed curve example forward var transformedCurveFwd = transformedCurveDisc.Copy(); var curveTypeTransformerFwd = new CurveTypeTransformerFactory().GetTransformer(CurveType.Forward); curveTypeTransformerFwd.Transform(transformedCurveFwd); adjustedCurves.Add($"{name}_5transformedFwd", transformedCurveFwd); } WriteRatesToCsv(adjustedCurves, outputPathCurves); }