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); } } }
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); })); }