예제 #1
0
        //-------------------------------------------------------------------------
        public virtual void test_discountFactor()
        {
            IsdaCreditDiscountFactors test = IsdaCreditDiscountFactors.of(USD, VALUATION, CURVE);
            double relativeYearFraction    = ACT_365F.relativeYearFraction(VALUATION, DATE_AFTER);
            double expected = Math.Exp(-relativeYearFraction * CURVE.yValue(relativeYearFraction));

            assertEquals(test.discountFactor(DATE_AFTER), expected);
        }
        //-------------------------------------------------------------------------
        public virtual void test_discountFactor()
        {
            ZeroRateDiscountFactors test = ZeroRateDiscountFactors.of(GBP, DATE_VAL, CURVE);
            double relativeYearFraction  = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER);
            double expected = Math.Exp(-relativeYearFraction * CURVE.yValue(relativeYearFraction));

            assertEquals(test.discountFactor(DATE_AFTER), expected);
        }
        //-------------------------------------------------------------------------
        public virtual void test_discountFactor()
        {
            SimpleDiscountFactors test  = SimpleDiscountFactors.of(GBP, DATE_VAL, CURVE);
            double relativeYearFraction = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER);
            double expected             = CURVE.yValue(relativeYearFraction);

            assertEquals(test.discountFactor(DATE_AFTER), expected);
        }
 //-------------------------------------------------------------------------
 public virtual void test_volatility()
 {
     for (int i = 0; i < NB_EXPIRY; i++)
     {
         double expiryTime = VOLS.relativeTime(TEST_EXPIRY[i]);
         for (int j = 0; j < NB_STRIKE; ++j)
         {
             double volExpected = CURVE.yValue(expiryTime);
             double volComputed = VOLS.volatility(CURRENCY_PAIR, TEST_EXPIRY[i], TEST_STRIKE[j], FORWARD[i]);
             assertEquals(volComputed, volExpected, TOLERANCE);
         }
     }
 }
        //-------------------------------------------------------------------------
        // print for debugging
        protected internal virtual void print(IborCapletFloorletVolatilityCalibrationResult res, DoubleArray strikes, double maxTime)
        {
            Console.WriteLine("Print in CapletStrippingSetup \n");
            Console.WriteLine("Chi-square: " + res.ChiSquare);
            IborCapletFloorletVolatilities vols = res.Volatilities;
            const int nSamples       = 51;
            const int nStrikeSamples = 51;

            Console.Write("\n");
            for (int i = 0; i < nStrikeSamples; i++)
            {
                Console.Write("\t" + (strikes.get(0) + (strikes.get(strikes.size() - 1) - strikes.get(0)) * i) / (nStrikeSamples - 1));
            }
            Console.Write("\n");
            for (int index = 0; index < nSamples; index++)
            {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double t = 0.25 + index * maxTime / (nSamples - 1);
                double t       = 0.25 + index * maxTime / (nSamples - 1);
                double forward = FWD_CURVE.yValue(t);
                Console.Write(t);
                for (int i = 0; i < nStrikeSamples; i++)
                {
                    double strike = (strikes.get(0) + (strikes.get(strikes.size() - 1) - strikes.get(0)) * i) / (nStrikeSamples - 1);
                    Console.Write("\t" + vols.volatility(t, strike, forward));
                }
                Console.Write("\n");
            }
        }
        //-------------------------------------------------------------------------
        public virtual void test_discountFactor()
        {
            ZeroRatePeriodicDiscountFactors test = ZeroRatePeriodicDiscountFactors.of(GBP, DATE_VAL, CURVE);
            double relativeYearFraction          = ACT_365F.relativeYearFraction(DATE_VAL, DATE_AFTER);
            double expected = Math.Pow(1.0d + CURVE.yValue(relativeYearFraction) / CMP_PERIOD, -CMP_PERIOD * relativeYearFraction);

            assertEquals(test.discountFactor(DATE_AFTER), expected);
        }
        //-------------------------------------------------------------------------
        public virtual void test_price()
        {
            double computed = PRICER.price(FUTURE, PROVIDER);
            double pvSwap   = PRICER.SwapPricer.presentValue(RSWAP, PROVIDER).getAmount(USD).Amount;
            double yc       = ACT_ACT_ISDA.relativeYearFraction(VAL_DATE, DELIVERY);
            double df       = Math.Exp(-USD_DSC.yValue(yc) * yc);
            double expected = 1d + pvSwap / df;

            assertEquals(computed, expected, TOL);
        }
예제 #8
0
        public virtual void test_presentValue()
        {
            CurrencyAmount computedRec = PRICER.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, VOLS);
            CurrencyAmount computedPay = PRICER.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, VOLS);
            double         forward     = SWAP_PRICER.parRate(RSWAP_REC, RATE_PROVIDER);
            double         annuityCash = SWAP_PRICER.LegPricer.annuityCash(RFIXED_LEG_REC, forward);
            double         expiry      = VOLS.relativeTime(SWAPTION_REC_LONG.Expiry);
            double         tenor       = VOLS.tenor(SETTLE, END);
            double         volatility  = SURFACE.zValue(expiry, tenor);
            double         settle      = ACT_ACT_ISDA.relativeYearFraction(VAL_DATE, SETTLE);
            double         df          = Math.Exp(-DSC_CURVE.yValue(settle) * settle);
            double         expectedRec = df * annuityCash * BlackFormulaRepository.price(forward, RATE, expiry, volatility, false);
            double         expectedPay = -df *annuityCash *BlackFormulaRepository.price(forward, RATE, expiry, volatility, true);

            assertEquals(computedRec.Currency, EUR);
            assertEquals(computedRec.Amount, expectedRec, NOTIONAL * TOL);
            assertEquals(computedPay.Currency, EUR);
            assertEquals(computedPay.Amount, expectedPay, NOTIONAL * TOL);
        }
        //-------------------------------------------------------------------------
        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));
        }