Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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));
        }
Ejemplo n.º 3
0
        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);
            }));
        }
Ejemplo n.º 4
0
        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);
                }
            }
        }