public void TestCurveStripSingleCurve() { Date valueDate = new Date(2017, 1, 13); Currency zar = Currency.ZAR; double N = 1.0; double r1 = 0.07; double r2 = 0.075; Date date1 = valueDate.AddMonths(3); Date date2 = valueDate.AddMonths(6); ZeroRatesCurveForStripping zarDiscUSDColl = new ZeroRatesCurveForStripping(valueDate, zar); ZeroRatesCurveForStripping zarDisc = new ZeroRatesCurveForStripping(valueDate, zar); Product depo1 = new CashLeg(new Date[] { valueDate, date1 }, new double[] { -N, N * (1 + r1 * 0.25) }, new Currency[] { zar, zar }); Product depo2 = new CashLeg(new Date[] { valueDate, date2 }, new double[] { -N, N * (1 + r2 * 0.5) }, new Currency[] { zar, zar }); DeterminsiticCurves modelZARDisc = new DeterminsiticCurves(zarDisc); Coordinator coordZARDisc = new Coordinator(modelZARDisc, new List <Simulator>(), 1); coordZARDisc.SetThreadedness(false); MultiCurveStripper mcs = new MultiCurveStripper(valueDate); mcs.AddDiscounting(depo1, () => coordZARDisc.Value(depo1, valueDate), N, 1.0, zarDisc); mcs.AddDiscounting(depo2, () => coordZARDisc.Value(depo2, valueDate), N, 1.0, zarDisc); mcs.Strip(); Assert.AreEqual(N, coordZARDisc.Value(depo1, valueDate), 1e-6); Assert.AreEqual(N, coordZARDisc.Value(depo2, valueDate), 1e-6); }
public static object _CreateCashLeg(string objectName, object[,] paymentDates, object[,] amounts, object[,] currencies) { try { Date[] _paymentDates = XU.GetDate1D(paymentDates, "paymentDates"); Double[] _amounts = XU.GetDouble1D(amounts, "amounts"); Currency[] _currencies = XU.GetCurrency1D(currencies, "currencies"); CashLeg _result = XLRates.CreateCashLeg(_paymentDates, _amounts, _currencies); return(XU.AddObject(objectName, _result)); } catch (Exception e) { return(XU.Error0D(e)); } }
public void TestCurveStripSeparateForecastAndDiscount() { var valueDate = new Date(2017, 1, 13); var zar = Currency.ZAR; var N = 1.0; var r1 = 0.12; var r2 = 0.08; var date1 = valueDate.AddMonths(6); var date2 = valueDate.AddMonths(12); var zarDisc = new ZeroRatesCurveForStripping(valueDate, zar); var jibar3mForecast = new ForwardRatesCurveForStripping(valueDate, FloatingIndex.JIBAR3M, zarDisc); Product depo1 = new CashLeg(new[] { valueDate, date1 }, new[] { -N, N * (1 + r1 * 0.5) }, new[] { zar, zar }); Product depo2 = new CashLeg(new[] { valueDate, date2 }, new[] { -N, N * (1 + r2 * 1) }, new[] { zar, zar }); Product swap = IRSwap.CreateZARSwap(0.08, true, 1.0, valueDate, Tenor.Months(9)); var modelZARDisc = new DeterminsiticCurves(zarDisc); modelZARDisc.AddRateForecast(jibar3mForecast); var coordZARDisc = new Coordinator(modelZARDisc, new List <Simulator>(), 1); coordZARDisc.SetThreadedness(false); var mcs = new MultiCurveStripper(valueDate); mcs.AddDiscounting(depo1, () => coordZARDisc.Value(depo1, valueDate), N, 1.0, zarDisc); mcs.AddDiscounting(depo2, () => coordZARDisc.Value(depo2, valueDate), N, 1.0, zarDisc); mcs.AddForecast(swap, () => coordZARDisc.Value(swap, valueDate), 0.0, 1.0, jibar3mForecast, FloatingIndex.JIBAR3M); mcs.Strip(); Assert.AreEqual(N, coordZARDisc.Value(depo1, valueDate), 1e-6); Assert.AreEqual(N, coordZARDisc.Value(depo2, valueDate), 1e-6); Assert.AreEqual(0, coordZARDisc.Value(swap, valueDate), 1e-6); /*double[] fwdRates = new double[180]; * for (int i=0; i<180; i++ ) * { * fwdRates[i] = jibar3mForecast.GetForwardRate(valueDate.AddTenor(Tenor.Days(i))); * } * Debug.WriteToFile("c:\\dev\\quantsa\\temp\\fwdRates.csv", fwdRates); */ }
public void TestCurveStripWithUnderlying() { Date valueDate = new Date(2017, 1, 13); Currency zar = Currency.ZAR; double N = 1.0; double r1 = 0.07; double r2 = 0.075; Date date1 = valueDate.AddMonths(3); Date date2 = valueDate.AddMonths(6); double turnSize = 0.05; IDiscountingSource turnShapeCurve = new DFCurveWithTurn(valueDate, zar, new Date(2017, 2, 20), turnSize); ZeroRatesCurveForStripping zarDisc = new ZeroRatesCurveForStripping(valueDate, turnShapeCurve); Product depo1 = new CashLeg(new Date[] { valueDate, date1 }, new double[] { -N, N * (1 + r1 * 0.25) }, new Currency[] { zar, zar }); Product depo2 = new CashLeg(new Date[] { valueDate, date2 }, new double[] { -N, N * (1 + r2 * 0.5) }, new Currency[] { zar, zar }); DeterminsiticCurves modelZARDisc = new DeterminsiticCurves(zarDisc); Coordinator coordZARDisc = new Coordinator(modelZARDisc, new List <Simulator>(), 1); coordZARDisc.SetThreadedness(false); MultiCurveStripper mcs = new MultiCurveStripper(valueDate); mcs.AddDiscounting(depo1, () => coordZARDisc.Value(depo1, valueDate), N, 1.0, zarDisc); mcs.AddDiscounting(depo2, () => coordZARDisc.Value(depo2, valueDate), N, 1.0, zarDisc); mcs.Strip(); Assert.AreEqual(N, coordZARDisc.Value(depo1, valueDate), 1e-6); Assert.AreEqual(N, coordZARDisc.Value(depo2, valueDate), 1e-6); double df1 = zarDisc.GetDF(new Date(2017, 2, 19)); double df2 = zarDisc.GetDF(new Date(2017, 2, 20)); double df3 = zarDisc.GetDF(new Date(2017, 2, 21)); double df4 = zarDisc.GetDF(new Date(2017, 2, 22)); double rate1 = 365.0 * (df1 / df2 - 1); double rate2 = 365.0 * (df2 / df3 - 1); double rate3 = 365.0 * (df3 / df4 - 1); Assert.AreEqual(turnSize, rate2 - rate1, turnSize / 100); Assert.AreEqual(turnSize, rate2 - rate3, turnSize / 100); }