Esempio n. 1
0
        public void PortfolioPVFact()
        {
            InstrumentFunctions.CreateAsianSwap("swpFake", "Jan-19", "xx", "USD", 0.0, 0.0, "NYC", "NYC", "2b", "2b", Value, "disco", Value);

            var model = new Mock <IAssetFxModel>();

            model.Setup(m => m.GetPriceCurve("xx", null)).Returns(new ConstantPriceCurve(100, DateTime.Today, TestProviderHelper.CurrencyProvider));
            var fModel = new Mock <IFundingModel>();

            fModel.Setup(fm => fm.GetDf(It.IsAny <Currency>(), It.IsAny <DateTime>(), It.IsAny <DateTime>())).Returns(1.0);
            model.Setup(m => m.FundingModel).Returns(fModel.Object);

            ContainerStores.GetObjectCache <IAssetFxModel>().PutObject("model", new SessionItem <IAssetFxModel>()
            {
                Name = "model", Value = model.Object
            });

            Assert.Equal("Could not find portfolio or trade with name trd",
                         InstrumentFunctions.AssetPortfolioPV("out", "trd", "xxx", Value));

            Assert.Equal("Could not find model with name xxx",
                         InstrumentFunctions.AssetPortfolioPV("out", "swpFake", "xxx", Value));

            Assert.Equal("out¬0",
                         InstrumentFunctions.AssetPortfolioPV("out", "swpFake", "model", Value));

            Assert.Equal("out¬1",
                         InstrumentFunctions.AssetPortfolioPV("out", "swpFake", "model", "USD"));
        }
