public static double ValueZARSwap1Curve([ExcelArgument(Description = "The name of the swap.")] IRSwap swap, [ExcelArgument(Description = "The date on which valuation is required. Cannot be before the anchor date of the curve.")] Date valueDate, [ExcelArgument(Description = "The discounting curve. Will also be used for forecasting Jibar and providing the most recent required Jibar fix.")] IDiscountingSource curve) { // Get the required objects off the map FloatingIndex index = swap.GetFloatingIndex(); // Calculate the first fixing off the curve to use at all past dates. double df1 = curve.GetDF(valueDate); Date laterDate = valueDate.AddTenor(index.tenor); double df2 = curve.GetDF(laterDate); double dt = (laterDate - valueDate) / 365.0; double rate = (df1 / df2 - 1) / dt; //Set up the valuation engine. IFloatingRateSource forecastCurve = new ForecastCurveFromDiscount(curve, index, new FloatingRateFixingCurve1Rate(rate, index)); DeterminsiticCurves curveSim = new DeterminsiticCurves(curve); curveSim.AddRateForecast(forecastCurve); Coordinator coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); // Run the valuation double value = coordinator.Value(new Product[] { swap }, valueDate); return(value); }
public void TestFixedLegsZARUSD() { Date[] cfDates = { new Date(2016, 12, 23), new Date(2017, 03, 23) }; var legZAR = new FixedLeg(TestHelpers.ZAR, cfDates, new double[] { -16000000, -16000000 }, new[] { 0.07, 0.07 }, new[] { 0.25, 0.25 }); var legUSD = new FixedLeg(TestHelpers.USD, cfDates, new double[] { 1000000, 1000000 }, new[] { 0.01, 0.01 }, new[] { 0.25, 0.25 }); // Set up the model var valueDate = new Date(2016, 9, 23); Date[] dates = { new Date(2016, 9, 23), new Date(2026, 9, 23) }; double[] rates = { 0.0725, 0.0725 }; double[] basisRates = { 0.0735, 0.0735 }; double[] usdRates = { 0.01, 0.012 }; IDiscountingSource discountCurve = new DatesAndRates(TestHelpers.ZAR, valueDate, dates, rates); IDiscountingSource zarBasis = new DatesAndRates(TestHelpers.ZAR, valueDate, dates, basisRates); IDiscountingSource usdCurve = new DatesAndRates(TestHelpers.USD, valueDate, dates, usdRates); IFloatingRateSource forecastCurve = new ForecastCurve(valueDate, TestHelpers.Jibar3M, dates, rates); IFXSource fxSource = new FXForecastCurve(TestHelpers.USDZAR, 13.66, usdCurve, zarBasis); var curveSim = new DeterminsiticCurves(discountCurve); curveSim.AddRateForecast(forecastCurve); curveSim.AddFXForecast(fxSource); var coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); // Run the valuation var value = coordinator.Value(new Product[] { legZAR, legUSD }, valueDate); var refValue = -477027.31; // See GeneralSwapTest.xlsx Assert.AreEqual(refValue, value, 0.01); }
public void TestSwap() { // Make the swap var rate = 0.08; var payFixed = true; double notional = 1000000; var startDate = new Date(2016, 9, 17); var tenor = Tenor.Years(5); var swap = IRSwap.CreateZARSwap(rate, payFixed, notional, startDate, tenor); // Set up the model var valueDate = new Date(2016, 9, 17); Date[] dates = { new Date(2016, 9, 17), new Date(2026, 9, 17) }; double[] rates = { 0.07, 0.07 }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, dates, rates); IFloatingRateSource forecastCurve = new ForecastCurve(valueDate, FloatingIndex.JIBAR3M, dates, rates); var curveSim = new DeterminsiticCurves(discountCurve); curveSim.AddRateForecast(forecastCurve); var coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); // Run the valuation var value = coordinator.Value(new Product[] { swap }, valueDate); var refValue = -41838.32; // See RateProductTest.xlsx Assert.AreEqual(refValue, value, 0.01); }
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 void TestManySwaps() { Debug.StartTimer(); Product[] allSwaps = GetListOfSwaps(); Debug.WriteLine("Create swaps took: " + Debug.ElapsedTime().ToString()); // Set up the model Date valueDate = new Date(2016, 11, 21); Date[] dates = { new Date(2016, 11, 21), new Date(2047, 11, 21) }; Date[] datesLong = { new Date(2016, 11, 21), new Date(2018, 11, 21), new Date(2020, 11, 21), new Date(2022, 11, 21), new Date(2024, 11, 21), new Date(2047, 11, 21) }; double[] rates = { 0.07, 0.07 }; double[] ratesLong = { 0.07, 0.071, 0.072, 0.073, 0.074, 0.08 }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, datesLong, ratesLong); IFloatingRateSource forecastCurve = new ForecastCurveFromDiscount(discountCurve, FloatingIndex.JIBAR3M, new FloatingRateFixingCurve1Rate(0.07, FloatingIndex.JIBAR3M)); DeterminsiticCurves curveSim = new DeterminsiticCurves(discountCurve); curveSim.AddRateForecast(forecastCurve); Coordinator coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); // Run the valuation Debug.StartTimer(); double value = coordinator.Value(allSwaps, valueDate); Debug.WriteLine("Value took: " + Debug.ElapsedTime().ToString()); }
public void TestCurveStripTwoZARDiscount() { var valueDate = new Date(2017, 1, 13); var zar = Currency.ZAR; // Empty curves var zarDiscUSDColl = new ZeroRatesCurveForStripping(valueDate, zar); var zarDisc = new ZeroRatesCurveForStripping(valueDate, zar); var jibarCurve = new ForwardRatesCurveForStripping(valueDate, FloatingIndex.JIBAR3M); // Models var modelZARDiscUSDColl = new DeterminsiticCurves(zarDiscUSDColl); modelZARDiscUSDColl.AddRateForecast(jibarCurve); var coordZARDiscUSDColl = new Coordinator(modelZARDiscUSDColl, new List <Simulator>(), 1); coordZARDiscUSDColl.SetThreadedness(false); var modelZARDisc = new DeterminsiticCurves(zarDisc); modelZARDisc.AddRateForecast(jibarCurve); // same jibar curve in both coordinators. var coordZARDisc = new Coordinator(modelZARDisc, new List <Simulator>(), 1); coordZARDisc.SetThreadedness(false); //Instruments for USDColl discounting curve. var mcs = new MultiCurveStripper(valueDate); var depo1 = MakeDepo(valueDate, 0.07, 24); var depo2 = MakeDepo(valueDate, 0.072, 48); mcs.AddDiscounting(depo1, () => coordZARDiscUSDColl.Value(depo1, valueDate), 1.0, 1.0, zarDiscUSDColl); mcs.AddDiscounting(depo2, () => coordZARDiscUSDColl.Value(depo2, valueDate), 1.0, 1.0, zarDiscUSDColl); Product swapUSDColl1 = IRSwap.CreateZARSwap(0.07, true, 1.0, valueDate, Tenor.Months(24)); Product swapUSDColl2 = IRSwap.CreateZARSwap(0.072, true, 1.0, valueDate, Tenor.Months(48)); mcs.AddForecast(swapUSDColl1, () => coordZARDiscUSDColl.Value(swapUSDColl1, valueDate), 0, 1, jibarCurve, FloatingIndex.JIBAR3M); mcs.AddForecast(swapUSDColl2, () => coordZARDiscUSDColl.Value(swapUSDColl2, valueDate), 0, 1, jibarCurve, FloatingIndex.JIBAR3M); Product swapNoColl1 = IRSwap.CreateZARSwap(0.0709, true, 1.0, valueDate, Tenor.Months(36)); Product swapNoColl2 = IRSwap.CreateZARSwap(0.0719, true, 1.0, valueDate, Tenor.Months(48)); mcs.AddDiscounting(swapNoColl1, () => coordZARDisc.Value(swapNoColl1, valueDate), 0, 1, zarDisc); mcs.AddDiscounting(swapNoColl2, () => coordZARDisc.Value(swapNoColl2, valueDate), 0, 1, zarDisc); mcs.Strip(); Assert.AreEqual(1.0, coordZARDiscUSDColl.Value(depo1, valueDate), 1e-6); Assert.AreEqual(1.0, coordZARDiscUSDColl.Value(depo2, valueDate), 1e-6); Assert.AreEqual(0.0, coordZARDiscUSDColl.Value(swapUSDColl2, valueDate), 1e-6); Assert.AreEqual(0.0, coordZARDiscUSDColl.Value(swapUSDColl2, valueDate), 1e-6); //Assert.AreNotEqual(0.0, coordZARDisc.Value(swapUSDColl1, valueDate), 1e-6); No discount sensitivity Assert.AreNotEqual(0.0, coordZARDisc.Value(swapUSDColl2, valueDate), 1e-6); Assert.AreEqual(0.0, coordZARDisc.Value(swapNoColl1, valueDate), 1e-6); Assert.AreEqual(0.0, coordZARDisc.Value(swapNoColl2, valueDate), 1e-6); }
public static NumeraireSimulator CreateCurveModel([ExcelArgument(Description = "The discounting curve")] IDiscountingSource discountCurve, [ExcelArgument(Description = "The floating rate forecast curves for all the rates that the products in the portfolio will need.")] IFloatingRateSource[] rateForecastCurves, [ExcelArgument(Description = "The FX rate forecast curves for all the cashflow currencies other than the discounting currency.")] IFXSource[] fxForecastCurves) { DeterminsiticCurves model = new DeterminsiticCurves(discountCurve); model.AddRateForecast(rateForecastCurves); model.AddFXForecast(fxForecastCurves); return(model); }
public void TestFloatLeg() { // Make the reference swap var rate = 0.0; var payFixed = true; double notional = 1000000; var startDate = new Date(2016, 9, 17); var tenor = Tenor.Years(1); var swap = IRSwap.CreateZARSwap(rate, payFixed, notional, startDate, tenor); // Make a FloatLeg var resetDates = new Date[4]; var paymentDates = new Date[4]; var accrualFractions = new double[4]; var runningDate = new Date(2016, 9, 17); for (var i = 0; i < 4; i++) { resetDates[i] = new Date(runningDate); paymentDates[i] = resetDates[i].AddMonths(3); accrualFractions[i] = (paymentDates[i] - resetDates[i]) / 365.0; runningDate = paymentDates[i]; } var floatLeg = new FloatLeg(Currency.ZAR, paymentDates, new[] { 1e6, 1e6, 1e6, 1e6 }, resetDates, new[] { FloatingIndex.JIBAR3M, FloatingIndex.JIBAR3M, FloatingIndex.JIBAR3M, FloatingIndex.JIBAR3M }, new double[] { 0, 0, 0, 0 }, accrualFractions); // Set up the model var valueDate = new Date(2016, 9, 17); Date[] dates = { new Date(2016, 9, 17), new Date(2026, 9, 17) }; double[] rates = { 0.07, 0.07 }; IDiscountingSource discountCurve = new DatesAndRates(Currency.ZAR, valueDate, dates, rates); IFloatingRateSource forecastCurve = new ForecastCurve(valueDate, FloatingIndex.JIBAR3M, dates, rates); var curveSim = new DeterminsiticCurves(discountCurve); curveSim.AddRateForecast(forecastCurve); // Run the valuation var coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); var swapValue = coordinator.Value(new Product[] { swap }, valueDate); var floatLegValue = coordinator.Value(new Product[] { floatLeg }, valueDate); Assert.AreEqual(swapValue, floatLegValue, 0.01); }
public void TestDynamicCallFromStringFRA() { var source = @"Date date = new Date(2017, 08, 28); FloatRateIndex jibar = new FloatRateIndex(""ZAR.JIBAR.3M"", new Currency(""ZAR""), ""JIBAR"", Tenor.FromMonths(3)); double dt = 91.0/365.0; double fixedRate = 0.071; double notional = 1000000.0; Currency currency = new Currency(""ZAR""); public override List<Cashflow> GetCFs() { double reset = Get(jibar, date); double cfAmount = notional * (reset - fixedRate)*dt/(1+dt*reset); return new List<Cashflow>() { new Cashflow(date, cfAmount, currency) }; }"; // Make a product at runtime var runtimeProduct = RuntimeProduct.CreateFromString("MyEuropeanOption", source); // Set up the model var valueDate = new Date(2016, 9, 17); Date[] dates = { new Date(2016, 9, 17), new Date(2026, 9, 17) }; double[] rates = { 0.07, 0.07 }; IDiscountingSource discountCurve = new DatesAndRates(TestHelpers.ZAR, valueDate, dates, rates); IFloatingRateSource forecastCurve = new ForecastCurve(valueDate, TestHelpers.Jibar3M, dates, rates); var curveSim = new DeterminsiticCurves(discountCurve); curveSim.AddRateForecast(forecastCurve); // Run the valuation var coordinator = new Coordinator(curveSim, new List <Simulator>(), 1); var fraValue = coordinator.Value(new[] { runtimeProduct }, valueDate); var date = new Date(2017, 08, 28); var t = (date - valueDate) / 365.0; var dt = 91.0 / 365.0; var fixedRate = 0.071; var notional = 1000000.0; var fwdRate = 0.07; var refValue = notional * (fwdRate - fixedRate) * dt / (1 + fwdRate * dt) * Math.Exp(-t * 0.07); Assert.AreEqual(refValue, fraValue, 0.01); }
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); }