public void BasicSelfDiscounting() { var startDate = new DateTime(2016, 05, 20); var swapTenor2 = new Frequency("2y"); var jhb = TestProviderHelper.CalendarProvider.Collection["JHB"]; var pillarDate = startDate.AddPeriod(RollType.MF, jhb, 1.Years()); var pillarDate2 = startDate.AddPeriod(RollType.MF, jhb, swapTenor2); var pillarDateDepo = startDate.AddPeriod(RollType.MF, jhb, 3.Months()); var ccyZar = TestProviderHelper.CurrencyProvider["JHB"]; var zar3m = new FloatRateIndex() { Currency = ccyZar, DayCountBasis = DayCountBasis.Act_365F, DayCountBasisFixed = DayCountBasis.Act_365F, ResetTenor = 3.Months(), FixingOffset = 0.Bd(), HolidayCalendars = jhb, RollConvention = RollType.MF }; var swap = new IrSwap(startDate, 1.Years(), zar3m, 0.06, SwapPayReceiveType.Payer, "ZAR.JIBAR.3M", "ZAR.JIBAR.3M"); var swap2 = new IrSwap(startDate, swapTenor2, zar3m, 0.06, SwapPayReceiveType.Payer, "ZAR.JIBAR.3M", "ZAR.JIBAR.3M"); var depo = new IrSwap(startDate, 3.Months(), zar3m, 0.06, SwapPayReceiveType.Payer, "ZAR.JIBAR.3M", "ZAR.JIBAR.3M"); var fic = new FundingInstrumentCollection(TestProviderHelper.CurrencyProvider) { swap, swap2, depo }; var curve = new IrCurve(new [] { pillarDateDepo, pillarDate, pillarDate2 }, new double[3], startDate, "ZAR.JIBAR.3M", Interpolator1DType.LinearFlatExtrap, ccyZar); var model = new FundingModel(startDate, new[] { curve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider); var s = new NewtonRaphsonMultiCurveSolver(); if (IsCoverageOnly) { s.Tollerance = 1; } s.Solve(model, fic); var resultSwap1 = swap.Pv(model, false); var resultSwap2 = swap2.Pv(model, false); var resultDepo = depo.Pv(model, false); if (!IsCoverageOnly) { Assert.Equal(0, resultSwap1, 6); Assert.Equal(0, resultSwap2, 6); Assert.Equal(0, resultDepo, 6); } }
public void BasicOisCurveSolving() { var startDate = new DateTime(2016, 05, 20); var depoTenors = new Frequency[] { 3.Months() }; double[] depoPrices = { 0.06 }; string[] FRATenors = { "3x6", "6x9", "9x12" }; double[] FRAPrices = { 0.065, 0.07, 0.075 }; var swapTenors = new Frequency[] { 18.Months(), 2.Years(), 3.Years(), 4.Years(), 5.Years(), 7.Years(), 10.Years(), 15.Years(), 20.Years() }; double[] swapPrices = { 0.075, 0.08, 0.085, 0.09, 0.095, 0.0975, 0.098, 0.099, 0.1 }; var oisTenors = new Frequency[] { 3.Months(), 6.Months(), 1.Years(), 2.Years(), 3.Years(), 4.Years(), 5.Years(), 7.Years(), 10.Years(), 15.Years(), 20.Years() }; var oisPrices = new double[] { 0.004, 0.004, 0.004, 0.004, 0.004, 0.004, 0.004, 0.004, 0.004, 0.004, 0.004 }; var pillarDatesDepo = depoTenors.Select(x => startDate.AddPeriod(RollType.MF, JHB, x)).ToArray(); var pillarDatesFRA = FRATenors.Select(x => startDate.AddPeriod(RollType.MF, JHB, new Frequency(x.Split('x')[1] + "M"))).ToArray(); var pillarDatesSwap = swapTenors.Select(x => startDate.AddPeriod(RollType.MF, JHB, x)).ToArray(); var pillarDates3m = pillarDatesDepo.Union(pillarDatesSwap).Union(pillarDatesFRA).Distinct().OrderBy(x => x).ToArray(); var pillarDatesOIS = oisTenors.Select(x => startDate.AddPeriod(RollType.MF, JHB, x)).ToArray(); var swaps = new IrSwap[swapTenors.Length]; var depos = new IrSwap[depoTenors.Length]; var oisSwaps = new IrBasisSwap[oisTenors.Length]; var FRAs = new ForwardRateAgreement[FRATenors.Length]; var fic = new FundingInstrumentCollection(TestProviderHelper.CurrencyProvider); for (var i = 0; i < FRAs.Length; i++) { FRAs[i] = new ForwardRateAgreement(startDate, FRATenors[i], FRAPrices[i], _zar3m, SwapPayReceiveType.Payer, FraDiscountingType.Isda, "ZAR.JIBAR.3M", "ZAR.OIS.1B"); fic.Add(FRAs[i]); } for (var i = 0; i < oisSwaps.Length; i++) { oisSwaps[i] = new IrBasisSwap(startDate, oisTenors[i], oisPrices[i], true, zaron, _zar3m, "ZAR.JIBAR.3M", "ZAR.OIS.1B", "ZAR.OIS.1B"); fic.Add(oisSwaps[i]); } for (var i = 0; i < swaps.Length; i++) { swaps[i] = new IrSwap(startDate, swapTenors[i], _zar3m, swapPrices[i], SwapPayReceiveType.Payer, "ZAR.JIBAR.3M", "ZAR.OIS.1B"); fic.Add(swaps[i]); } for (var i = 0; i < depos.Length; i++) { depos[i] = new IrSwap(startDate, depoTenors[i], _zar3m, depoPrices[i], SwapPayReceiveType.Payer, "ZAR.JIBAR.3M", "ZAR.OIS.1B"); fic.Add(depos[i]); } var curve3m = new IrCurve(pillarDates3m, new double[pillarDates3m.Length], startDate, "ZAR.JIBAR.3M", Interpolator1DType.LinearFlatExtrap, ccyZar); var curveOIS = new IrCurve(pillarDatesOIS, new double[pillarDatesOIS.Length], startDate, "ZAR.OIS.1B", Interpolator1DType.LinearFlatExtrap, ccyZar); var model = new FundingModel(startDate, new IrCurve[] { curve3m, curveOIS }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider); var S = new NewtonRaphsonMultiCurveSolver { Tollerance = IsCoverageOnly ? 1 : 0.00000001, MaxItterations = IsCoverageOnly ? 1 : 100, }; S.Solve(model, fic); if (!IsCoverageOnly) { foreach (var ins in fic) { var pv = ins.Pv(model, false); Assert.Equal(0.0, pv, 7); } } }
public void FuturesStripWithConvexity() { var volatility = 0.03; var startDate = new DateTime(2017, 01, 17); var nContracts = 24; var currentDate = startDate.GetNextImmDate(); var expiries = new DateTime[nContracts]; var pillars = new DateTime[nContracts]; var instruments = new IFundingInstrument[nContracts]; var nyc = TestProviderHelper.CalendarProvider.Collection["NYC"]; var lon = TestProviderHelper.CalendarProvider.Collection["LON"]; var ccyUsd = TestProviderHelper.CurrencyProvider["USD"]; var usd3m = new FloatRateIndex() { Currency = ccyUsd, DayCountBasis = DayCountBasis.Act_360, DayCountBasisFixed = DayCountBasis.Act_360, ResetTenor = 3.Months(), FixingOffset = 2.Bd(), HolidayCalendars = nyc, RollConvention = RollType.MF }; for (var i = 0; i < nContracts; i++) { var wed3rd = currentDate.ThirdWednesday(); expiries[i] = wed3rd.SubtractPeriod(RollType.P, lon, 2.Bd()); pillars[i] = wed3rd.AddPeriod(usd3m.RollConvention, usd3m.HolidayCalendars, usd3m.ResetTenor); instruments[i] = new STIRFuture() { Currency = ccyUsd, ContractSize = 1e6, ConvexityAdjustment = FuturesConvexityUtils.CalculateConvexityAdjustment(startDate, expiries[i], pillars[i], volatility), DCF = 0.25, Expiry = expiries[i], ForecastCurve = "USD.LIBOR.3M", Index = usd3m, Position = 1.0, Price = 99.50, SolveCurve = "USD.LIBOR.3M" }; currentDate = currentDate.AddMonths(3); } var fic = new FundingInstrumentCollection(TestProviderHelper.CurrencyProvider); fic.AddRange(instruments); var curve = new IrCurve(pillars, new double[nContracts], startDate, "USD.LIBOR.3M", Interpolator1DType.LinearFlatExtrap, ccyUsd); var model = new FundingModel(startDate, new[] { curve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider); var s = new NewtonRaphsonMultiCurveSolver() { Tollerance = IsCoverageOnly ? 1 : 0.00000001 }; s.Solve(model, fic); if (!IsCoverageOnly) { for (var i = 0; i < nContracts; i++) { var resultPV = instruments[i].Pv(model, false); Assert.Equal(0, resultPV, 6); } } }