Exemplo n.º 1
0
        public virtual void hashEqualGetter()
        {
            assertEquals(PARAMETERS.AlphaSurface, ALPHA_SURFACE);
            assertEquals(PARAMETERS.BetaSurface, BETA_SURFACE);
            assertEquals(PARAMETERS.RhoSurface, RHO_SURFACE);
            assertEquals(PARAMETERS.NuSurface, NU_SURFACE);
            assertEquals(PARAMETERS.SabrVolatilityFormula, FORMULA);
            assertEquals(PARAMETERS.ShiftSurface.Name, SurfaceName.of("Zero shift"));
            double expiry = 2.0;
            double tenor  = 3.0;
            double alpha  = ALPHA_SURFACE.zValue(expiry, tenor);
            double beta   = BETA_SURFACE.zValue(expiry, tenor);
            double rho    = RHO_SURFACE.zValue(expiry, tenor);
            double nu     = NU_SURFACE.zValue(expiry, tenor);

            assertEquals(PARAMETERS.alpha(expiry, tenor), alpha);
            assertEquals(PARAMETERS.beta(expiry, tenor), beta);
            assertEquals(PARAMETERS.rho(expiry, tenor), rho);
            assertEquals(PARAMETERS.nu(expiry, tenor), nu);
            double strike  = 1.1;
            double forward = 1.05;

            assertEquals(PARAMETERS.volatility(expiry, tenor, strike, forward), FORMULA.volatility(forward, strike, expiry, alpha, beta, rho, nu));
            double[] adjCmp = PARAMETERS.volatilityAdjoint(expiry, tenor, strike, forward).Derivatives.toArray();
            double[] adjExp = FORMULA.volatilityAdjoint(forward, strike, expiry, alpha, beta, rho, nu).Derivatives.toArray();
            for (int i = 0; i < 6; ++i)
            {
                assertEquals(adjCmp[i], adjExp[i]);
            }
            SabrInterestRateParameters other = SabrInterestRateParameters.of(ALPHA_SURFACE, BETA_SURFACE, RHO_SURFACE, NU_SURFACE, FORMULA);

            assertEquals(PARAMETERS, other);
            assertEquals(PARAMETERS.GetHashCode(), other.GetHashCode());
        }
Exemplo n.º 2
0
        public virtual void getter()
        {
            assertEquals(PARAMETERS.AlphaCurve, ALPHA_CURVE);
            assertEquals(PARAMETERS.BetaCurve, BETA_CURVE);
            assertEquals(PARAMETERS.RhoCurve, RHO_CURVE);
            assertEquals(PARAMETERS.NuCurve, NU_CURVE);
            assertEquals(PARAMETERS.SabrVolatilityFormula, FORMULA);
            assertEquals(PARAMETERS.ShiftCurve.Name, CurveName.of("Zero shift"));
            assertEquals(PARAMETERS.DayCount, ACT_ACT_ISDA);
            assertEquals(PARAMETERS.ParameterCount, 9);
            double expiry = 2.0;
            double alpha  = ALPHA_CURVE.yValue(expiry);
            double beta   = BETA_CURVE.yValue(expiry);
            double rho    = RHO_CURVE.yValue(expiry);
            double nu     = NU_CURVE.yValue(expiry);

            assertEquals(PARAMETERS.alpha(expiry), alpha);
            assertEquals(PARAMETERS.beta(expiry), beta);
            assertEquals(PARAMETERS.rho(expiry), rho);
            assertEquals(PARAMETERS.nu(expiry), nu);
            double strike  = 1.1;
            double forward = 1.05;

            assertEquals(PARAMETERS.volatility(expiry, strike, forward), FORMULA.volatility(forward, strike, expiry, alpha, beta, rho, nu));
            double[] adjCmp = PARAMETERS.volatilityAdjoint(expiry, strike, forward).Derivatives.toArray();
            double[] adjExp = FORMULA.volatilityAdjoint(forward, strike, expiry, alpha, beta, rho, nu).Derivatives.toArray();
            for (int i = 0; i < 6; ++i)
            {
                assertEquals(adjCmp[i], adjExp[i]);
            }
            for (int i = 0; i < 9; ++i)
            {
                if (i < 2)
                {
                    assertEquals(PARAMETERS.getParameterMetadata(i), ALPHA_CURVE.getParameterMetadata(i));
                    assertEquals(PARAMETERS.getParameter(i), ALPHA_CURVE.getParameter(i));
                }
                else if (i < 4)
                {
                    assertEquals(PARAMETERS.getParameterMetadata(i), BETA_CURVE.getParameterMetadata(i - 2));
                    assertEquals(PARAMETERS.getParameter(i), BETA_CURVE.getParameter(i - 2));
                }
                else if (i < 6)
                {
                    assertEquals(PARAMETERS.getParameterMetadata(i), RHO_CURVE.getParameterMetadata(i - 4));
                    assertEquals(PARAMETERS.getParameter(i), RHO_CURVE.getParameter(i - 4));
                }
                else if (i < 8)
                {
                    assertEquals(PARAMETERS.getParameterMetadata(i), NU_CURVE.getParameterMetadata(i - 6));
                    assertEquals(PARAMETERS.getParameter(i), NU_CURVE.getParameter(i - 6));
                }
                else
                {
                    assertEquals(PARAMETERS.getParameterMetadata(i), ParameterMetadata.empty());
                    assertEquals(PARAMETERS.getParameter(i), 0d);
                }
            }
        }
        private void checkCalibrationNormal(DoubleArray moneyness, DoubleArray normalVol, DoubleArray startParameters, BitArray @fixed, double shift, double tolerance)
        {
            Pair <LeastSquareResultsWithTransform, DoubleArray> rComputed = SABR_CALIBRATION.calibrateLsShiftedFromNormalVolatilities(BDA, CALIBRATION_TIME, ACT_365F, EXPIRY_PERIOD, FORWARD, moneyness, ValueType.SIMPLE_MONEYNESS, normalVol, startParameters, @fixed, shift);
            SabrFormulaData sabrComputed = SabrFormulaData.of(rComputed.First.ModelParameters.toArrayUnsafe());

            for (int i = 0; i < moneyness.size(); i++)
            {
                double ivComputed    = SABR_FORMULA.volatility(FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, sabrComputed.Alpha, sabrComputed.Beta, sabrComputed.Rho, sabrComputed.Nu);
                double priceComputed = BlackFormulaRepository.price(FORWARD + shift, FORWARD + moneyness.get(i) + shift, TIME_EXPIRY, ivComputed, true);
                double priceNormal   = NormalFormulaRepository.price(FORWARD, FORWARD + moneyness.get(i), TIME_EXPIRY, normalVol.get(i), PutCall.CALL);
                assertEquals(priceComputed, priceNormal, tolerance);
            }
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the volatility for given expiry, strike and forward rate.
        /// </summary>
        /// <param name="expiry">  the time to expiry as a year fraction </param>
        /// <param name="strike">  the strike </param>
        /// <param name="forward">  the forward </param>
        /// <returns> the volatility </returns>
        public double volatility(double expiry, double strike, double forward)
        {
            double alpha = this.alpha(expiry);
            double beta  = this.beta(expiry);
            double rho   = this.rho(expiry);
            double nu    = this.nu(expiry);
            double shift = this.shift(expiry);

            return(sabrVolatilityFormula.volatility(forward + shift, strike + shift, expiry, alpha, beta, rho, nu));
        }