strikeAtProbability function
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;
}