public void ConvexityAdjustmentAsExample() { var valDate = new DateTime(2017, 01, 31); var expiry = new DateTime(2020, 01, 31); var depoExpiry = new DateTime(2020, 04, 30); var volatility = 0.012; var adjustment = FuturesConvexityUtils.CalculateConvexityAdjustment(valDate, expiry, depoExpiry, volatility, Dates.DayCountBasis.ThirtyE360); var exampleExpected = 0.0007; Assert.Equal(exampleExpected, adjustment, 4); }
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 Calibrators.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); } } }