コード例 #1
0
        /// <summary>Gets the Forward-Vanna of the option, i.e. the derivative \partial^2/ {\partial \sigma \partial F} of the option value.
        /// </summary>
        /// <param name="optionParameters">The parameters of the option.</param>
        /// <param name="getOptionValue">A delegate that calculates the value of the option for specified parameters.</param>
        /// <returns>A approximation of the gamma.</returns>
        public static double GetOptionForwardVanna(ConstantVolatilityStandardEuropeanOptionConfiguration optionParameters, GetOptionValue getOptionValue)
        {
            double h = 0.00005;  // should be not too small, otherwise one get numerical problems
            double k = 0.00005;

            double value             = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility);
            double valuePlusHPlusK   = getOptionValue(optionParameters.Strike, optionParameters.Forward + k, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility + h);
            double valuePlusHMinusK  = getOptionValue(optionParameters.Strike, optionParameters.Forward - k, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility + h);
            double valueMinusHPlusK  = getOptionValue(optionParameters.Strike, optionParameters.Forward + k, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility - h);
            double valueMinusHMinusK = getOptionValue(optionParameters.Strike, optionParameters.Forward - k, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility - h);

            return((valuePlusHPlusK - valuePlusHMinusK - valueMinusHPlusK + valueMinusHMinusK) / (4.0 * h * k));
        }
コード例 #2
0
        /// <summary>Gets the option kappa, i.e. strike-delta.
        /// </summary>
        /// <param name="optionParameters">The parameters of the option.</param>
        /// <param name="getOptionValue">A delegate that calculates the value of the option for specified parameters.</param>
        /// <returns>A approximation of the kappa.</returns>
        public static double GetOptionKappa(ConstantVolatilityStandardEuropeanOptionConfiguration optionParameters, GetOptionValue getOptionValue)
        {
            double h = 0.0000001;

            double value1 = getOptionValue(optionParameters.Strike + h, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility);
            double value2 = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility);

            return((value1 - value2) / h);
        }
コード例 #3
0
        /// <summary>Gets the Volga of the option, i.e. the second derivative with respect to the volatilty.
        /// </summary>
        /// <param name="optionParameters">The parameters of the option.</param>
        /// <param name="getOptionValue">A delegate that calculates the value of the option for specified parameters.</param>
        /// <returns>A approximation of the volga.</returns>
        public static double GetOptionVolga(ConstantVolatilityStandardEuropeanOptionConfiguration optionParameters, GetOptionValue getOptionValue)
        {
            double h = 0.00005;  // should be not too small, otherwise one get numerical problems

            double value        = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility);
            double valueMinusH  = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility - h);
            double valueMinus2H = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility - 2.0 * h);
            double valuePlusH   = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility + h);
            double valuePlus2H  = getOptionValue(optionParameters.Strike, optionParameters.Forward, optionParameters.TimeToExpiry, optionParameters.DiscountFactor, optionParameters.Volatility + 2.0 * h);

            /* approximation of the second derivative: (Richardson's extrapolation)
             *   f''(x) \approx  [-f(x-2h) + 16 * f(x-h) - 30 * f(x) + 16 * f(x+h) - f(x+2h)] / (12 * h^2)
             */
            return((-valueMinus2H + 16.0 * valueMinusH - 30.0 * value + 16.0 * valuePlusH - valuePlus2H) / (12 * h * h));
        }