Exemplo n.º 1
0
        public YieldTermStructure fitSwap(int curveIndex, BasicFixedLeg swap, YieldTermStructure curve, double swapRate)
        {
            int    nPayments = swap._nPayments;
            int    nNodes    = curve.nJumps_;
            double t1        = curveIndex == 0 ? 0.0 : curve.t[curveIndex - 1];
            double t2        = curveIndex == nNodes - 1 ? double.PositiveInfinity : curve.t[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.getRT_(t));
                    temp  += paymentAmounts[i] * df;
                    temp2 -= paymentAmounts[i] * curve.getSingleNodeDiscountFactorSensitivity(t, curveIndex);
                    i1++;
                }
                else if (t >= t2)
                {
                    double df = Math.Exp(-curve.getRT_(t));
                    temp  += paymentAmounts[i] * df;
                    temp2 += paymentAmounts[i] * curve.getSingleNodeDiscountFactorSensitivity(t, curveIndex);
                    i2--;
                }
            }
            double cachedValues = temp;
            double cachedSense  = temp2;
            int    index1       = i1;
            int    index2       = i2;

            BracketRoot BRACKETER = new BracketRoot();
            NewtonRaphsonSingleRootFinder ROOTFINDER = new NewtonRaphsonSingleRootFinder();
            Func <double, double>         func       = x => apply_(x, curve, curveIndex, cachedValues, index1, index2,
                                                                   swap, paymentAmounts);

            Func <double, double> grad = x => apply_sen(x, curve, curveIndex, cachedSense, index1, index2,
                                                        swap, swapRate);

            double guess = curve.getZeroRateAtIndex(curveIndex);

            if (guess == 0.0 && func(guess) == 0.0)
            {
                return(curve);
            }
            double[] bracket = BRACKETER.getBracketedPoints(func, 0.8 * guess, 1.25 * guess, 0, double.PositiveInfinity);
            double   r       = ROOTFINDER.getRoot(func, grad, bracket[0], bracket[1]);

            return(curve.withRate(r, curveIndex));
        }