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()); }
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); } } }
/// <summary> /// Calculates the volatility and associated sensitivities. /// <para> /// The derivatives are stored in an array with: /// <ul> /// <li>[0] derivative with respect to the forward /// <li>[1] derivative with respect to the forward strike /// <li>[2] derivative with respect to the alpha /// <li>[3] derivative with respect to the beta /// <li>[4] derivative with respect to the rho /// <li>[5] derivative with respect to the nu /// </ul> /// /// </para> /// </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 and associated derivatives </returns> public ValueDerivatives volatilityAdjoint(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.volatilityAdjoint(forward + shift, strike + shift, expiry, alpha, beta, rho, nu)); }