Exemplo n.º 1
0
        public DiscountCurveSolver(ILogger logger, ICoreCache cache, string nameSpace, DateTime baseDate, NamedValueSet properties, IEnumerable <Triplet <string, decimal, int> > assets,
                                   decimal[] adjustments, string spreadAssetId, BasicAssetValuation spreadAssetValuation,
                                   int spreadDays, double spread, int spreadStartIndex, int spreadEndIndex,
                                   IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar)
        {
            _nameSpace            = nameSpace;
            _properties           = properties;
            _spreadAssetId        = spreadAssetId;
            _spreadAssetValuation = spreadAssetValuation;
            _baseDate             = baseDate;
            _spread           = spread;
            _spreadStartIndex = spreadStartIndex;
            _spreadEndIndex   = spreadEndIndex;
            _adjustments      = adjustments;
            var enumerable = assets as Triplet <string, decimal, int>[] ?? assets.ToArray();

            _instruments    = enumerable.Select(a => a.First).ToArray();
            _rates          = enumerable.Select(a => a.Second).ToArray();
            _days           = enumerable.Select(a => a.Third).ToArray();
            _spreadDays     = spreadDays;
            _logger         = logger;
            _cache          = cache;
            _fixingCalendar = fixingCalendar;
            _rollCalendar   = rollCalendar;
            // Calculate the function value for zero spread
            decimal[] zeroAdjustments = adjustments.Select(a => 0m).ToArray();

            _valueForZeroAdjustment
                = RateCurve.CalculateImpliedQuote(_logger, _cache, _nameSpace, _baseDate, _properties, _instruments, _rates, zeroAdjustments, _spreadAssetId, _spreadAssetValuation,
                                                  _fixingCalendar, _rollCalendar);
        }
Exemplo n.º 2
0
        public double Value(double trialAdjustment)
        {
            // Set the adjustments
            // Adjust the rates with the answer
            if (_spreadStartIndex == 0)
            {
                for (int i = 0; i <= _spreadEndIndex; i++)
                {
                    _adjustments[i] = (decimal)trialAdjustment;
                }
            }
            else
            {
                int startDays = _days[_spreadStartIndex - 1];

                // if there is only one point then don't interpolate
                if (_spreadDays == startDays)
                {
                    _adjustments[_spreadStartIndex] = (decimal)trialAdjustment;
                }
                else
                {
                    var x             = new double[] { startDays, _spreadDays };
                    var y             = new[] { (double)_adjustments[_spreadStartIndex - 1], trialAdjustment };
                    var interpolation = new LinearInterpolation();
                    interpolation.Initialize(x, y);

                    for (int i = _spreadStartIndex; i <= _spreadEndIndex; i++)
                    {
                        int days = _days[i];
                        _adjustments[i] = (decimal)interpolation.ValueAt(days, false);
                    }
                }
            }
            double valueForAdjustment = RateCurve.CalculateImpliedQuote(_logger, _cache, _nameSpace, _baseDate, _properties, _instruments, _rates, _adjustments, _spreadAssetId,
                                                                        _spreadAssetValuation, _fixingCalendar, _rollCalendar);

            return(valueForAdjustment - _valueForZeroAdjustment - _spread);
        }