strikeAtProbability function

double? strikeAtProbability(
  1. PricerInputs inputs,
  2. double p
)

Strike where P(settle > strike) = p, by bisection (UP is monotone-decreasing in strike). Null when no crossing exists within ±64% of forward.

Implementation

double? strikeAtProbability(PricerInputs inputs, double p) {
  final forward = inputs.forward;
  if (!(forward > 0) || !(p > 0 && p < 1)) return null;
  double up(double strike) => upProbability(inputs, strike);
  var r = 0.01;
  while (up(forward * (1 - r)) < p || up(forward * (1 + r)) > p) {
    r *= 2;
    if (r > 0.64) return null;
  }
  var lo = forward * (1 - r);
  var hi = forward * (1 + r);
  for (var i = 0; i < 64; i++) {
    final mid = (lo + hi) / 2;
    if (up(mid) > p) {
      lo = mid;
    } else {
      hi = mid;
    }
  }
  return (lo + hi) / 2;
}