Exemplo n.º 1
0
        public void BasicRiskMatrixFacts()
        {
            var model = GenerateTestData();
            var zar   = TestProviderHelper.CurrencyProvider.GetCurrency("ZAR");
            var usd   = TestProviderHelper.CurrencyProvider.GetCurrency("USD");
            var rm    = new RiskMatrix("FakeAsset", zar, MutationType.FlatShift, RiskMetric.FxDelta, 10, 0.1, 2, TestProviderHelper.CurrencyProvider, true)
            {
                FxPairsForDelta = new List <FxPair>()
                {
                    new FxPair()
                    {
                        Domestic = zar, Foreign = usd
                    }
                }
            };
            var cube = rm.Generate(model);

            foreach (var row in cube.GetAllRows())
            {
                if ((string)row.MetaData[5] == "FakeAsset~0" && (string)row.MetaData[6] == "ZAR~0")
                {
                    Assert.Equal(0.0, row.Value);
                }
            }
        }
Exemplo n.º 2
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);
            }));
        }