Esempio n. 1
0
        public void CompositePriceCurveFact()
        {
            var originDate = new DateTime(2019, 05, 28);
            var zar        = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR");
            var usd        = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var zarCurve   = new ConstantRateIrCurve(0.07, originDate, "ZARCurve", zar);
            var usdCurve   = new ConstantRateIrCurve(0.02, originDate, "USDCurve", usd);
            var fModel     = new FundingModel(originDate, new[] { zarCurve, usdCurve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);
            var fxMatrix   = new FxMatrix(TestProviderHelper.CurrencyProvider);
            var fxPair     = new FxPair {
                Domestic = zar, Foreign = usd, SpotLag = new Dates.Frequency("0d")
            };

            fxMatrix.Init(zar, originDate, new Dictionary <Currency, double> {
                { usd, 10.0 }
            }, new List <FxPair>()
            {
                fxPair
            }, new Dictionary <Currency, string> {
                { usd, "USDCurve" }, { zar, "ZARCurve" }
            });
            fModel.SetupFx(fxMatrix);
            var baseCurve = new ConstantPriceCurve(100.0, originDate, TestProviderHelper.CurrencyProvider)
            {
                Currency = usd,
                Name     = "gooo",
                AssetId  = "rooo"
            };

            var sut  = new CompositePriceCurve(originDate, baseCurve, fModel, zar);
            var sut2 = new CompositePriceCurve(originDate, () => baseCurve, () => fModel, zar);

            var fxOrigin = fModel.GetFxRate(originDate, usd, zar);

            Assert.Equal(baseCurve.GetPriceForDate(originDate) * fxOrigin, sut.GetPriceForDate(originDate));
            Assert.Equal(baseCurve.GetPriceForDate(originDate) * fxOrigin, sut2.GetPriceForDate(originDate));
            Assert.Equal(baseCurve.GetPriceForDate(originDate) * fxOrigin, sut.GetPriceForFixingDate(originDate));
            Assert.Equal(baseCurve.GetPriceForDate(originDate) * fxOrigin, sut.GetAveragePriceForDates(new[] { originDate }));

            Assert.Equal("gooo", sut.Name);
            Assert.Throws <Exception>(() => sut.Name = null);
            Assert.Single(sut.GetDeltaScenarios(0.0, null));
            Assert.Equal(PriceCurveType.Linear, sut.CurveType);
            Assert.False(sut.UnderlyingsAreForwards);
            Assert.Equal(1, sut.NumberOfPillars);
            Assert.Equal("rooo", sut.AssetId);
            Assert.Equal(zar, sut.CompoCurrency);
            Assert.Equal(zar, sut.Currency);
            Assert.Throws <Exception>(() => sut.Currency = null);
            Assert.Equal(usd, sut.CurveCurrency);
            Assert.Single(sut.PillarDates);

            Assert.Equal(DateTime.Today.AddDays(1), sut.RebaseDate(DateTime.Today.AddDays(1)).BuildDate);
            Assert.Equal(originDate, sut.PillarDatesForLabel(originDate.ToString("yyyy-MM-dd")));
            Assert.Throws <Exception>(() => sut.PillarDatesForLabel(""));
        }
Esempio n. 2
0
        public void HazzardCurveFact()
        {
            var hzi    = new Math.Interpolation.ConstantHazzardInterpolator(0.1);
            var origin = new DateTime(2019, 05, 28);
            var hz     = new HazzardCurve(origin, Dates.DayCountBasis.Act365F, hzi);

            Assert.Equal(1.0, hz.GetSurvivalProbability(origin, origin));
            Assert.Equal(1.0, hz.GetSurvivalProbability(origin));
            Assert.Equal(hzi.Interpolate(1.0 / 365.0), hz.GetSurvivalProbability(origin, origin.AddDays(1)));

            var dfCurve = new ConstantRateIrCurve(0.05, origin, "zzz", TestProviderHelper.CurrencyProvider.GetCurrency("USD"));

            var df = dfCurve.GetDf(origin, origin.AddDays(100));

            Assert.Equal(df, hz.RiskyDiscountFactor(origin, origin.AddDays(100), dfCurve, 0.0));
            Assert.Equal(df * (1.0 - (1.0 - hzi.Interpolate(100.0 / 365)) * 0.5), hz.RiskyDiscountFactor(origin, origin.AddDays(100), dfCurve, 0.5));
        }
Esempio n. 3
0
        private AssetFxModel GetModel()
        {
            var irCurveZar = new ConstantRateIrCurve(0.07, ValDate, "ZAR-IR", zar);
            var irCurveUsd = new ConstantRateIrCurve(0.02, ValDate, "USD-IR", zar);
            var fxMatrix   = new FxMatrix(TestProviderHelper.CurrencyProvider);
            var fxPair     = new FxPair()
            {
                Domestic          = usd,
                Foreign           = zar,
                PrimaryCalendar   = TestProviderHelper.CalendarProvider.GetCalendar("ZAR"),
                SecondaryCalendar = TestProviderHelper.CalendarProvider.GetCalendar("USD"),
                SpotLag           = new Frequency("2b")
            };

            fxMatrix.Init(usd, ValDate, new Dictionary <Currency, double> {
                { zar, 20.0 }
            }, new List <FxPair> {
                fxPair
            }, new Dictionary <Currency, string> {
                { zar, "ZAR-IR" }, { usd, "USD-IR" }
            });
            var fModel = new FundingModel(ValDate, new[] { irCurveUsd, irCurveZar }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);

            fModel.SetupFx(fxMatrix);
            var fxSurface = new ConstantVolSurface(ValDate, 0.16);

            fModel.VolSurfaces.Add("USD/ZAR", fxSurface);
            var crudeCurve = new ConstantPriceCurve(100, ValDate, TestProviderHelper.CurrencyProvider)
            {
                Name     = "OIL",
                AssetId  = "OIL",
                Currency = usd
            };
            var crudeSurface = new ConstantVolSurface(ValDate, 0.32)
            {
                Name     = "OIL",
                AssetId  = "OIL",
                Currency = usd
            };
            var aModel = new AssetFxModel(ValDate, fModel);

            aModel.AddPriceCurve("OIL", crudeCurve);
            aModel.AddVolSurface("OIL", crudeSurface);
            aModel.CorrelationMatrix = new CorrelationMatrix(new[] { "OIL" }, new[] { "USD/ZAR" }, new double[][] { new [] { 0.5 } });
            return(aModel);
        }
Esempio n. 4
0
        public void FxForwardCurveFact()
        {
            var originDate = new DateTime(2019, 05, 28);
            var zar        = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR");
            var usd        = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var zarCurve   = new ConstantRateIrCurve(0.07, originDate, "ZARCurve", zar);
            var usdCurve   = new ConstantRateIrCurve(0.02, originDate, "USDCurve", usd);
            var fModel     = new FundingModel(originDate, new[] { zarCurve, usdCurve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);
            var fxMatrix   = new FxMatrix(TestProviderHelper.CurrencyProvider);
            var fxPair     = new FxPair {
                Domestic = zar, Foreign = usd, SpotLag = new Dates.Frequency("0d")
            };

            fxMatrix.Init(zar, originDate, new Dictionary <Currency, double> {
                { usd, 10.0 }
            }, new List <FxPair>()
            {
                fxPair
            }, new Dictionary <Currency, string> {
                { usd, "USDCurve" }, { zar, "ZARCurve" }
            });
            fModel.SetupFx(fxMatrix);
            var sut = new FxForwardCurve(originDate, fModel, zar, usd)
            {
                Name = "gooo",
            };
            var sut2 = new FxForwardCurve(originDate, new Func <Models.IFundingModel>(() => fModel), zar, usd);

            Assert.Equal(10, sut.GetPriceForDate(originDate));
            Assert.Equal(10, sut2.GetPriceForDate(originDate));
            Assert.Equal(10, sut.GetPriceForFixingDate(originDate));
            Assert.Equal(10, sut.GetAveragePriceForDates(new[] { originDate }));

            Assert.Equal("gooo", sut.Name);
            Assert.Equal(new Dictionary <string, IPriceCurve>(), sut.GetDeltaScenarios(0.0, null));
            Assert.Equal(PriceCurveType.Linear, sut.CurveType);
            Assert.True(sut.UnderlyingsAreForwards);
            Assert.Equal(0, sut.NumberOfPillars);
            Assert.Equal(usd.Ccy, sut.AssetId);
            Assert.Null(sut.PillarDates);

            Assert.Throws <NotImplementedException>(() => sut.RebaseDate(DateTime.Today));
            Assert.Throws <NotImplementedException>(() => sut.PillarDatesForLabel(""));
            Assert.Throws <Exception>(() => sut.Currency = null);
        }
Esempio n. 5
0
        public void CDSStripperFacts()
        {
            var origin = new DateTime(2020, 06, 15);
            var usd    = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var df     = new ConstantRateIrCurve(0.05, origin, "LIBOR", usd);

            var data = new Tuple <Frequency, double>[]
            {
                new Tuple <Frequency, double>(1.Years(), 0.01),
                new Tuple <Frequency, double>(2.Years(), 0.012),
                new Tuple <Frequency, double>(3.Years(), 0.013),
                new Tuple <Frequency, double>(4.Years(), 0.0135),
                new Tuple <Frequency, double>(5.Years(), 0.014),
            };

            var cdses = data.Select(d => new CDS()
            {
                Basis      = DayCountBasis.ACT365F,
                Currency   = usd,
                OriginDate = origin,
                Tenor      = d.Item1,
                Spread     = d.Item2,
                Notional   = 1e6
            }).ToList();

            foreach (var cds in cdses)
            {
                cds.Init();
            }

            var sut = new NewtonRaphsonCreditCurveSolver
            {
                UseSmallSteps = true
            };

            var hz = sut.Solve(cdses, 0.4, df, origin);

            var pz = cdses.Select(c => hz.GetSurvivalProbability(c.FinalSensitivityDate));

            foreach (var p in pz)
            {
                Assert.True(!double.IsNaN(p));
            }
        }
Esempio n. 6
0
        public void IrCurveFact()
        {
            var z = new ConstantRateIrCurve(0.1, DateTime.Today, "xxx", TestProviderHelper.CurrencyProvider.GetCurrency("USD"));

            Assert.Equal(0.1, z.GetForwardCCRate(DateTime.Today, DateTime.Today.AddDays(10)), 12);
            Assert.Equal(0.1, z.GetRates()[0]);
            Assert.Equal(0.2, z.SetRate(0, 0.2, false).GetRate(0));
            Assert.Equal(0.25, z.BumpRateFlat(0.15, false).GetRate(0));
            Assert.Equal(0.25, z.BumpRateFlat(0.15, true).GetRate(0));

            z.SetCollateralSpec("cooo");
            Assert.Equal("cooo", z.CollateralSpec);

            z.SetRateIndex(new FloatRateIndex {
                ResetTenor = new Dates.Frequency("7b")
            });
            Assert.Equal(7, z.RateIndex.ResetTenor.PeriodCount);

            Assert.Equal(Interpolator1DType.DummyPoint, z.InterpolatorType);
        }
Esempio n. 7
0
        public void CDSBasicFacts_LinearApprox()
        {
            var origin = new DateTime(2020, 06, 15);
            var hzi    = new ConstantHazzardInterpolator(0.0);
            var hz     = new HazzardCurve(origin, DayCountBasis.ACT365F, hzi);
            var usd    = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var df     = new ConstantRateIrCurve(0.00, origin, "LIBOR", usd);

            var sut = new CDS()
            {
                Basis      = DayCountBasis.ACT365F,
                Currency   = usd,
                OriginDate = origin,
                Tenor      = new Frequency("1y"),
                Spread     = 0.01,
                Notional   = 1e6
            };

            sut.Init();

            var pv = sut.PV_LinearApprox(hz, df, 0.4, false);

            Assert.Equal(-sut.Notional * sut.Spread, pv);
        }
Esempio n. 8
0
        //https://www.moodysanalytics.com/-/media/whitepaper/2014/2014-20-05-standardized-approach-for-capitalizing-counterparty-credit-risk-exposures.pdf
        //Example netting set #3
        public void MoodysTest1()
        {
            var usd       = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var origin    = DateTime.Parse("2019-02-05");
            var zeroCurve = new ConstantRateIrCurve(0.0, origin, "zero", usd);
            var fm        = new FundingModel(origin, new[] { zeroCurve }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);

            var model = new AssetFxModel(origin, fm);

            model.AddPriceCurve("Crude", new ConstantPriceCurve(100, origin, TestProviderHelper.CurrencyProvider));
            model.AddPriceCurve("Silver", new ConstantPriceCurve(10, origin, TestProviderHelper.CurrencyProvider));

            var assetToSetMap = new Dictionary <string, string>
            {
                { "Crude", "Energy" },
                { "Silver", "Metals" },
            };

            var tradeA = new Forward()
            {
                AssetId         = "Crude",
                ExpiryDate      = origin.AddDays(9 * 365 / 12.0),
                PaymentDate     = origin.AddDays(9 * 365 / 12.0),
                Notional        = 100000,
                Strike          = 100.5,
                PaymentCurrency = usd,
                DiscountCurve   = "zero",
                TradeId         = "tradeA"
            };
            var tradeB = new Forward()
            {
                AssetId         = "Crude",
                ExpiryDate      = origin.AddDays(2 * 365),
                PaymentDate     = origin.AddDays(2 * 365),
                Notional        = -200000,
                Strike          = 99.85,
                PaymentCurrency = usd,
                DiscountCurve   = "zero",
                TradeId         = "tradeB"
            };
            var tradeC = new Forward()
            {
                AssetId         = "Silver",
                ExpiryDate      = origin.AddDays(5 * 365),
                PaymentDate     = origin.AddDays(5 * 365),
                Notional        = 1000000,
                Strike          = 9.9,
                PaymentCurrency = usd,
                DiscountCurve   = "zero",
                TradeId         = "tradeC"
            };

            var pvA = tradeA.PV(model, false);
            var pvB = tradeB.PV(model, false);
            var pvC = tradeC.PV(model, false);

            var pf = new Portfolio()
            {
                Instruments = new List <IInstrument> {
                    tradeA, tradeB, tradeC
                }
            };
            var pvPf = pf.PV(model);

            Assert.Equal(20000.0, pvPf.GetAllRows().Sum(x => x.Value), 8);
            var epe = System.Math.Max(0, pvPf.SumOfAllRows);
            var ead = pf.SaCcrEAD(epe, model, usd, assetToSetMap);

            Assert.Equal(5408608, ead, 0);
        }