public void BasicRiskMatrixFacts() { var model = GenerateTestData(); var zar = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR"); var usd = TestProviderHelper.CurrencyProvider.GetCurrency("USD"); var ix = new FloatRateIndex { Currency = usd, DayCountBasis = DayCountBasis.Act365F, DayCountBasisFixed = DayCountBasis.Act365F, FixingOffset = 0.Bd(), ResetTenor = 3.Months(), ResetTenorFixed = 3.Months(), RollConvention = RollType.F }; var f1 = new STIRFuture { ContractSize = 1e6, Currency = usd, DCF = 0.25, Expiry = _originDate.AddDays(1), Position = 1.0, Index = ix, ForecastCurve = "DISCO-USD", SolveCurve = "DISCO-USD", TradeId = "f1", Price = 95, PillarDate = _originDate.AddDays(90) }; var f2 = new STIRFuture { ContractSize = 1e6, Currency = usd, DCF = 0.25, Expiry = _originDate.AddDays(90), Position = 1.0, Index = ix, ForecastCurve = "DISCO-USD", SolveCurve = "DISCO-USD", TradeId = "f2", Price = 95, PillarDate = _originDate.AddDays(180), }; var fic = new FundingInstrumentCollection(TestProviderHelper.CurrencyProvider) { f1, f2 }; var cube = model.BenchmarkRisk(fic, TestProviderHelper.CurrencyProvider, usd); var riskSum = cube.SumOfAllRows; Assert.Equal(-13.0, riskSum, 0); }
public void STIR() { var bd = DateTime.Today; var pillars = new[] { bd, bd.AddDays(1000) }; var flatRate = 0.05; var rates = pillars.Select(p => flatRate).ToArray(); CalendarProvider.Collection.TryGetCalendar("LON", out var cal); 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); var price = 93.0; var ix = new FloatRateIndex { Currency = usd, DayCountBasis = DayCountBasis.ACT360, FixingOffset = 2.Bd(), HolidayCalendars = cal, ResetTenor = 3.Months(), RollConvention = RollType.MF }; var maturity = bd.AddDays(365); var accrualStart = maturity.AddPeriod(RollType.F, ix.HolidayCalendars, ix.FixingOffset); var accrualEnd = accrualStart.AddPeriod(ix.RollConvention, ix.HolidayCalendars, ix.ResetTenor); var dcf = maturity.CalculateYearFraction(accrualEnd, DayCountBasis.ACT360); var s = new STIRFuture { Currency = usd, ContractSize = 1e6, Position = 1, DCF = dcf, Expiry = maturity, ForecastCurve = "USD.BLAH", Price = price, Index = ix }; var pv = s.Pv(fModel, false); var rateEst = discoCurve.GetForwardRate(accrualStart, accrualEnd, RateType.Linear, ix.DayCountBasis); var fairPrice = 100.0 - rateEst * 100; var expectedPv = (price - fairPrice) * 1e6 * dcf / 100.0; Assert.Equal(expectedPv, pv, 8); var ss = s.Sensitivities(fModel); Assert.True(ss.Count == 1 && ss.Keys.Single() == "USD.BLAH"); Assert.True(ss["USD.BLAH"].Count == 2 && ss["USD.BLAH"].Keys.Contains(accrualStart) && ss["USD.BLAH"].Keys.Contains(accrualEnd)); Assert.Empty(s.Dependencies(null)); }
public static object CreateSTIRFromCode( [ExcelArgument(Description = "Object name")] string ObjectName, [ExcelArgument(Description = "Value date")] DateTime ValDate, [ExcelArgument(Description = "Futures Code, e.g. EDZ9")] string FuturesCode, [ExcelArgument(Description = "Rate Index")] string RateIndex, [ExcelArgument(Description = "Price")] double Price, [ExcelArgument(Description = "Quantity in lots")] double Quantity, [ExcelArgument(Description = "Convexity adjustment")] double ConvexityAdjustment, [ExcelArgument(Description = "Forecast Curve")] string ForecastCurve, [ExcelArgument(Description = "Solve Curve name ")] object SolveCurve, [ExcelArgument(Description = "Solve Pillar Date")] object SolvePillarDate) { return(ExcelHelper.Execute(_logger, () => { if (!ContainerStores.GetObjectCache <FloatRateIndex>().TryGetObject(RateIndex, out var rIndex)) { _logger?.LogInformation("Rate index {index} not found in cache", RateIndex); return $"Rate index {RateIndex} not found in cache"; } var c = new FutureCode(FuturesCode, DateTime.Today.Year - 2, ContainerStores.SessionContainer.GetService <IFutureSettingsProvider>()); var expiry = c.GetExpiry(); var accrualStart = expiry.AddPeriod(RollType.F, rIndex.Value.HolidayCalendars, rIndex.Value.FixingOffset); var accrualEnd = accrualStart.AddPeriod(rIndex.Value.RollConvention, rIndex.Value.HolidayCalendars, rIndex.Value.ResetTenor); //var dcf = accrualStart.CalculateYearFraction(accrualEnd, rIndex.Value.DayCountBasis); var product = new STIRFuture { Currency = rIndex.Value.Currency, ContractSize = c.Settings.LotSize, //DCF = dcf, ConvexityAdjustment = ConvexityAdjustment, Expiry = expiry, ForecastCurve = ForecastCurve, Index = rIndex.Value, Position = Quantity, Price = Price, SolveCurve = SolveCurve.OptionalExcel(ForecastCurve), PillarDate = SolvePillarDate.OptionalExcel(accrualEnd), TradeId = ObjectName }; return ExcelHelper.PushToCache(product, ObjectName); })); }
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); } } }