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); }
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); }
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)); }
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); }
/// <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); }
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); }