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")); }
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")); }
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); }
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); })); }
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)); }
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")); }
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")); }
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); })); }
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" })); }
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")); }
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); })); }
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); })); }
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); })); }
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); })); }
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); })); }
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); })); }
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")); }
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); })); }
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); })); }
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")); }
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); })); }
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")); }
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")); }
public void CreateFuturesPositionSwap() => Assert.Equal("futXXX¬0", InstrumentFunctions.CreateFuture("futXXX", DateTime.Today, "CO", "USD", 74, 1000, 1000, 1.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); })); }
public void CreateFuturesCrackDiffSwap() => Assert.Equal("fdswap¬0", InstrumentFunctions.CreateFutureCrackDiffSwap("fdswap", "COF9", "QSF9", "CO", "QS", "USD", -19, 1000, 7460, "DISCO"));