// Golden Section Search method for Black Scholes public double GoldenSearchBS(double a, double b, double tol, int MaxIter, MSsetBS mssettings) { MSExpansionBS MS = new MSExpansionBS(); double x1, x2, x3, x4, f1, f2, f3, f4; double GR = (Math.Sqrt(5.0) - 1.0) / 2.0; int k = 0; while (Math.Abs(b - a) > tol) { k = k + 1; x1 = a; x2 = a + (1.0 - GR) * (b - a); x3 = a + GR * (b - a); x4 = b; f1 = -MS.MSPutBS(x1, mssettings); f2 = -MS.MSPutBS(x2, mssettings); f3 = -MS.MSPutBS(x3, mssettings); f4 = -MS.MSPutBS(x4, mssettings); if ((f1 > f2) & (f2 < f3)) { b = x3; } else if ((f2 > f3) & (f3 < f4)) { a = x2; } if (k > MaxIter) { break; } } return((a + b) / 2.0); }
public double MSPriceBS(double S, double K, double T, double sigma, double r, double q, int MaxIter, double Tol, double b, double dt) { MSsetBS mssettings = new MSsetBS(); mssettings.theta = Math.Log(K / S) / sigma / Math.Sqrt(T); mssettings.K = K; mssettings.sigma = sigma; mssettings.r = r; mssettings.q = q; mssettings.T = T; Tol = 1e-5; MaxIter = 50; double a = Math.Max(1.25, 0.95 * mssettings.theta); b = 3.0; // Golden section search method to find y GoldenSearch GS = new GoldenSearch(); double y = GS.GoldenSearchBS(a, b, Tol, MaxIter, mssettings); // Bisection algorithm to find y //double y = BisectionBS(mssettings,a,b,Tol,MaxIter,dt); if (y < mssettings.theta) { y = mssettings.theta; } MSExpansionBS MS = new MSExpansionBS(); return(MS.MSPutBS(y, mssettings)); }
// Derivative of the MS approximation public double MSPutBSdiff(double y, MSsetBS mssettings, double dy) { MSExpansionBS MS = new MSExpansionBS(); return((MS.MSPutBS(y + dy, mssettings) - MS.MSPutBS(y - dy, mssettings)) / 2.0 / dy); }