public void IrSwap() { var bd = DateTime.Parse("2018-09-13"); var pillars = new[] { bd, bd.AddDays(1000) }; var flatRate = 0.05; var rates = pillars.Select(p => flatRate).ToArray(); var usd = TestProviderHelper.CurrencyProvider["USD"]; var discoCurve = new IrCurve(pillars, rates, bd, "USD.BLAH", Interpolator1DType.Linear, usd); var fModel = new FundingModel(bd, new[] { discoCurve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider); CalendarProvider.Collection.TryGetCalendar("LON", out var cal); var ix = new FloatRateIndex { Currency = usd, DayCountBasis = DayCountBasis.ACT360, DayCountBasisFixed = DayCountBasis.ACT360, FixingOffset = 2.Bd(), HolidayCalendars = cal, ResetTenor = 3.Months(), ResetTenorFixed = 3.Months(), RollConvention = RollType.MF }; var parRate = 0.05; var notional = 100e6; var startDate = bd.AddPeriod(RollType.F, cal, 2.Bd()); var maturity = startDate.AddDays(365); var swp = new IrSwap(startDate, 1.Years(), ix, parRate, SwapPayReceiveType.Pay, "USD.BLAH", "USD.BLAH") { Notional = notional, RateIndex = ix }; var pv = swp.Pv(fModel, true); Assert.Equal(-368.89651349, pv, 8); swp = new IrSwap(startDate, 1.Years(), ix, parRate + 0.01, SwapPayReceiveType.Pay, "USD.BLAH", "USD.BLAH") { Notional = notional, RateIndex = ix }; pv = swp.Pv(fModel, true); Assert.Equal(-10217.8229952, pv, 8); Assert.Equal(swp.EndDate, swp.LastSensitivityDate); var d = swp.Dependencies(null); Assert.Single(d); Assert.Equal(0.0496254169169585, swp.CalculateParRate(fModel), 10); Assert.Equal(0.09, (swp.SetParRate(0.09) as IrSwap).ParRate); Assert.Equal(1.0, swp.SupervisoryDelta(null)); Assert.Equal(1.0, swp.MaturityBucket(startDate)); }
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 Calibrators.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); } }