Esempio n. 2
0
        public void CreateBackpricingOptionFact()
        {
            Assert.Equal("Could not parse put/call flag - px",
                         InstrumentFunctions.CreateBackPricingOption("swp", "Jan-19", "xx", "ZAR", "px", 0.0, "xxx", "xxx", "2b", "2b", Value, "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateBackPricingOption("swp", "Jan-19", "xx", "ZAR", "P", 0.0, "xxx", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateBackPricingOption("swp", "Jan-19", "xx", "ZAR", "P", 0.0, "NYC", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Could not parse date generation type - zzzz",
                         InstrumentFunctions.CreateBackPricingOption("swp", "Jan-19", "xx", "ZAR", "P", 0.0, "NYC", "NYC", "2b", "2b", "zzzz", "disco"));

            Assert.Equal("BPopttt¬0",
                         InstrumentFunctions.CreateBackPricingOption("BPopttt", "Jan-19", "xx", "ZAR", "P", 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("BPoptttA¬0",
                         InstrumentFunctions.CreateBackPricingOption("BPoptttA", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.ToOADate() }
            }, "xx", "ZAR", "P", 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("BPoptttB¬0",
                         InstrumentFunctions.CreateBackPricingOption("BPoptttB", DateTime.Today.ToOADate(), "xx", "ZAR", "P", 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("BPoptttC¬0",
                         InstrumentFunctions.CreateBackPricingOption("BPoptttC", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.ToOADate(), DateTime.Today.ToOADate() }
            }, "xx", "ZAR", "P", 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));
        }
Esempio n. 3
0
        public void AssetPnLAttributionExplainWithActivityFacts()
        {
            InstrumentFunctions.CreateAsianSwap("swpFake", "Jan-19", "xx", "USD", 0.0, 0.0, "NYC", "NYC", "2b", "2b", Value, "disco", Value);

            var model = new Mock <IAssetFxModel>();

            ContainerStores.GetObjectCache <IAssetFxModel>().PutObject("model", new SessionItem <IAssetFxModel>()
            {
                Name = "model", Value = model.Object
            });

            var pnlAttribMock = new Mock <IPnLAttributor>();

            pnlAttribMock
            .Setup(p => p.ExplainAttribution(It.IsAny <Portfolio>(), It.IsAny <Portfolio>(), It.IsAny <IAssetFxModel>(), It.IsAny <IAssetFxModel>(), It.IsAny <Currency>(), It.IsAny <ICurrencyProvider>(), It.IsAny <bool>()))
            .Returns(new ResultCube());
            ContainerStores.PnLAttributor = pnlAttribMock.Object;

            Assert.Equal("Could not find portfolio or trade with name trdS",
                         InstrumentFunctions.AssetPnLAttributionExplainWithActivity("outzzy", "trdS", "trdE", "ms1", "ms2", "USD", false));

            Assert.Equal("Could not find portfolio or trade with name trdE",
                         InstrumentFunctions.AssetPnLAttributionExplainWithActivity("outzzy", "swpFake", "trdE", "ms1", "ms2", "USD", false));

            Assert.Equal("Could not find model with name ms1",
                         InstrumentFunctions.AssetPnLAttributionExplainWithActivity("outzzy", "swpFake", "swpFake", "ms1", "ms2", "USD", false));

            Assert.Equal("Could not find model with name ms2",
                         InstrumentFunctions.AssetPnLAttributionExplainWithActivity("outzzy", "swpFake", "swpFake", "model", "ms2", "USD", false));

            Assert.Equal("outzzy¬0",
                         InstrumentFunctions.AssetPnLAttributionExplainWithActivity("outzzy", "swpFake", "swpFake", "model", "model", "USD", false));

            pnlAttribMock.Verify(p => p.ExplainAttribution(It.IsAny <Portfolio>(), It.IsAny <Portfolio>(), It.IsAny <IAssetFxModel>(), It.IsAny <IAssetFxModel>(), It.IsAny <Currency>(), It.IsAny <ICurrencyProvider>(), It.IsAny <bool>()), Times.Once);
        }
Esempio n. 4
0
        public static object PortfolioTimeLadder(
            [ExcelArgument(Description = "Result object name")] string ResultObjectName,
            [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
            [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
            [ExcelArgument(Description = "Number of bumps (returns 2*N+1 values)")] int NScenarios,
            [ExcelArgument(Description = "Calendar, default ZAR")] object Calendar,
            [ExcelArgument(Description = "Risk metric to produce for each scenario")] object RiskMetric,
            [ExcelArgument(Description = "Return differential to base case, default True")] object ReturnDiff)
        {
            return(ExcelHelper.Execute(_logger, () =>
            {
                var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);

                var fCal = Calendar.OptionalExcel("ZAR");
                if (!ContainerStores.SessionContainer.GetService <ICalendarProvider>().Collection.TryGetCalendar(fCal, out var cal))
                {
                    _logger?.LogInformation("Calendar {calendar} not found in cache", fCal);
                    return $"Calendar {fCal} not found in cache";
                }

                if (!Enum.TryParse(RiskMetric.OptionalExcel("AssetCurveDelta"), out RiskMetric metric))
                {
                    throw new Exception($"Unknown risk metric {RiskMetric}");
                }

                var retDiff = ReturnDiff.OptionalExcel(true);

                var riskLadder = new TimeLadder(metric, NScenarios, cal, ContainerStores.CurrencyProvider, retDiff);
                var result = riskLadder.Generate(model, model.Portfolio);
                return PushCubeToCache(result, ResultObjectName);
            }));
        }
Esempio n. 5
0
        private static string ThetaCharm(string ResultObjectName, string PortfolioName, string ModelName, DateTime FwdValDate, string ReportingCcy, bool computeCharm, List <FxPair> fxPairs = null)
        {
            var model  = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
            var ccy    = ContainerStores.CurrencyProvider[ReportingCcy];
            var result = model.AssetThetaCharm(FwdValDate, ccy, ContainerStores.CurrencyProvider, computeCharm, fxPairs);

            return(PushCubeToCache(result, ResultObjectName));
        }
Esempio n. 6
0
        public void CreateEuropeanOptionFact()
        {
            Assert.Equal("Could not parse put/call flag - px",
                         InstrumentFunctions.CreateEuropeanOption("euOptt", DateTime.Today, "xx", "ZAR", 100.0, "px", 0.0, "xxx", "2b", "2b", "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateEuropeanOption("euOptt", DateTime.Today, "xx", "ZAR", 100.0, "P", 0.0, "xxx", "2b", "2b", "disco"));

            Assert.Equal("euOptt¬0",
                         InstrumentFunctions.CreateEuropeanOption("euOptt", DateTime.Today, "xx", "ZAR", 100.0, "P", 0.0, "NYC", "2b", "2b", "disco"));
        }
Esempio n. 7
0
 public void CreateFutureOptionPositionSwap()
 {
     Assert.Equal("Could not parse call/put flag xyxy",
                  InstrumentFunctions.CreateFutureOption("futOptXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, "xyxy", "xxxxx", "xxxx"));
     Assert.Equal("Could not parse option style flag xxxxx",
                  InstrumentFunctions.CreateFutureOption("futOptXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, "C", "xxxxx", "xxxx"));
     Assert.Equal("Could not parse margining type flag xxxx",
                  InstrumentFunctions.CreateFutureOption("futOptXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, "C", "European", "xxxx"));
     Assert.Equal("futOptXXX¬0",
                  InstrumentFunctions.CreateFutureOption("futOptXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, "C", "European", "FuturesStyle"));
 }
Esempio n. 8
0
 public static object PortfolioParallelDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX or MC model name")] string ModelName)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var result = model.AssetParallelDelta(ContainerStores.CurrencyProvider);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 9
0
        public void FilterPortfolioByNameFacts()
        {
            InstrumentFunctions.CreateAsianSwap("swpFake", "Jan-19", "xx", "USD", 0.0, 0.0, "NYC", "NYC", "2b", "2b", Value, "disco", Value);
            InstrumentFunctions.CreatePortfolio("pfOutK", new object[, ] {
                { "swpFake" }
            }, Value, Value, Value, Value);

            Assert.Equal("Portfolio hhhh not found",
                         InstrumentFunctions.FilterPortfolioByName("filterPfOutKk", "hhhh", new object[] { "swpFake" }));

            Assert.Equal("filterPfOutKk¬0",
                         InstrumentFunctions.FilterPortfolioByName("filterPfOutKk", "pfOutK", new object[] { "swpFake" }));
        }
Esempio n. 10
0
 public void CreateAsianCrackDiffSwap()
 {
     Assert.Equal("Calendar xxxP not found in cache",
                  InstrumentFunctions.CreateAsianCrackDiffSwap("cswp", "Jan-19", "xxP", "xxR", "ZAR", 0.0, 0.0, 0.0, "xxxP", "xxxR", "xxxPay", "2b", "2b", "2b", "disco"));
     Assert.Equal("Calendar xxxR not found in cache",
                  InstrumentFunctions.CreateAsianCrackDiffSwap("cswp", "Jan-19", "xxP", "xxR", "ZAR", 0.0, 0.0, 0.0, "NYC", "xxxR", "xxxPay", "2b", "2b", "2b", "disco"));
     Assert.Equal("Calendar xxxPay not found in cache",
                  InstrumentFunctions.CreateAsianCrackDiffSwap("cswp", "Jan-19", "xxP", "xxR", "ZAR", 0.0, 0.0, 0.0, "NYC", "NYC", "xxxPay", "2b", "2b", "2b", "disco"));
     Assert.Equal("cswp¬0",
                  InstrumentFunctions.CreateAsianCrackDiffSwap("cswp", "Jan-19", "xxP", "xxR", "ZAR", 0.0, 0.0, 0.0, "NYC", "NYC", "NYC", "2b", "2b", "2b", "disco"));
     Assert.Equal("ccswp¬0",
                  InstrumentFunctions.CreateAsianCrackDiffSwap("ccswp", (new DateTime(2019, 1, 1)).ToOADate(), "xxP", "xxR", "ZAR", 0.0, 0.0, 0.0, "NYC", "NYC", "NYC", "2b", "2b", "2b", "disco"));
 }
Esempio n. 11
0
 public static object PortfolioDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX or MC model name")] string ModelName,
     [ExcelArgument(Description = "Compute gamma, default false")] object ComputeGamma,
     [ExcelArgument(Description = "Parallel execution, default true")] object Parallelize)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var result = model.AssetDelta(ComputeGamma.OptionalExcel(false), Parallelize.OptionalExcel(true));
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 12
0
 public static object PortfolioCorrelationDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
     [ExcelArgument(Description = "Reporting currency")] string ReportingCcy,
     [ExcelArgument(Description = "Epsilon bump size, rho' = rho + epsilon * (1-rho)")] double Epsilon)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var ccy = ContainerStores.CurrencyProvider.GetCurrency(ReportingCcy);
         var result = model.CorrelationDelta(ccy, Epsilon);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 13
0
 public static object PortfolioVega(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX or MC model name")] string ModelName,
     [ExcelArgument(Description = "Reporting currency")] string ReportingCcy,
     [ExcelArgument(Description = "Parallel execution, default true")] object Parallelize)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var ccy = ContainerStores.CurrencyProvider[ReportingCcy];
         var result = model.AssetVega(ccy, Parallelize.OptionalExcel(true));
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 14
0
 public static object PortfolioIrDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
     [ExcelArgument(Description = "Optional reporting ccy")] string ReportingCurrency,
     [ExcelArgument(Description = "Bump size, default 0.0001")] object BumpSize)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var bump = BumpSize.OptionalExcel(0.0001);
         var repCCy = ContainerStores.CurrencyProvider.TryGetCurrency(ReportingCurrency, out var ccy) ? ccy : null;
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var result = model.AssetIrDelta(repCCy, bump);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 15
0
 public static object PortfolioIrBenchmarkDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
     [ExcelArgument(Description = "Funding instrument collection name")] string FICName,
     [ExcelArgument(Description = "Reporting currency")] string ReportingCcy)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var fic = ContainerStores.GetObjectCache <FundingInstrumentCollection>().GetObjectOrThrow(FICName, $"FIC {FICName} not found in cache");
         var ccy = ContainerStores.CurrencyProvider.GetCurrency(ReportingCcy);
         var result = model.BenchmarkRisk(fic.Value, ContainerStores.CurrencyProvider, ccy);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 16
0
        public static object PortfolioGreeks(
            [ExcelArgument(Description = "Result object name")] string ResultObjectName,
            [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
            [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
            [ExcelArgument(Description = "Fwd value date, usually T+1")] DateTime FwdValDate,
            [ExcelArgument(Description = "Reporting currency")] string ReportingCcy)
        {
            return(ExcelHelper.Execute(_logger, () =>
            {
                var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);

                var ccy = ContainerStores.CurrencyProvider.GetCurrency(ReportingCcy);
                var result = model.AssetGreeks(FwdValDate, ccy, ContainerStores.CurrencyProvider).Result;
                return PushCubeToCache(result, ResultObjectName);
            }));
        }
Esempio n. 17
0
        public void CreateAmericanBarrierOptionFact()
        {
            Assert.Equal("Could not parse barrier side bs",
                         InstrumentFunctions.CreateAmericanBarrierOption("swp", "xx", DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, "ZAR", "px", 0.0, 100.0, 110.0, "bs", "bt", "disco", "2b", "nocal"));

            Assert.Equal("Could not parse barrier type bt",
                         InstrumentFunctions.CreateAmericanBarrierOption("swp", "xx", DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, "ZAR", "px", 0.0, 100.0, 110.0, "Up", "bt", "disco", "2b", "nocal"));

            Assert.Equal("Could not parse put/call flag - px",
                         InstrumentFunctions.CreateAmericanBarrierOption("swp", "xx", DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, "ZAR", "px", 0.0, 100.0, 110.0, "Up", "KO", "disco", "2b", "nocal"));

            Assert.Equal("Calendar nocal not found in cache",
                         InstrumentFunctions.CreateAmericanBarrierOption("swp", "xx", DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, "ZAR", "P", 0.0, 100.0, 110.0, "Up", "KO", "disco", "2b", "nocal"));

            Assert.Equal("ambo¬0",
                         InstrumentFunctions.CreateAmericanBarrierOption("ambo", "xx", DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, "ZAR", "P", 0.0, 100.0, 110.0, "Up", "KO", "disco", "2b", "NYC"));
        }
Esempio n. 18
0
 public static object PortfolioFxDelta(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX or MC model name")] string ModelName,
     [ExcelArgument(Description = "Home currency, e.g. ZAR")] string HomeCcy,
     [ExcelArgument(Description = "Compute gamma, default false")] object ComputeGamma,
     [ExcelArgument(Description = "Report delta on opposite side of pair, default true")] object InverseDelta)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var gamma = ComputeGamma.OptionalExcel(false);
         var inverseD = InverseDelta.OptionalExcel(true);
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var ccy = ContainerStores.CurrencyProvider[HomeCcy];
         var result = model.FxDelta(ccy, ContainerStores.CurrencyProvider, gamma, inverseD);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 19
0
 public static object PortfolioFxDeltaSpecific(
     [ExcelArgument(Description = "Result object name")] string ResultObjectName,
     [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
     [ExcelArgument(Description = "Asset-FX or MC model name")] string ModelName,
     [ExcelArgument(Description = "Pairs to bump")] object[] PairsToBump,
     [ExcelArgument(Description = "Home currency, e.g. ZAR")] string HomeCcy,
     [ExcelArgument(Description = "Compute gamma, default false")] object ComputeGamma)
 {
     return(ExcelHelper.Execute(_logger, () =>
     {
         var gamma = ComputeGamma.OptionalExcel(false);
         var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);
         var ccy = ContainerStores.CurrencyProvider[HomeCcy];
         var pairsToBumpStr = PairsToBump.ObjectRangeToVector <string>();
         var pairsToBump = pairsToBumpStr.Select(p => p.FxPairFromString(ContainerStores.CurrencyProvider, ContainerStores.CalendarProvider)).ToList();
         var result = model.FxDeltaSpecific(ccy, pairsToBump, ContainerStores.CurrencyProvider, gamma);
         return PushCubeToCache(result, ResultObjectName);
     }));
 }
Esempio n. 20
0
        public void CreateMultiPeriodBackpricingOptionFact()
        {
            Assert.Equal("Could not parse put/call flag - px",
                         InstrumentFunctions.CreateMultiPeriodBackPricingOption("swp", "Jan-19", DateTime.Today, DateTime.Today, "xx", "ZAR", "px", 0.0, "xxx", "2b", Value, "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateMultiPeriodBackPricingOption("swp", "Jan-19", DateTime.Today, DateTime.Today, "xx", "ZAR", "P", 0.0, "xxx", "2b", Value, "disco"));

            Assert.Equal("Could not parse date generation type - zzzz",
                         InstrumentFunctions.CreateMultiPeriodBackPricingOption("swp", "Jan-19", DateTime.Today, DateTime.Today, "xx", "ZAR", "P", 0.0, "NYC", "2b", "zzzz", "disco"));

            Assert.Equal("Period dates must be a Nx2 range",
                         InstrumentFunctions.CreateMultiPeriodBackPricingOption("mbpOptA", "Jan-19", DateTime.Today, DateTime.Today, "xx", "ZAR", "P", 0.0, "NYC", "2b", Value, "disco"));

            Assert.Equal("mbpOptA¬0",
                         InstrumentFunctions.CreateMultiPeriodBackPricingOption("mbpOptA", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.ToOADate() }
            }, DateTime.Today, DateTime.Today, "xx", "ZAR", "P", 0.0, "NYC", "2b", Value, "disco"));
        }
Esempio n. 21
0
        public static object PortfolioRiskLadder(
            [ExcelArgument(Description = "Result object name")] string ResultObjectName,
            [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
            [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
            [ExcelArgument(Description = "Asset Id to bump")] string AssetId,
            [ExcelArgument(Description = "Bump type, defualt FlatShift")] object BumpType,
            [ExcelArgument(Description = "Number of bumps (returns 2*N+1 values)")] int NScenarios,
            [ExcelArgument(Description = "Bump step size")] double BumpStep,
            [ExcelArgument(Description = "Risk metric to produce for each scenario")] object RiskMetric,
            [ExcelArgument(Description = "Return differential to base case, default True")] object ReturnDiff)
        {
            return(ExcelHelper.Execute(_logger, () =>
            {
                var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);

                if (!Enum.TryParse(BumpType.OptionalExcel("FlatShift"), out MutationType bType))
                {
                    throw new Exception($"Unknown bump/mutation type {BumpType}");
                }
                if (!Enum.TryParse(RiskMetric.OptionalExcel("AssetCurveDelta"), out RiskMetric metric))
                {
                    throw new Exception($"Unknown risk metric {RiskMetric}");
                }

                var retDiff = ReturnDiff.OptionalExcel(true);
                var isFx = AssetId.Length == 7 && AssetId[3] == '/';
                ICube result;

                if (isFx)
                {
                    var ccy = ContainerStores.CurrencyProvider.GetCurrency(AssetId.Substring(0, 3));
                    var riskLadder = new RiskLadder(ccy, bType, metric, BumpStep, NScenarios, retDiff);
                    result = riskLadder.Generate(model, model.Portfolio);
                }
                else
                {
                    var riskLadder = new RiskLadder(AssetId, bType, metric, BumpStep, NScenarios, retDiff);
                    result = riskLadder.Generate(model, model.Portfolio);
                }

                return PushCubeToCache(result, ResultObjectName);
            }));
        }
Esempio n. 22
0
        public void CreateMonthlyAsianSwapFact()
        {
            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, 0.0, "xxx", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, 0.0, "NYC", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Could not parse date generation type - sqw",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, 0.0, "NYC", "NYC", "2b", "2b", "sqw", "disco"));

            Assert.Equal("swppp1¬0",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swppp1", "Jan-19", "xx", "ZAR", 0.0, 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("swppq1¬0",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swppq1", DateTime.Today.ToOADate(), "xx", "ZAR", 0.0, 0.0, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("swppz1¬0",
                         InstrumentFunctions.CreateMonthlyAsianSwap("swppz1", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.AddDays(100).ToOADate() }
            }, "xx", "ZAR", 0.0, 0.0, "NYC", "NYC", "2b", "2b", "BusinessDays", "disco"));
        }
Esempio n. 23
0
        public void CreateCustomAsianSwapFact()
        {
            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateCustomAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, new[] { 0.0 }, "xxx", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Calendar xxx not found in cache",
                         InstrumentFunctions.CreateCustomAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, new[] { 0.0 }, "NYC", "xxx", "2z", "2f", Value, "disco"));

            Assert.Equal("Could not parse date generation type - sqw",
                         InstrumentFunctions.CreateCustomAsianSwap("swp", "Jan-19", "xx", "ZAR", 0.0, new[] { 0.0 }, "NYC", "NYC", "2b", "2b", "sqw", "disco"));

            Assert.Equal("Expecting a Nx2 array of period dates",
                         InstrumentFunctions.CreateCustomAsianSwap("swppp", "Jan-19", "xx", "ZAR", 0.0, new[] { 0.0 }, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("Number of notionals must match number of periods",
                         InstrumentFunctions.CreateCustomAsianSwap("swppp", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.ToOADate() }
            }, "xx", "ZAR", 0.0, new[] { 0.0, 0.0 }, "NYC", "NYC", "2b", "2b", Value, "disco"));

            Assert.Equal("swppp¬0",
                         InstrumentFunctions.CreateCustomAsianSwap("swppp", new object[, ] {
                { DateTime.Today.ToOADate(), DateTime.Today.ToOADate() }
            }, "xx", "ZAR", 0.0, new[] { 0.0 }, "NYC", "NYC", "2b", "2b", Value, "disco"));
        }
Esempio n. 24
0
 public void CreateFuturesPositionSwap() => Assert.Equal("futXXX¬0",
                                                         InstrumentFunctions.CreateFuture("futXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, 1.0));
Esempio n. 25
0
        public static object PortfolioRiskMatrix(
            [ExcelArgument(Description = "Result object name")] string ResultObjectName,
            [ExcelArgument(Description = "Portolio object name")] string PortfolioName,
            [ExcelArgument(Description = "Asset-FX model name")] string ModelName,
            [ExcelArgument(Description = "Asset Id to bump")] string AssetId,
            [ExcelArgument(Description = "Currency to bump")] string Currency,
            [ExcelArgument(Description = "Bump type, defualt FlatShift")] object BumpType,
            [ExcelArgument(Description = "Number of bumps (returns 2*N+1 values)")] int NScenarios,
            [ExcelArgument(Description = "Bump step size asset")] double BumpStepAsset,
            [ExcelArgument(Description = "Bump step size fx")] double BumpStepFx,
            [ExcelArgument(Description = "Risk metric to produce for each scenario")] object RiskMetric,
            [ExcelArgument(Description = "Return differential to base case, default True")] object ReturnDiff,
            [ExcelArgument(Description = "List of FxPairs for fx metrics")] object[] PairsToRisk)
        {
            return(ExcelHelper.Execute(_logger, () =>
            {
                var model = InstrumentFunctions.GetModelFromCache(ModelName, PortfolioName);

                if (!Enum.TryParse(BumpType.OptionalExcel("FlatShift"), out MutationType bType))
                {
                    throw new Exception($"Unknown bump/mutation type {BumpType}");
                }
                if (!Enum.TryParse(RiskMetric.OptionalExcel("AssetCurveDelta"), out RiskMetric metric))
                {
                    throw new Exception($"Unknown risk metric {RiskMetric}");
                }
                var retDiff = ReturnDiff.OptionalExcel(true);


                var isFxFx = AssetId.Length == 7 && AssetId[3] == '/' &&
                             Currency.Length == 7 && Currency[3] == '/';

                ICube result = null;
                if (isFxFx)
                {
                    var pair1 = Currency.FxPairFromString(ContainerStores.CurrencyProvider, ContainerStores.CalendarProvider);
                    var pair2 = AssetId.FxPairFromString(ContainerStores.CurrencyProvider, ContainerStores.CalendarProvider);
                    var riskMatrix = new RiskMatrix(pair2, pair1, bType, metric, BumpStepAsset, BumpStepFx, NScenarios, ContainerStores.CurrencyProvider, retDiff);

                    if (PairsToRisk != null && PairsToRisk.Any())
                    {
                        riskMatrix.FxPairsForDelta = PairsToRisk.ObjectRangeToVector <string>()
                                                     .Select(x => x.FxPairFromString(ContainerStores.CurrencyProvider, ContainerStores.CalendarProvider))
                                                     .ToList();
                    }

                    result = riskMatrix.Generate(model, model.Portfolio);
                }
                else
                {
                    var ccy = ContainerStores.CurrencyProvider.GetCurrency(Currency);
                    var riskMatrix = new RiskMatrix(AssetId, ccy, bType, metric, BumpStepAsset, BumpStepFx, NScenarios, ContainerStores.CurrencyProvider, retDiff);

                    if (PairsToRisk != null && PairsToRisk.Any())
                    {
                        riskMatrix.FxPairsForDelta = PairsToRisk.ObjectRangeToVector <string>()
                                                     .Select(x => x.FxPairFromString(ContainerStores.CurrencyProvider, ContainerStores.CalendarProvider))
                                                     .ToList();
                    }

                    result = riskMatrix.Generate(model, model.Portfolio);
                }

                return PushCubeToCache(result, ResultObjectName);
            }));
        }
Esempio n. 26
0
 public void CreateFuturesCrackDiffSwap() => Assert.Equal("fdswap¬0",
                                                          InstrumentFunctions.CreateFutureCrackDiffSwap("fdswap", "COF9", "QSF9", "CO", "QS", "USD", -19, 1000, 7460, "DISCO"));