Exemplo n.º 1
0
        private IPvModel GenerateTestData()
        {
            Utils.Parallel.ParallelUtils.Instance.MultiThreaded = false;

            var usd = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var zar = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR");
            var nyc = TestProviderHelper.CalendarProvider.Collection["NYC"];

            var ins = new Forward
            {
                TradeId         = "TestA",
                AssetId         = "FakeAsset",
                ExpiryDate      = _originDate.AddDays(180),
                PaymentCurrency = zar,
                Notional        = 1e6,
                Strike          = 1400,
                DiscountCurve   = "DISCO-ZAR"
            };
            var pf = new Portfolio {
                Instruments = new List <IInstrument> {
                    ins
                }
            };
            var pillars = new[] { _originDate.AddDays(90), _originDate.AddDays(180) };

            var discoUsd = new IrCurve(pillars, pillars.Select(p => 0.02).ToArray(), _originDate, "DISCO-USD", Interpolator1DType.Linear, usd);
            var discoZar = new IrCurve(pillars, pillars.Select(p => 0.02).ToArray(), _originDate, "DISCO-ZAR", Interpolator1DType.Linear, zar);

            var fxpairs = new List <FxPair>
            {
                new FxPair {
                    Domestic = usd, Foreign = zar, PrimaryCalendar = nyc, SpotLag = 2.Bd()
                },
                new FxPair {
                    Domestic = zar, Foreign = usd, PrimaryCalendar = nyc, SpotLag = 2.Bd()
                },
            };
            var fxMatrix = new FxMatrix(TestProviderHelper.CurrencyProvider);

            fxMatrix.Init(usd, _originDate, new Dictionary <Currency, double> {
                { zar, 14.0 }
            }, fxpairs, new Dictionary <Currency, string> {
                { usd, "DISCO-USD" }, { zar, "DISCO-ZAR" }
            });

            var fModel = new FundingModel(_originDate, new[] { discoUsd, discoZar }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);

            fModel.SetupFx(fxMatrix);

            var model = new AssetFxModel(_originDate, fModel);

            var curve = new ConstantPriceCurve(100, _originDate, TestProviderHelper.CurrencyProvider);

            model.AddPriceCurve("FakeAsset", curve);
            model.AddFixingDictionary("FakeAsset", new FixingDictionary());
            model.AttachPortfolio(pf);
            return(model);
        }
Exemplo n.º 2
0
        public static object CreateAssetFxModel(
            [ExcelArgument(Description = "Object name")] string ObjectName,
            [ExcelArgument(Description = "Build date")] DateTime BuildDate,
            [ExcelArgument(Description = "Price curves")] object[] PriceCurves,
            [ExcelArgument(Description = "Vol surfaces")] object[] VolSurfaces,
            [ExcelArgument(Description = "Funding model")] object[] FundingModel,
            [ExcelArgument(Description = "Fixing dictionaries")] object[] Fixings,
            [ExcelArgument(Description = "Correlation matrix")] object[] CorrelationMatrix)
        {
            return(ExcelHelper.Execute(_logger, () =>
            {
                var curves = PriceCurves.GetAnyFromCache <IPriceCurve>();
                var fundingModel = FundingModel.GetAnyFromCache <IFundingModel>().First();
                var fixings = Fixings.GetAnyFromCache <IFixingDictionary>();
                var volSurfaces = VolSurfaces.GetAnyFromCache <IVolSurface>();
                var correlatinMatrix = CorrelationMatrix.GetAnyFromCache <ICorrelationMatrix>();

                var model = new AssetFxModel(BuildDate, fundingModel);

                foreach (var curve in curves)
                {
                    model.AddPriceCurve(curve.Name, curve);
                }
                foreach (var vs in volSurfaces)
                {
                    model.AddVolSurface(vs.Name, vs);
                }
                foreach (var f in fixings)
                {
                    model.AddFixingDictionary(f.Name, f);
                }

                if (correlatinMatrix.Any())
                {
                    model.CorrelationMatrix = correlatinMatrix.First();
                }

                return ExcelHelper.PushToCache <IAssetFxModel>(model, ObjectName);
            }));
        }
