public static double CalcDelta(EnumOptionType OptionType, double S, double K, double r, double T, double Sigma, double q) { if (Sigma != 0 && T != 0) { double ndOne = CND(dOne(S, K, r, T, Sigma, q)); return((OptionType == EnumOptionType.Call) ? ndOne : ndOne - 1); } else { return(double.NaN); } }
public static double CalcRho(EnumOptionType OptionType, double S, double K, double r, double T, double Sigma, double q) { if (Sigma != 0 && T != 0) { double d2 = dTwo(S, K, r, T, Sigma, q); return((OptionType == EnumOptionType.Call) ? K * T * Math.Exp(-r * T) * CND(d2) : -K *T *Math.Exp(-r *T) * CND(-d2)); } else { return(double.NaN); } }
public static double OptionPrice(EnumOptionType OptionType, double S, double K, double r, double T, double Sigma, double q) { if (Sigma != 0 && T != 0) { double d1 = dOne(S, K, r, T, Sigma, q); double d2 = dTwo(S, K, r, T, Sigma, q); double exp_r = Math.Exp(-r * T); double exp_q = Math.Exp(-q * T); return((OptionType == EnumOptionType.Call) ? S * exp_q * CND(d1) - K * exp_r * CND(d2) : K *exp_r *CND(-d2) - S * exp_q * CND(-d1)); } else { return(double.NaN); } }
public static double CalcTheta(EnumOptionType OptionType, double S, double K, double r, double T, double Sigma, double q) { if (Sigma != 0 && T != 0) { double d1 = dOne(S, K, r, T, Sigma, q); double d2 = dTwo(S, K, r, T, Sigma, q); double ndOne = CND(d1); double ndTwo = CND(d2); if (OptionType == EnumOptionType.Call) { return(S * PDF(d1) * Sigma * Math.Exp(-q * T) / (2 * Math.Sqrt(T)) + q * S * CND(d1) * Math.Exp(-q * T) - r * K * Math.Exp(-r * T) * CND(d2)); } else { return(-S *PDF(d1) * Sigma * Math.Exp(-q * T) / (2 * Math.Sqrt(T)) - q * S * CND(-d1) * Math.Exp(-q * T) + r * K * Math.Exp(-r * T) * CND(d2)); } } else { return(double.NaN); } }
public double GetFairPrice(double Spot, double Strik, double TDays, double Rate, double Volatility, EnumOptionType OptionType) { double _FairPrice = 0, _PHI = 1; if (OptionType == EnumOptionType.Put) { _PHI = -1; } if (TDays > 0) { double _VT = Volatility * Math.Sqrt(TDays); double _R = Math.Log(1 + Rate); double _D1 = GetD1(Spot, Strik, TDays, Rate, Volatility); double _D2 = GetD2(_D1, TDays, Volatility); _FairPrice = _PHI * Spot * GetCND(_PHI * _D1) - _PHI * Strik * Math.Exp((0 - _R) * TDays) * GetCND(_PHI * _D2); } else { _FairPrice = Math.Max(_PHI * (Spot - Strik), 0); } return(_FairPrice); }