Probability of profit is computed under a log-normal model of the stock at expiry: the chance that price finishes on the profitable side of the breakeven, N(d2) or N(-d2) in Black-Scholes terms, using the strike's own implied volatility. Two refinements sit beside it. A smile-slope correction adjusts for the fact that implied volatility changes with strike, and a probability of touch estimates the chance the short strike is reached before expiry, which is the number that matches an exit process that closes at a loss multiple rather than waiting for expiry. A standing calibration report then compares predicted probability with realized win rate.
How these pages were written: from the engine source as deployed in September 2026, with thresholds quoted as the code holds them. Thresholds change with releases and the changelog records each change. This is a description of arithmetic, not advice about what to trade.
Source modules: options/pop.py (pop_lognormal, pop_lognormal_smile, prob_touch) and strategy/calibration_report.py.
Under a risk-neutral log-normal model of the terminal price, the probability that the stock finishes above a level k is N(d2) and below it is N(-d2), where d2 = (ln(S/k) + (r - 0.5 sigma squared) T) / (sigma times the square root of T), T is days to expiry divided by 365, S is the current price, sigma is the implied volatility at the strike, and r is the short-term Treasury rate from the published series the platform uses. For a credit spread the level k is the breakeven, the short strike less the credit received for a put spread, so the figure is the probability that the position expires with some profit, not the probability that the short strike is never visited.
There is one implementation, imported by the screener, the expiration optimizer and the calculators, so the number on every surface is the same arithmetic. It returns nothing on bad inputs rather than a default, and every card treats nothing as "unavailable".
The level-only figure uses the strike's own implied volatility, which already respects the smile's level. The exact risk-neutral probability also carries a slope term: P(above k) = N(d2) minus e to the rT times vega times the smile slope, where the slope is the change in implied volatility per dollar of strike, measured by finite difference from the same expiry's chain. Under the usual negative index smirk, where implied volatility falls as strike rises, the short-call side is riskier than the level-only read and the short-put side slightly safer. The correction is whatever the measured local slope says, in whichever direction; when neighboring strikes are too far apart to measure a local slope, the correction is skipped rather than guessed. This term came out of the component literature review.
Because the book is not run to expiry. Exit rules close a credit spread at a share of maximum profit, at a loss multiple, or at a days-to-expiry threshold, so a short strike that is touched mid-hold usually means the loss rule is in play long before expiry math applies. Probability of touch is the first-passage probability that price reaches the short strike before expiry under the same model. With zero drift it reduces to roughly twice the probability of finishing beyond the strike, which is why a short strike with a 16 percent chance of finishing in the money carries roughly a one-in-three chance of being tested along the way.
By a standing calibration report over the trade journal. Every entry captures its features, including the predicted probability, and every close labels the outcome. The report groups trades by predicted probability and shows the realized win rate in each bucket beside the prediction. A stable gap is expected, not a defect: probability of profit is the chance of profit at expiry, while exits fire earlier at 50 percent of maximum profit, at a loss multiple, or at 21 days to expiry, so the gap measures the exit policy's edge or cost. The report refuses to say anything until 30 labeled trades exist, suppresses any bucket under 10 rows, and prints the sample size beside every figure, because a win rate on twelve trades is not a finding.
It assumes log-normal returns with the volatility the market currently implies, so it inherits the market's own errors, it knows nothing about an earnings date inside the window unless the expiration optimizer has already penalized that expiry, and it is a probability, not an expectation: a 90 percent probability of a small profit paired with a 10 percent chance of a loss several times larger is exactly the shape of a credit spread, and the POP calculator shows both numbers for that reason.
Under a log-normal model of the stock at expiry, as the probability that price finishes on the profitable side of the breakeven: N(d2) or N(-d2) in Black-Scholes terms, using the strike's own implied volatility and days to expiry over 365. One implementation serves the screener, the expiration optimizer and the calculators.
The chance that price reaches the short strike at some point before expiry, under the same model. It matters because positions are closed by rules at a loss multiple or a days-to-expiry threshold rather than held to expiry, and with zero drift it is roughly twice the probability of finishing beyond the strike.
Yes, by a standing calibration report over the trade journal that compares predicted probability with realized win rate by bucket. It reports nothing below 30 labeled trades, suppresses buckets under 10 rows, and prints the sample size beside every figure.
More in Methodology: how the engine computes: How an Expiration Is Scored · How Tape Fit Scores a Strike Against the Chart · How the Paper Trading Agent Decides: the Gate