Black-Scholes functions for Google Sheets

// THANK YOU!  brazenly stolen from https://www.math.ucla.edu/~tom/distributions/normal.html
// within the spreadsheet, of course, you can just use =NORMSDIST(X)
function normalcdf(X){   //HASTINGS.  MAX ERROR = .000001
	var T=1/(1+.2316419*Math.abs(X));
	var D=.3989423*Math.exp(-X*X/2);
	var Prob=D*T*(.3193815+T*(-.3565638+T*(1.781478+T*(-1.821256+T*1.330274))));
	if (X>0) {
		Prob=1-Prob
	}
	return Prob
}  

/**
 * Provides d1 for Black-Scholes.
 *
 * @param {30} DTE T-t in days to expiration
 * @param {.2} sd Volatility (σ / standard deviation)
 * @param {100} S Current security price
 * @param {110} K Strike price
 * @param {.01} r_f Risk-free rate
 * @return d1 for Black-Scholes.
 * @customfunction
 */
function d1(S, K, DTE, sd, r_f) {
  let dt = DTE/365;
  return (Math.log(S/K)+ (r_f + sd * sd / 2) * dt) / sd / Math.sqrt(dt);
}

/**
 * Provides d2 for Black-Scholes.
 *
 * @param {30} DTE T-t in days to expiration
 * @param {.2} sd Volatility (σ / standard deviation)
 * @param {100} S Current security price
 * @param {110} K Strike price
 * @param {.01} r_f Risk-free rate
 * @return d2 for Black-Scholes.
 * @customfunction
 */
function d2(S, K, DTE, sd, r_f) {
  let dt = DTE/365;
  let d_1 = d1(S, K, DTE, sd, r_f);
  return d_1 - sd * Math.sqrt(dt);
}

/**
 * Call price for Black-Scholes.
 *
 * @param {30} DTE T-t in days to expiration
 * @param {.2} sd Volatility (σ / standard deviation)
 * @param {100} S Current security price
 * @param {110} K Strike price
 * @param {.01} r_f Risk-free rate
 * @return Call price for Black-Scholes.
 * @customfunction
 */
function BSCALL(S, K, DTE, sd, r_f) {
  let dt = DTE / 365;
  let d_1 = d1(S, K, DTE, sd, r_f);
  let d_2 = d2(S, K, DTE, sd, r_f);
//  return normalcdf(d_1) * S - normalcdf(d_2) * K * Math.exp(-rf*dt);
  return normalcdf(d_1) * S - normalcdf(d_2) * K * Math.exp(-r_f*dt);
}

/**
 * Put price for Black-Scholes.
 *
 * @param {30} DTE T-t in days to expiration
 * @param {.2} sd Volatility (σ / standard deviation)
 * @param {100} S Current security price
 * @param {110} K Strike price
 * @param {.01} r_f Risk-free rate
 * @return Put price for Black-Scholes.
 * @customfunction
 */
function BSPUT(S, K, DTE, sd, r_f) {
  let dt = DTE / 365;
  let d_1 = d1(S, K, DTE, sd, r_f);
  let d_2 = d2(S, K, DTE, sd, r_f);
  return normalcdf(-d_2) * K * Math.exp(-r_f*dt) - normalcdf(-d_1) * S;
}