public static object PortfolioPvCcrCapital_B2_SM( [ExcelArgument(Description = "Hazzard curve")] string HazzardCurveName, [ExcelArgument(Description = "Discount curve")] string DiscountCurve, [ExcelArgument(Description = "Portfolio")] string Portfolio, [ExcelArgument(Description = "Asset-FX Model")] string Model, [ExcelArgument(Description = "Loss-given-default, e.g. 0.4")] double LGD, [ExcelArgument(Description = "Reporting currency")] string Currency, [ExcelArgument(Description = "Exposure dates")] double[] ExposureDates, [ExcelArgument(Description = "AssetId to Category map")] object[,] AssetIdToCategoryMap, [ExcelArgument(Description = "Category to CCF map")] object[,] CategoryToCCFMap) { return(ExcelHelper.Execute(_logger, () => { var hz = ContainerStores.GetObjectCache <HazzardCurve>().GetObjectOrThrow(HazzardCurveName, $"Hazzard curve {HazzardCurveName} not found"); var disc = ContainerStores.GetObjectCache <IIrCurve>().GetObjectOrThrow(DiscountCurve, $"Discount curve {DiscountCurve} not found"); var portfolio = Instruments.InstrumentFunctions.GetPortfolioOrTradeFromCache(Portfolio); var model = ContainerStores.GetObjectCache <IAssetFxModel>().GetObjectOrThrow(Model, $"Asset-FX model {Model} not found"); var repCcy = ContainerStores.CurrencyProvider.GetCurrency(Currency); var expDates = ExposureDates.ToDateTimeArray(model.Value.BuildDate); var models = new IAssetFxModel[expDates.Length]; var m = model.Value.Clone(); for (var i = 0; i < models.Length; i++) { m = m.RollModel(expDates[i], ContainerStores.CurrencyProvider); models[i] = m; } var assetIdToCategory = AssetIdToCategoryMap.RangeToDictionary <string, string>(); var categoryToCCF = CategoryToCCFMap.RangeToDictionary <string, double>(); var result = CapitalCalculator.PvCcrCapital_BII_SM(model.Value.BuildDate, expDates, models, portfolio, hz.Value, repCcy, disc.Value, LGD, assetIdToCategory, categoryToCCF, ContainerStores.CurrencyProvider); return result; })); }
public IPvModel Rebuild(IAssetFxModel newVanillaModel, Portfolio portfolio) { var m = newVanillaModel.Clone(); m.AttachPortfolio(portfolio); return(m); }
public static IVolSurface GenerateCompositeSurface(this IAssetFxModel model, string AssetId, string FxPair, int numSamples, double correlation, bool newMethod = false) { var inSurface = model.GetVolSurface(AssetId); var inFxSurface = model.FundingModel.GetVolSurface(FxPair); var priceCurve = model.GetPriceCurve(AssetId); var fxPair = model.FundingModel.FxMatrix.GetFxPair(FxPair); var compoInterpolators = new Dictionary <DateTime, IInterpolator1D>(); var fwds = new Dictionary <DateTime, double>(); var locker = new object(); ParallelUtils.Instance.Foreach(inSurface.Expiries, expiry => { var assetFwd = priceCurve.GetPriceForFixingDate(expiry); var fxFwd = model.FundingModel.GetFxRate(fxPair.SpotDate(expiry), FxPair); var compoSmile = newMethod ? GenerateCompositeSmile(inSurface, inFxSurface, numSamples, expiry, assetFwd, fxFwd, correlation, true) : GenerateCompositeSmileBasic(inSurface, inFxSurface, numSamples, expiry, assetFwd, fxFwd, correlation, true); lock (locker) { compoInterpolators.Add(expiry, compoSmile); fwds.Add(expiry, assetFwd * fxFwd); } }).Wait(); var ATMs = compoInterpolators.OrderBy(x => x.Key).Select(x => x.Value.Interpolate(0.5)).ToArray(); var wingDeltas = new[] { 0.25, 0.1 }; var riskies = compoInterpolators.OrderBy(x => x.Key).Select(x => wingDeltas.Select(w => x.Value.Interpolate(1 - w) - x.Value.Interpolate(w)).ToArray()).ToArray(); var flies = compoInterpolators.OrderBy(x => x.Key).Select(x => wingDeltas.Select(w => (x.Value.Interpolate(1 - w) + x.Value.Interpolate(w)) / 2.0 - x.Value.Interpolate(0.5)).ToArray()).ToArray(); var outSurface = new RiskyFlySurface(model.BuildDate, ATMs, inSurface.Expiries, wingDeltas, riskies, flies, fwds.OrderBy(x => x.Key).Select(x => x.Value).ToArray(), WingQuoteType.Simple, AtmVolType.ZeroDeltaStraddle, Interpolator1DType.GaussianKernel, Interpolator1DType.LinearInVariance); return(outSurface); }
public string[] IrCurves(IAssetFxModel model) { if (IsFx) { var ccys = AssetId.Split('/'); var c1 = model.FundingModel.FxMatrix.GetDiscountCurve(ccys[0]); var c2 = model.FundingModel.FxMatrix.GetDiscountCurve(ccys[1]); return((new[] { DiscountCurve, c1, c2 }).Distinct().Where(x => !string.IsNullOrWhiteSpace(x)).ToArray()); } else { if (string.IsNullOrEmpty(FxPair(model))) { return new[] { DiscountCurve } } ; else { var fxCurve = model.FundingModel.FxMatrix.DiscountCurveMap[PaymentCurrency]; var assetCurveCcy = model.GetPriceCurve(AssetId).Currency; var assetCurve = model.FundingModel.FxMatrix.DiscountCurveMap[assetCurveCcy]; return((new[] { DiscountCurve, fxCurve, assetCurve }).Distinct().ToArray()); } } }
public string[] IrCurves(IAssetFxModel model) { if (IsFx) { var ccys = AssetId.Split('/'); var c1 = model.FundingModel.FxMatrix.GetDiscountCurve(ccys[0]); var c2 = model.FundingModel.FxMatrix.GetDiscountCurve(ccys[1]); return((new[] { DiscountCurve, c1, c2 }).Distinct().ToArray()); } else { if (FxConversionType == FxConversionType.None) { return new[] { DiscountCurve } } ; else { var fxCurve = model.FundingModel.FxMatrix.DiscountCurveMap[PaymentCurrency]; var assetCurveCcy = model.GetPriceCurve(AssetId).Currency; var assetCurve = model.FundingModel.FxMatrix.DiscountCurveMap[assetCurveCcy]; return((new[] { DiscountCurve, fxCurve, assetCurve }).Distinct().ToArray()); } } }
public static object PortfolioPvCvaCapital_B2_SM( [ExcelArgument(Description = "Discount curve")] string DiscountCurve, [ExcelArgument(Description = "Portfolio")] string Portfolio, [ExcelArgument(Description = "Asset-FX Model")] string Model, [ExcelArgument(Description = "Reporting currency")] string Currency, [ExcelArgument(Description = "EPE cube")] string EPECube, [ExcelArgument(Description = "Party risk weight")] double CvaRiskWeight, [ExcelArgument(Description = "AssetId to Category map")] object[,] AssetIdToCategoryMap, [ExcelArgument(Description = "Category to CCF map")] object[,] CategoryToCCFMap) { return(ExcelHelper.Execute(_logger, () => { var epeCube = ContainerStores.GetObjectCache <ICube>().GetObjectOrThrow(EPECube, $"EPE cube {EPECube} not found"); var disc = ContainerStores.GetObjectCache <IIrCurve>().GetObjectOrThrow(DiscountCurve, $"Discount curve {DiscountCurve} not found"); var portfolio = Instruments.InstrumentFunctions.GetPortfolioOrTradeFromCache(Portfolio); var model = ContainerStores.GetObjectCache <IAssetFxModel>().GetObjectOrThrow(Model, $"Asset-FX model {Model} not found"); var repCcy = ContainerStores.CurrencyProvider.GetCurrency(Currency); var expDates = epeCube.Value.GetAllRows().Select(r => (DateTime)r.MetaData[0]).ToArray(); var epeValues = epeCube.Value.GetAllRows().Select(r => r.Value).ToArray(); var models = new IAssetFxModel[expDates.Length]; var m = model.Value.TrimModel(portfolio); for (var i = 0; i < models.Length; i++) { m = m.RollModel(expDates[i], ContainerStores.CurrencyProvider); models[i] = m; } var assetIdToCategory = AssetIdToCategoryMap.RangeToDictionary <string, string>(); var categoryToCCF = CategoryToCCFMap.RangeToDictionary <string, double>(); var result = CapitalCalculator.PvCvaCapital_BII_SM(model.Value.BuildDate, expDates, models, portfolio, repCcy, disc.Value, CvaRiskWeight, assetIdToCategory, categoryToCCF, ContainerStores.CurrencyProvider, epeValues); return result; })); }
public static object PortfolioExpectedEadSplit( [ExcelArgument(Description = "Output cube name")] string OutputName, [ExcelArgument(Description = "Portfolio")] string Portfolio, [ExcelArgument(Description = "Asset-FX Model")] string Model, [ExcelArgument(Description = "Reporting currency")] string Currency, [ExcelArgument(Description = "EPE cube")] string EPECube, [ExcelArgument(Description = "AssetId to Category map")] object[,] AssetIdToCategoryMap, [ExcelArgument(Description = "Category to CCF map")] object[,] CategoryToCCFMap, [ExcelArgument(Description = "Basel II / Basel II cutover date")] DateTime ChangeOverDate) { return(ExcelHelper.Execute(_logger, () => { var epeCube = ContainerStores.GetObjectCache <ICube>().GetObjectOrThrow(EPECube, $"EPE cube {EPECube} not found"); var portfolio = Instruments.InstrumentFunctions.GetPortfolioOrTradeFromCache(Portfolio); var model = ContainerStores.GetObjectCache <IAssetFxModel>().GetObjectOrThrow(Model, $"Asset-FX model {Model} not found"); var repCcy = ContainerStores.CurrencyProvider.GetCurrency(Currency); var expDates = epeCube.Value.GetAllRows().Select(r => (DateTime)r.MetaData[0]).ToArray(); var epeValues = epeCube.Value.GetAllRows().Select(r => r.Value).ToArray(); var models = new IAssetFxModel[expDates.Length]; var m = model.Value.TrimModel(portfolio); for (var i = 0; i < models.Length; i++) { m = m.RollModel(expDates[i], ContainerStores.CurrencyProvider); models[i] = m; } var assetIdToCategory = AssetIdToCategoryMap.RangeToDictionary <string, string>(); var categoryToCCF = CategoryToCCFMap.RangeToDictionary <string, double>(); var result = CapitalCalculator.EAD_Split(model.Value.BuildDate, expDates, epeValues, models, portfolio, repCcy, assetIdToCategory, categoryToCCF, ChangeOverDate, ContainerStores.CurrencyProvider); var cube = ExcelHelper.PackResults(expDates, result, "EAD"); return ExcelHelper.PushToCache(cube, OutputName); })); }
public static double SolveStrikeForPV(this Portfolio portfolio, IAssetFxModel model, double targetPV) { var insList = portfolio.Instruments.Select(x => x as IAssetInstrument).ToList(); if (insList.Any(x => x == null)) { throw new Exception("Not all instruments in the portfolio implement IAssetInstrument"); } var targetFunc = new Func <double, double>(k => { var newPf = new Portfolio() { Instruments = insList.Select(i => (IInstrument)i.SetStrike(k)).ToList() }; var pv = newPf.PV(model).GetAllRows().Sum(x => x.Value); return(pv - targetPV); }); var firstGuess = insList.Average(i => i.ParRate(model)); var solvedStrike = Math.Solvers.Newton1D.MethodSolve(targetFunc, firstGuess, 1e-8, 1000, 1e-9); if (System.Math.Abs(targetFunc(solvedStrike)) < 1e-8) { return(solvedStrike); } else { throw new Exception("Failed to find solution after 1000 itterations"); } }
public string[] IrCurves(IAssetFxModel model) => new[] { ForeignDiscountCurve, model.FundingModel.FxMatrix.DiscountCurveMap[ForeignCCY], model.FundingModel.FxMatrix.DiscountCurveMap[DomesticCCY] } .Distinct() .ToArray();
public static IAssetFxModel FxSpotShift(Currency ccy, double shiftSize, IAssetFxModel model) { var o = model.Clone(); var spot = model.FundingModel.FxMatrix.GetSpotRate(ccy); o.FundingModel.FxMatrix.SpotRates[ccy] = spot + shiftSize; return(o); }
internal double Fwd(IAssetFxModel model) { var fxRate = model.GetPriceCurve(AssetId).Currency == Currency ? 1.0 : model.FundingModel.GetFxAverage(FixingDates, model.GetPriceCurve(AssetId).Currency, Currency); return(model.GetPriceCurve(AssetId).GetAveragePriceForDates(FixingDates) * fxRate); }
public double PV(IAssetFxModel model) { var date = model.BuildDate.AddPeriod(RollType.F, SettleCalendar, SettleLag); var curve = model.GetPriceCurve(AssetId, PaymentCurrency); var fwd = curve.GetPriceForDate(date); var fx = curve.Currency == PaymentCurrency ? 1.0 : model.FundingModel.GetFxRate(LastSensitivityDate, curve.Currency, PaymentCurrency); return(fwd * Notional * ScalingFactor * fx); }
public List <CashFlow> ExpectedCashFlows(IAssetFxModel model) => new List <CashFlow> { new CashFlow() { Currency = Currency, SettleDate = MaturityDate, Notional = Notional, Fv = Notional } };
public ExpectedCapitalCalculator(Portfolio portfolio, double counterpartyRiskWeight, Dictionary <string, string> assetIdToGroupMap, Currency reportingCurrency, IAssetFxModel assetFxModel, DateTime[] calculationDates) { _portfolio = portfolio; _counterpartyRiskWeight = counterpartyRiskWeight; _assetIdToGroupMap = assetIdToGroupMap; _reportingCurrency = reportingCurrency; _assetFxModel = assetFxModel; _calculationDates = calculationDates; _assetIds = _portfolio.AssetIds().Concat(_portfolio.FxPairs(assetFxModel)).ToArray(); }
public EADCalculator(Portfolio portfolio, double counterpartyRiskWeight, Dictionary <string, string> assetIdToGroupMap, Currency reportingCurrency, IAssetFxModel assetFxModel, DateTime[] calculationDates, ICurrencyProvider currencyProvider) { _portfolio = portfolio; _counterpartyRiskWeight = counterpartyRiskWeight; _assetIdToGroupMap = assetIdToGroupMap; _reportingCurrency = reportingCurrency; _assetFxModel = assetFxModel; _calculationDates = calculationDates; _currencyProvider = currencyProvider; _endDate = portfolio.LastSensitivityDate; }
public IInterpolator1D[] Regress(IAssetFxModel model) { if (_regressors != null) { return(_regressors); } var o = new IInterpolator1D[_dateIndexes.Length]; var nPaths = _pathwiseValues.First().Length; var finalSchedules = _portfolio.Select(x => x.ExpectedFlowsByPath(model)).ToArray(); ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { var exposureDate = _regressionDates[d]; var sortedFinalValues = new KeyValuePair <double, double> [nPaths]; for (var p = 0; p < nPaths; p++) { var finalValue = 0.0; foreach (var schedule in finalSchedules) { foreach (var flow in schedule[p].Flows) { if (flow.SettleDate > exposureDate) { finalValue += flow.Pv; } } } sortedFinalValues[p] = new KeyValuePair <double, double>(_pathwiseValues[d][p], finalValue); } sortedFinalValues = sortedFinalValues.OrderBy(q => q.Key).ToArray(); if (_requireContinuity) { o[d] = SegmentedLinearRegression.Regress(sortedFinalValues.Select(x => x.Key).ToArray(), sortedFinalValues.Select(y => y.Value).ToArray(), 5); } else { o[d] = SegmentedLinearRegression.RegressNotContinuous(sortedFinalValues.Select(x => x.Key).ToArray(), sortedFinalValues.Select(y => y.Value).ToArray(), 5); } if (DebugMode) { DumpDataToDisk(sortedFinalValues, o[d], $@"C:\temp\regData{d}.csv"); } }).Wait(); _regressors = o; return(o); }
public double[] ENE(IAssetFxModel model) { var o = new double[_dateIndexes.Length]; var regressors = Regress(model); ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { o[d] = _pathwiseValues[d].Select(p => Min(0, regressors[d].Interpolate(p))).OrderBy(x => x).Average(); o[d] /= model.FundingModel.GetDf(_repCcy, model.BuildDate, _regressionDates[d]); }).Wait(); return(o); }
public double[] EPE(IAssetFxModel model) { var o = new double[_dateIndexes.Length]; var regressors = Regress(model); var nPaths = _pathwiseValues.First().Length; ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { o[d] = _pathwiseValues[d].Select(p => Max(0, regressors[d].Regress(p))).Average(); o[d] /= model.FundingModel.GetDf(_repCcy, model.BuildDate, _regressionDates[d]); }).Wait(); return(o); }
public MultipleLinearRegressor[] Regress(IAssetFxModel model) { if (_regressors != null) { return(_regressors); } var nPaths = _pathwiseValues.First().Length; var finalSchedules = _portfolio.Select(x => x.ExpectedFlowsByPath(model)).ToArray(); var finalValues = new double[_dateIndexes.Length][]; ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { var exposureDate = _regressionDates[d]; finalValues[d] = new double[nPaths]; foreach (var schedule in finalSchedules) { for (var p = 0; p < finalValues[d].Length; p++) { foreach (var flow in schedule[p].Flows) { if (flow.SettleDate > exposureDate) { finalValues[d][p] += flow.Pv; } } } } }).Wait(); var o = new MultipleLinearRegressor[_dateIndexes.Length]; ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { if (_regressionDates[d] <= model.BuildDate) { var detVec = new double[_pathwiseValues[d][0].Length + 1]; detVec[0] = finalValues[d].Average(); o[d] = new MultipleLinearRegressor(detVec); } else { var mlr = MultipleLinearRegression.Regress(_pathwiseValues[d], finalValues[d]); o[d] = new MultipleLinearRegressor(mlr); } }).Wait(); _regressors = o; return(o); }
public string FxPair(IAssetFxModel model) { if (IsFx) { return(AssetId); } else if (Currency != model.GetPriceCurve(AssetId).Currency) { return($"{model.GetPriceCurve(AssetId).Currency}/{PaymentCurrency}"); } else { return(string.Empty); } }
public double[] PFE(IAssetFxModel model, double confidenceInterval) { var o = new double[_dateIndexes.Length]; var regressors = Regress(model); var nPaths = _pathwiseValues.First().Length; var targetIx = (int)(nPaths * confidenceInterval); ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d => { var exposures = _pathwiseValues[d].Select(p => regressors[d].Interpolate(p)).OrderBy(x => x).ToList(); o[d] = Max(0.0, exposures[targetIx]); o[d] /= model.FundingModel.GetDf(_repCcy, model.BuildDate, _regressionDates[d]); }).Wait(); return(o); }
public string[] IrCurves(IAssetFxModel model) { if (FxConversionType == FxConversionType.None) { return new[] { DiscountCurve } } ; else { var fxCurve = model.FundingModel.FxMatrix.DiscountCurveMap[PaymentCurrency]; var assetCurveCcy = model.GetPriceCurve(AssetId).Currency; var assetCurve = model.FundingModel.FxMatrix.DiscountCurveMap[assetCurveCcy]; return((new[] { DiscountCurve, fxCurve, assetCurve }).Distinct().ToArray()); } }
public static List <CorrelationMatrix> LocalCorrelationObjects(this IAssetFxModel model, double[] times) { var o = new List <double[][]>(); var matrix = model.CorrelationMatrix; for (var it = 0; it < times.Length; it++) { o.Add(new double[matrix.LabelsX.Length][]); } for (var ix = 0; ix < matrix.LabelsX.Length; ix++) { for (var iy = 0; iy < matrix.LabelsY.Length; iy++) { var labelX = matrix.LabelsX[ix]; var labelY = matrix.LabelsY[iy]; var lastVarBasket = 0.0; var tLast = 0.0; for (var it = 0; it < times.Length; it++) { if (o[it] == null) { o[it] = new double[matrix.LabelsX.Length][]; } if (o[it][ix] == null) { o[it][ix] = new double[matrix.LabelsY.Length]; } var t = times[it]; var dt = t - tLast; var termCorrel = matrix.GetCorrelation(labelX, labelY, t); var volX = ((IATMVolSurface)model.GetVolSurface(labelX)).GetForwardATMVol(0, t); var volY = ((IATMVolSurface)model.GetVolSurface(labelY)).GetForwardATMVol(0, t); var termVar = (volX * volX + volY * volY + 2 * termCorrel * volX * volY) * t; var incrementalVar = (termVar - lastVarBasket) / dt; var volXfwd = ((IATMVolSurface)model.GetVolSurface(labelX)).GetForwardATMVol(tLast, t); var volYfwd = ((IATMVolSurface)model.GetVolSurface(labelY)).GetForwardATMVol(tLast, t); var localCorrel = (incrementalVar - volXfwd * volXfwd - volYfwd * volYfwd) / (2 * volXfwd * volYfwd); o[it][ix][iy] = (t == 0) ? termCorrel : localCorrel; tLast = t; lastVarBasket = termVar; } } } return(o.Select(m => new CorrelationMatrix(matrix.LabelsX, matrix.LabelsY, m)).ToList()); }
public List <CashFlow> ExpectedCashFlows(IAssetFxModel model) => !InTheMoney(model) ? new List <CashFlow>() : new List <CashFlow> { new CashFlow() { Currency = DomesticCCY, SettleDate = DeliveryDate, Notional = DomesticQuantity, Fv = DomesticQuantity }, new CashFlow() { Currency = ForeignCCY, SettleDate = DeliveryDate, Notional = DomesticQuantity * Strike, Fv = DomesticQuantity * Strike } };
public static double SolveStrikeForGrossRoC(this Portfolio portfolio, IAssetFxModel model, double targetRoC, Currency reportingCurrency, HazzardCurve hazzardCurve, double LGD, double xVA_LGD, double partyRiskWeight, double cvaCapitalWeight, IIrCurve discountCurve, ICurrencyProvider currencyProvider, Dictionary <string, string> assetIdToHedgeMap, Dictionary <string, double> hedgeGroupCCFs) { var insList = portfolio.Instruments.Select(x => x as IAssetInstrument).ToList(); if (insList.Any(x => x == null)) { throw new Exception("Not all instruments in the portfolio implement IAssetInstrument"); } var rolledModels = new Dictionary <DateTime, IAssetFxModel>(); var d = model.BuildDate; var lastModel = model; while (d <= portfolio.LastSensitivityDate) { rolledModels.Add(d, lastModel); d = d.AddDays(1); lastModel = lastModel.RollModel(d, currencyProvider); } var targetFunc = new Func <double, double>(k => { var newPf = new Portfolio() { Instruments = insList.Select(i => (IInstrument)i.SetStrike(k)).ToList() }; var roc = newPf.GrossRoC(model, reportingCurrency, hazzardCurve, LGD, xVA_LGD, cvaCapitalWeight, partyRiskWeight, discountCurve, currencyProvider, rolledModels, assetIdToHedgeMap, hedgeGroupCCFs); return(roc - targetRoC); }); var firstGuess = insList.Average(i => i.ParRate(model)); var solvedStrike = Math.Solvers.Newton1D.MethodSolve(targetFunc, firstGuess, 1e-8, 1000, 1e-9); if (System.Math.Abs(targetFunc(solvedStrike)) < 1e-8) { return(solvedStrike); } else { throw new Exception("Failed to find solution after 1000 itterations"); } }
public CashFlowSchedule[] ExpectedFlowsByPath(IAssetFxModel model) { var df = model.FundingModel.Curves[_discountCurve].GetDf(model.BuildDate, _payDate); return(ResultsByPath.Select(x => new CashFlowSchedule { Flows = new List <CashFlow> { new CashFlow { Fv = x, Pv = x * df, Currency = _ccy, FlowType = FlowType.FixedAmount, SettleDate = _payDate, YearFraction = 1.0 } } }).ToArray()); }
public CashFlowSchedule ExpectedFlows(IAssetFxModel model) { var ar = AverageResult; return(new CashFlowSchedule { Flows = new List <CashFlow> { new CashFlow { Fv = ar, Pv = ar * model.FundingModel.Curves[_discountCurve].GetDf(model.BuildDate, _payDate), Currency = _ccy, FlowType = FlowType.FixedAmount, SettleDate = _payDate, YearFraction = 1.0 } } }); }
public static IAssetFxModel FxSpotShift(FxPair pair, double shiftSize, IAssetFxModel model) { var o = model.Clone(); if (pair.Domestic == model.FundingModel.FxMatrix.BaseCurrency) { var spot = model.FundingModel.FxMatrix.GetSpotRate(pair.Foreign); o.FundingModel.FxMatrix.SpotRates[pair.Foreign] = spot + shiftSize; } else if (pair.Foreign == model.FundingModel.FxMatrix.BaseCurrency) { var spot = model.FundingModel.FxMatrix.GetSpotRate(pair.Domestic); o.FundingModel.FxMatrix.SpotRates[pair.Domestic] = 1 / (1 / spot + shiftSize); } else { throw new Exception("Shifted FX pair must contain base currency of model"); } return(o); }
public void Process() { var currentFixingDate = _assetFxModel.BuildDate; while (currentFixingDate <= _endDate) { currentFixingDate = currentFixingDate.AddDays(1); _assetFxModel = _assetFxModel.RollModel(currentFixingDate, _currencyProvider); } ParallelUtils.Instance.For(0, _calculationDates.Length, 1, i => { var d = _calculationDates[i]; var epe = _epeValues[i]; var newModel = _assetFxModel.Clone(); newModel.OverrideBuildDate(d); var ead = _portfolio.SaCcrEAD(epe, newModel, _reportingCurrency, _assetIdToGroupMap); var capital = _counterpartyRiskWeight * ead; if (!_ead.ContainsKey(d)) { lock (_threadLock) { if (!_ead.ContainsKey(d)) { _ead.Add(d, 0.0); } } } if (double.IsNaN(capital) || double.IsInfinity(capital)) { throw new Exception("Invalid capital generated"); } lock (_threadLock) { _ead[d] += capital; } }).Wait(); }
public static object PortfolioPvCapitalSplit( [ExcelArgument(Description = "Discount curve")] string DiscountCurve, [ExcelArgument(Description = "Hazzard curve")] string HazzardCurve, [ExcelArgument(Description = "Portfolio")] string Portfolio, [ExcelArgument(Description = "Asset-FX Model")] string Model, [ExcelArgument(Description = "Reporting currency")] string Currency, [ExcelArgument(Description = "Exposure dates")] double[] ExposureDates, [ExcelArgument(Description = "Loss-Given-Default")] double LGD, [ExcelArgument(Description = "Cva risk weight")] double CvaRiskWeight, [ExcelArgument(Description = "Party risk weight")] double PartyRiskWeight, [ExcelArgument(Description = "AssetId to Category map")] object[,] AssetIdToCategoryMap, [ExcelArgument(Description = "Category to CCF map")] object[,] CategoryToCCFMap, [ExcelArgument(Description = "Basel II / Basel II cutover date")] DateTime ChangeOverDate) { return(ExcelHelper.Execute(_logger, () => { var disc = ContainerStores.GetObjectCache <IIrCurve>().GetObjectOrThrow(DiscountCurve, $"Discount curve {DiscountCurve} not found"); var hz = ContainerStores.GetObjectCache <HazzardCurve>().GetObjectOrThrow(HazzardCurve, $"Hazzard curve {HazzardCurve} not found"); var portfolio = Instruments.InstrumentFunctions.GetPortfolioOrTradeFromCache(Portfolio); var model = ContainerStores.GetObjectCache <IAssetFxModel>().GetObjectOrThrow(Model, $"Asset-FX model {Model} not found"); var repCcy = ContainerStores.CurrencyProvider.GetCurrency(Currency); var expDates = ExposureDates.ToDateTimeArray(model.Value.BuildDate); var models = new IAssetFxModel[expDates.Length]; var m = model.Value.Clone(); for (var i = 0; i < models.Length; i++) { m = m.RollModel(expDates[i], ContainerStores.CurrencyProvider); models[i] = m; } var assetIdToCategory = AssetIdToCategoryMap.RangeToDictionary <string, string>(); var categoryToCCF = CategoryToCCFMap.RangeToDictionary <string, double>(); var result = CapitalCalculator.PvCapital_Split(model.Value.BuildDate, expDates, models, portfolio, hz.Value, repCcy, disc.Value, LGD, CvaRiskWeight, PartyRiskWeight, assetIdToCategory, categoryToCCF, ContainerStores.CurrencyProvider, ChangeOverDate); return new object [, ] { { "CCR PV", result.CCR }, { "CVA PV", result.CVA } }; })); }