Exemplo n.º 3
0
        private (IAssetFxModel startModel, IAssetFxModel endModel, Portfolio portfolio) GenerateTestData()
        {
            Utils.Parallel.ParallelUtils.Instance.MultiThreaded = false;

            var usd = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var zar = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR");
            var nyc = TestProviderHelper.CalendarProvider.Collection["NYC"];

            var originDate = DateTime.Parse("2019-04-25");
            var ins        = new FxForward
            {
                TradeId              = "TestA",
                DeliveryDate         = originDate.AddDays(30),
                DomesticCCY          = zar,
                ForeignCCY           = usd,
                DomesticQuantity     = 1e6,
                Strike               = 14,
                ForeignDiscountCurve = "DISCO-USD"
            };
            var pf = new Portfolio {
                Instruments = new List <IInstrument> {
                    ins
                }
            };

            var discoUsd = new FlatIrCurve(0.02, usd, "DISCO-USD");
            var discoZar = new FlatIrCurve(0.05, zar, "DISCO-ZAR");
            var fxpairs  = new List <FxPair>
            {
                new FxPair {
                    Domestic = usd, Foreign = zar, PrimaryCalendar = nyc, SpotLag = 2.Bd()
                },
                new FxPair {
                    Domestic = zar, Foreign = usd, PrimaryCalendar = nyc, SpotLag = 2.Bd()
                },
            };
            var fxMatrix = new FxMatrix(TestProviderHelper.CurrencyProvider);

            fxMatrix.Init(zar, originDate, new Dictionary <Currency, double> {
                { usd, 14.0 }
            }, fxpairs, new Dictionary <Currency, string> {
                { usd, "DISCO-USD" }, { zar, "DISCO-ZAR" }
            });

            var fModel = new FundingModel(originDate, new[] { discoUsd, discoZar }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);

            fModel.SetupFx(fxMatrix);
            var startModel = new AssetFxModel(originDate, fModel);

            startModel.AddFixingDictionary("FakeAsset", new FixingDictionary());
            startModel.AddPriceCurve("FakeAsset", new ConstantPriceCurve(100, originDate, TestProviderHelper.CurrencyProvider));
            startModel.AddVolSurface("FakeAsset", new ConstantVolSurface(originDate, 1.00)
            {
                AssetId = "FakeAsset", Currency = usd
            });

            var endFModel = fModel.DeepClone();

            endFModel.FxMatrix.SpotRates[usd] = 15;
            var endModel = startModel.Clone(endFModel);

            endModel.AddFixingDictionary("FakeAsset", new FixingDictionary());
            endModel.AddPriceCurve("FakeAsset", new ConstantPriceCurve(100, originDate, TestProviderHelper.CurrencyProvider));
            endModel.AddVolSurface("FakeAsset", new ConstantVolSurface(originDate, 1.00)
            {
                AssetId = "FakeAsset", Currency = usd
            });
            return(startModel, endModel, pf);
        }
Exemplo n.º 4
0
        public void FixingsVolsCurvesFacts()
        {
            var fModel    = new Mock <IFundingModel>();
            var matrix    = new Mock <IFxMatrix>();
            var pair      = new FxPair();
            var dict      = new Mock <IFixingDictionary>();
            var surface   = new Mock <IVolSurface>();
            var surface2  = new Mock <IVolSurface>();
            var surfaceFx = new Mock <IVolSurface>();
            var curve     = new Mock <IPriceCurve>();

            curve.Setup(c => c.GetPriceForDate(DateTime.Today)).Returns(456.0);
            curve.Setup(c => c.GetPriceForFixingDate(DateTime.Today)).Returns(457.0);
            surface.Setup(s => s.AssetId).Returns("blah");
            surface2.Setup(s => s.AssetId).Returns("blah2");
            matrix.Setup(f => f.GetFxPair(It.IsAny <string>())).Returns(pair);
            fModel.Setup(f => f.GetFxRate(It.IsAny <DateTime>(), It.IsAny <Currency>(), It.IsAny <Currency>())).Returns(77.0);
            fModel.Setup(f => f.FxMatrix).Returns(matrix.Object);
            fModel.Setup(f => f.VolSurfaces).Returns(new Dictionary <string, IVolSurface> {
                { "bla/haa", surfaceFx.Object }
            });
            var sut = new AssetFxModel(DateTime.Today, fModel.Object);

            sut.AddPriceCurve("blah", curve.Object);
            sut.AddPriceCurves(new Dictionary <string, IPriceCurve> {
                { "blah2", curve.Object }
            });
            Assert.Same(curve.Object, sut.GetPriceCurve("blah"));
            Assert.Same(curve.Object, sut.GetPriceCurve("blah2"));

            sut.AddFixingDictionary("blah", dict.Object);
            sut.AddFixingDictionaries(new Dictionary <string, IFixingDictionary> {
                { "blah2", dict.Object }
            });
            Assert.Same(dict.Object, sut.GetFixingDictionary("blah"));
            Assert.Same(dict.Object, sut.GetFixingDictionary("blah2"));
            Assert.False(sut.TryGetFixingDictionary("wooo", out var flob));

            sut.AddVolSurface("blah", surface.Object);
            sut.AddVolSurfaces(new Dictionary <string, IVolSurface> {
                { "blah2", surface2.Object }
            });
            Assert.Same(surface.Object, sut.GetVolSurface("blah"));
            Assert.Same(surface2.Object, sut.GetVolSurface("blah2"));

            sut.GetVolForStrikeAndDate("blah", DateTime.Today, 123);
            surface.Verify(s => s.GetVolForAbsoluteStrike(123, DateTime.Today, 456), Times.Once);
            sut.GetVolForDeltaStrikeAndDate("blah", DateTime.Today, 123);
            surface.Verify(s => s.GetVolForDeltaStrike(123, DateTime.Today, 457.0), Times.Once);

            sut.GetAverageVolForStrikeAndDates("blah", new[] { DateTime.Today }, 123);
            surface.Verify(s => s.GetVolForAbsoluteStrike(123, DateTime.Today, 456), Times.Exactly(2));
            sut.GetAverageVolForMoneynessAndDates("blah", new[] { DateTime.Today }, 1.0);
            surface.Verify(s => s.GetVolForAbsoluteStrike(456, DateTime.Today, 456), Times.Exactly(2));

            sut.GetFxVolForStrikeAndDate("bla/haa", DateTime.Today, 123);
            surfaceFx.Verify(s => s.GetVolForAbsoluteStrike(123, DateTime.Today, 77), Times.Once);
            sut.GetFxVolForDeltaStrikeAndDate("bla/haa", DateTime.Today, 123);
            surfaceFx.Verify(s => s.GetVolForDeltaStrike(123, DateTime.Today, 77), Times.Once);

            sut.OverrideBuildDate(DateTime.MinValue);
            Assert.Equal(DateTime.MinValue, sut.BuildDate);
            sut.OverrideBuildDate(DateTime.Today);
        }