Exemplo n.º 1
0
        public static double NumericalGreeks(OptionPriceDelegate price, enOptionGreeks greek, double underlying, double strike, double time, double rate, double dividend, double sigma)
        {
            const double dx = 1e-3; //shifts to compute numeric greeks

            double value = Double.NaN;
            double q     = dividend;
            double S     = underlying;
            double K     = strike;
            double t     = time;
            double r     = rate;

            double ds = System.Math.Max(dx, S * dx);

            switch (greek)
            {
            case enOptionGreeks.Price:
                value = price(S, K, time, r, q, sigma);
                break;

            case enOptionGreeks.Delta:
                value = (price(S + ds, K, t, r, q, sigma) - price(S - ds, K, t, r, q, sigma)) / (2 * ds);
                break;

            case enOptionGreeks.Gamma:
                value = (price(S + ds, K, t, r, q, sigma) + price(S - ds, K, t, r, q, sigma) - 2 * price(S, K, t, r, q, sigma)) / (ds * ds);
                break;

            case enOptionGreeks.Vega:
                double sigma_up = sigma + dx;
                double sigma_dn = System.Math.Max(1e-12, sigma - dx);
                value = (price(S, K, t, r, q, sigma_up) - price(S, K, t, r, q, sigma_dn)) / (sigma_up - sigma_dn);
                break;

            case enOptionGreeks.Vomma:
                value = (price(S, K, t, r, q, sigma + dx) + price(S, K, t, r, q, sigma - dx) - 2 * price(S, K, t, r, q, sigma)) / (dx * dx);;
                break;

            case enOptionGreeks.Rho:
                value = (price(S, K, t, r + dx, q, sigma) - price(S, K, t, r - dx, q, sigma)) / (2 * dx);
                break;

            case enOptionGreeks.Theta:
                double dt = System.Math.Min(dx, t);
                value = (price(S, K, t - dt, r, q, sigma) - price(S, K, t, r, q, sigma)) / (dt);
                break;

            case enOptionGreeks.Vanna:
                value = (price(S + dx, K, t, r, q, sigma + dx) - price(S + dx, K, t, r, q, sigma - dx) - price(S - dx, K, t, r, q, sigma + dx) + price(S - dx, K, t, r, q, sigma - dx)) / (4 * dx * dx);
                break;
            }
            return(value);
        }
Exemplo n.º 2
0
        public static double Greeks(enOptionGreeks greek, double spot, double strike, double time, double rate, double dividend, double sigma, bool isCall)
        {
            double value = Double.NaN;

            //TODO: redo using reflection
            switch (greek)
            {
            case enOptionGreeks.Price:
                value = Price(spot, strike, time, rate, dividend, sigma, isCall);
                break;

            case enOptionGreeks.Delta:
                value = Delta(spot, strike, time, rate, dividend, sigma, isCall);
                break;

            case enOptionGreeks.Gamma:
                value = Gamma(spot, strike, time, rate, dividend, sigma);
                break;

            case enOptionGreeks.Vega:
                value = Vega(spot, strike, time, rate, dividend, sigma);
                break;

            case enOptionGreeks.Vomma:
                value = Vomma(spot, strike, time, rate, dividend, sigma);
                break;

            case enOptionGreeks.Vanna:
                value = Vanna(spot, strike, time, rate, dividend, sigma);
                break;

            case enOptionGreeks.Rho:
                value = Rho(spot, strike, time, rate, dividend, sigma, isCall);
                break;

            case enOptionGreeks.Theta:
                value = Theta(spot, strike, time, rate, dividend, sigma, isCall);
                break;

            case enOptionGreeks.Charm:
                value = Charm(spot, strike, time, rate, dividend, sigma, isCall);
                break;

            case enOptionGreeks.Epsilon:
                value = Epsilon(spot, strike, time, rate, dividend, sigma, isCall);
                break;
            }
            return(value);
        }
Exemplo n.º 3
0
        public static double Greeks(enOptionGreeks greek, double spot, double strike, double time, double rate, double dividend, double sigma, bool isCall, int time_steps)
        {
            Binomial.OptionPayoff payoff;

            if (isCall)
            {
                payoff = (price, K) => Max(0d, price - K);
            }
            else
            {
                payoff = (price, K) => Max(0d, K - price);
            }

            return(Binomial.Greeks(greek, spot, strike, time, rate, dividend, sigma, payoff, true, time_steps));
        }
Exemplo n.º 4
0
        public static double Greeks(enOptionGreeks greek, double spot, double strike, double time, double rate, double dividend, double sigma, OptionPayoff payoff, bool isAmerican, int time_steps)
        {
            double value = Double.NaN;

            if (greek == enOptionGreeks.Price)
            {
                value = Price(spot, strike, time, rate, dividend, sigma, payoff, isAmerican, time_steps);
            }
            else
            {
                Utils.OptionPriceDelegate price_function = delegate(double S, double K, double t, double r, double q, double v) {
                    return(Binomial.Price(S, K, t, r, q, v, payoff, isAmerican, time_steps));
                };

                value = Utils.NumericalGreeks(price_function, greek, spot, strike, time, rate, dividend, sigma);
            }

            return(value);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Compute finite difference greeks
        /// </summary>
        /// <param name="greek"></param>
        /// <param name="spot"></param>
        /// <param name="strike"></param>
        /// <param name="time"></param>
        /// <param name="rate"></param>
        /// <param name="dividend"></param>
        /// <param name="sigma"></param>
        /// <param name="isCall"></param>
        /// <returns></returns>
        public static double Greeks(enOptionGreeks greek, double spot, double strike, double time, double rate, double dividend, double sigma, bool isCall)
        {
            double value = Double.NaN;

            if (greek == enOptionGreeks.Price)
            {
                value = Price(spot, strike, time, rate, dividend, sigma, isCall);
            }
            else
            {
                Utils.OptionPriceDelegate price_function = delegate(double S, double K, double t, double r, double q, double v) {
                    return(BjerksundStensland.Price(S, K, t, r, q, v, isCall));
                };

                value = Utils.NumericalGreeks(price_function, greek, spot, strike, time, rate, dividend, sigma);
            }

            return(value);
        }
Exemplo n.º 6
0
        public static double Greeks(enOptionGreeks greek, double forward, double strike, double time, double rate, double sigma, bool isCall)
        {
            double value = Double.NaN;

            //TODO: redo using reflection
            switch (greek)
            {
            case enOptionGreeks.Price:
                value = Price(forward, strike, time, rate, sigma, isCall);
                break;

            case enOptionGreeks.Delta:
                value = Delta(forward, strike, time, rate, sigma, isCall);
                break;

            case enOptionGreeks.Gamma:
                value = Gamma(forward, strike, time, rate, sigma);
                break;

            case enOptionGreeks.Vega:
                value = Vega(forward, strike, time, rate, sigma);
                break;

            case enOptionGreeks.Vomma:
                value = Vomma(forward, strike, time, rate, sigma);
                break;

            case enOptionGreeks.Vanna:
                value = Vanna(forward, strike, time, rate, sigma);
                break;

            case enOptionGreeks.Rho:
                value = Rho(forward, strike, time, rate, sigma, isCall);
                break;

            case enOptionGreeks.Theta:
                value = Theta(forward, strike, time, rate, sigma, isCall);
                break;
            }
            return(value);
        }