コード例 #1
0
        //-------------------------------------------------------------------------
        public virtual void test_of()
        {
            SimpleDiscountFactors test = SimpleDiscountFactors.of(GBP, DATE_VAL, CURVE);

            assertEquals(test.Currency, GBP);
            assertEquals(test.ValuationDate, DATE_VAL);
            assertEquals(test.Curve, CURVE);
            assertEquals(test.ParameterCount, CURVE.ParameterCount);
            assertEquals(test.getParameter(0), CURVE.getParameter(0));
            assertEquals(test.getParameterMetadata(0), CURVE.getParameterMetadata(0));
            assertEquals(test.withParameter(0, 1d).Curve, CURVE.withParameter(0, 1d));
            assertEquals(test.withPerturbation((i, v, m) => v + 1d).Curve, CURVE.withPerturbation((i, v, m) => v + 1d));
            assertEquals(test.findData(CURVE.Name), CURVE);
            assertEquals(test.findData(CurveName.of("Rubbish")), null);
        }
        //-------------------------------------------------------------------------
        private InterpolatedNodalCurve fitSwap(int curveIndex, BasicFixedLeg swap, InterpolatedNodalCurve curve, double swapRate)
        {
            int    nPayments = swap.NumPayments;
            int    nNodes    = curve.ParameterCount;
            double t1        = curveIndex == 0 ? 0.0 : curve.XValues.get(curveIndex - 1);
            double t2        = curveIndex == nNodes - 1 ? double.PositiveInfinity : curve.XValues.get(curveIndex + 1);
            double temp      = 0;
            double temp2     = 0;
            int    i1        = 0;
            int    i2        = nPayments;

            double[] paymentAmounts = new double[nPayments];
            for (int i = 0; i < nPayments; i++)
            {
                double t = swap.getPaymentTime(i);
                paymentAmounts[i] = swap.getPaymentAmounts(i, swapRate);
                if (t <= t1)
                {
                    double df = Math.Exp(-curve.yValue(t) * t);
                    temp  += paymentAmounts[i] * df;
                    temp2 += paymentAmounts[i] * t *df *curve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);

                    i1++;
                }
                else if (t >= t2)
                {
                    double df = Math.Exp(-curve.yValue(t) * t);
                    temp  += paymentAmounts[i] * df;
                    temp2 -= paymentAmounts[i] * t *df *curve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);

                    i2--;
                }
            }
            double cachedValues = temp;
            double cachedSense  = temp2;
            int    index1       = i1;
            int    index2       = i2;

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: java.util.function.Function<double, double> func = new java.util.function.Function<double, double>()
            System.Func <double, double> func = (double?x) =>
            {
                InterpolatedNodalCurve tempCurve = curve.withParameter(curveIndex, x);
                double sum = 1.0 - cachedValues; // Floating leg at par
                for (int i = index1; i < index2; i++)
                {
                    double t = swap.getPaymentTime(i);
                    sum -= paymentAmounts[i] * Math.Exp(-tempCurve.yValue(t) * t);
                }
                return(sum);
            };

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: java.util.function.Function<double, double> grad = new java.util.function.Function<double, double>()
            System.Func <double, double> grad = (double?x) =>
            {
                InterpolatedNodalCurve tempCurve = curve.withParameter(curveIndex, x);
                double sum = cachedSense;
                for (int i = index1; i < index2; i++)
                {
                    double t = swap.getPaymentTime(i);
                    sum += swap.getPaymentAmounts(i, swapRate) * t * Math.Exp(-tempCurve.yValue(t) * t) * tempCurve.yValueParameterSensitivity(t).Sensitivity.get(curveIndex);
                }
                return(sum);
            };

            double guess = curve.getParameter(curveIndex);

            if (guess == 0.0 && func(guess) == 0.0)
            {
                return(curve);
            }
            double[] bracket = guess > 0d ? BRACKETER.getBracketedPoints(func, 0.8 * guess, 1.25 * guess, double.NegativeInfinity, double.PositiveInfinity) : BRACKETER.getBracketedPoints(func, 1.25 * guess, 0.8 * guess, double.NegativeInfinity, double.PositiveInfinity);
            double   r       = rootFinder.getRoot(func, grad, bracket[0], bracket[1]).Value;

            return(curve.withParameter(curveIndex, r));
        }
コード例 #3
0
        public virtual void test_withParameter()
        {
            IsdaCreditDiscountFactors test = IsdaCreditDiscountFactors.of(USD, VALUATION, CURVE).withParameter(1, 0.55);
            IsdaCreditDiscountFactors exp  = IsdaCreditDiscountFactors.of(USD, VALUATION, CURVE.withParameter(1, 0.55));

            assertEquals(test, exp);
        }