예제 #1
0
 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;
     }));
 }
예제 #2
0
        public IPvModel Rebuild(IAssetFxModel newVanillaModel, Portfolio portfolio)
        {
            var m = newVanillaModel.Clone();

            m.AttachPortfolio(portfolio);
            return(m);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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());
                }
            }
        }
예제 #5
0
        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());
                }
            }
        }
예제 #6
0
 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;
     }));
 }
예제 #7
0
 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);
     }));
 }
예제 #8
0
        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");
            }
        }
예제 #9
0
 public string[] IrCurves(IAssetFxModel model) =>
 new[] {
     ForeignDiscountCurve,
     model.FundingModel.FxMatrix.DiscountCurveMap[ForeignCCY],
     model.FundingModel.FxMatrix.DiscountCurveMap[DomesticCCY]
 }
 .Distinct()
 .ToArray();
예제 #10
0
        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);
        }
예제 #11
0
        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);
        }
예제 #12
0
파일: ETC.cs 프로젝트: wy6688/qwack
        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);
        }
예제 #13
0
 public List <CashFlow> ExpectedCashFlows(IAssetFxModel model) => new List <CashFlow>
 {
     new CashFlow()
     {
         Currency   = Currency,
         SettleDate = MaturityDate,
         Notional   = Notional,
         Fv         = Notional
     }
 };
예제 #14
0
 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();
 }
예제 #15
0
 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;
 }
예제 #16
0
        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);
        }
예제 #17
0
        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);
        }
예제 #18
0
        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);
        }
예제 #19
0
        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);
        }
예제 #20
0
파일: ETC.cs 프로젝트: wy6688/qwack
 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);
     }
 }
예제 #21
0
        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);
        }
예제 #22
0
        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());
            }
        }
예제 #23
0
파일: LocalVol.cs 프로젝트: biqueta/qwack
        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());
        }
예제 #24
0
 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
     }
 };
예제 #25
0
        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");
            }
        }
예제 #26
0
        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());
        }
예제 #27
0
        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
                    }
                }
            });
        }
예제 #28
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);
        }
예제 #29
0
        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();
        }
예제 #30
0
 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 }
         };
     }));
 }