public static double Theta(double S, double t0, BSOption opt) { double T = opt.gettimeexp(); double K = opt.getstrike(); double vol = opt.getvolatility(); double q = opt.getyield(); double r = opt.getriskfreerate(); string opttype = opt.getoption(); double thetavalue; double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0)); double d2 = d1 - vol * Math.Sqrt(T - t0); if (S <= 0 || K <= 0 || vol <= 0 || T - t0 <= 0) { thetavalue = 0; } if (opttype == "call") { thetavalue = Math.Round(((-S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * 0.5 * vol / (Math.Sqrt(T - t0))) + q * S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(d1) - r * K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(d2)) / 365, 4); } else { thetavalue = Math.Round((-S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * 0.5 * vol / (Math.Sqrt(T - t0)) + r * K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(-d2) - q * S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(-d1)) / 365, 4); } return(thetavalue); }
public static bool BSImpvol(double S, double t0, double target, int max_iter, double Opt_tol, double vol_tol, ref double impvol, BSOption opt) { bool bool_value = true; double T = opt.gettimeexp(); double K = opt.getstrike(); double vol = opt.getvolatility(); double q = opt.getyield(); double r = opt.getriskfreerate(); double vol_in = 0.4; double vol_f = 0; string opttype = opt.getoption(); double V; double vega; double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0)); double d2 = d1 - vol * Math.Sqrt(T - t0); for (int i = 0; i <= max_iter; i++) { if (opttype == "call") { V = S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(d1) - K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(d2); } else { V = K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(-d2) - S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(-d1); } vega = S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * Math.Sqrt(T - t0); if (i == 0) { vol_f = vol_in - (V - target) / vega; } else { if (Math.Abs(V - target) <= Opt_tol && Math.Abs((vol_f - vol_in)) <= vol_tol) { vol_f = vol_in; vol_f = vol_in - (V - target) / vega; } } } impvol = vol_f; return(bool_value); }
public static double Vega(double S, double t0, BSOption opt) { double T = opt.gettimeexp(); double K = opt.getstrike(); double vol = opt.getvolatility(); double q = opt.getyield(); double r = opt.getriskfreerate(); string opttype = opt.getoption(); double vvalue; double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0)); double d2 = d1 - vol * Math.Sqrt(T - t0); if (S <= 0 || K <= 0 || vol <= 0 || T - t0 <= 0) { vvalue = 0; } vvalue = Math.Round(.01 * S * Math.Exp(-q * (T - t0)) * Math.Sqrt(T - t0) * RandLib.NormalPDF(d1), 4); return(vvalue); }