Methodology

How NVRP Is Computed and Used as a Gate

By Rohan Fernandes, Founder, Optionscanner · Updated 2026-09-22 · Educational reference, not investment advice

NVRP, the normalized volatility risk premium, is (implied volatility minus realized volatility) divided by realized volatility. Optionscanner computes it from at-the-money implied volatility and a realized-volatility window matched to the option's days to expiry, flags readings below 0 as CHEAP_VOL, 0 to 0.10 as FAIR and 0.10 and above as PREMIUM, and adds a z-score against the stock's own trailing history so that a static threshold means the same thing on a quiet utility and a volatile chip maker. The paper trading agent requires 0.10 or more to enter a credit spread.

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 module: options/nvrp.py, the single implementation every caller imports.

What is the formula?

The raw reading is (IV minus RV) divided by RV, where IV is the at-the-money implied volatility of the expiry under consideration and RV is the stock's realized volatility. A reading of 0.25 means options are priced 25 percent above the movement the stock has recently delivered; a reading of -0.10 means they are priced 10 percent below it. The raw figure is preserved for display, and a normalized figure sits beside it for ranking and gating.

How is realized volatility measured?

Two choices matter and both are deliberate. First, the window is matched to the option: a 30-day option is compared with roughly 30 trading days of realized movement, not a fixed 20 or 252, so the premium is measured over the horizon the option actually covers. Second, the estimator can use open, high, low and close rather than closes alone: the Yang-Zhang estimator uses the full daily range and is materially less noisy than close-to-close over short windows, which matters when the window is only a few weeks.

What do the three bands mean?

These are the bands the NVRP explainer describes, and they are read from one function so the scanner, the conviction score and the agent cannot disagree about where a reading falls.

Why is there a z-score as well?

Because a raw threshold does not mean the same thing across stocks. A low-volatility name may spend most of its life at a raw reading of 0.15 while a volatile one swings between -0.20 and 0.40, so "0.10" is ordinary for one and rare for the other. The normalized figure compares today's raw reading with the stock's own trailing history of readings and reports how many standard deviations it sits from that history. Above +1 is notably rich for this stock; below -1 is notably cheap. When a price history is available, ranking and gating prefer the z-score; when it is not, they fall back to the raw bands and say so.

Where does NVRP act as a gate?

In three places. The conviction score's volatility-regime component reads the same implied-to-realized ratio (NVRP plus one). The paper trading agent's confidence gate scores the volatility-regime subscore from NVRP with a default entry floor of 0.10 and raises a blocking flag when NVRP cannot be computed at all, so a missing number is never treated as a passing one. And the screener's candidate ranking uses it to order premium-selling candidates.

Every function in the module is null-safe: bad or insufficient inputs return nothing rather than a guess, and every caller treats nothing as "unavailable" on the card.

Frequently asked questions

What is the exact NVRP formula Optionscanner uses?

Implied volatility minus realized volatility, divided by realized volatility, where implied is the at-the-money figure for the expiry in question and realized is measured over a window matched to that expiry's days to expiry, optionally with the Yang-Zhang range estimator.

Where are the CHEAP_VOL, FAIR and PREMIUM thresholds?

Below 0 is CHEAP_VOL, 0 to 0.10 is FAIR, and 0.10 and above is PREMIUM. The paper trading agent's default entry floor for a credit spread is 0.10, and a reading that cannot be computed raises a blocking flag rather than passing.

Why does a z-score sit beside the raw number?

Because a raw threshold means different things on different stocks. The z-score compares today's reading with the same stock's own trailing history of readings; above +1 is notably rich for that stock and below -1 notably cheap, whatever the raw level.

Sources

More in Methodology: how the engine computes: How Probability of Profit Is Computed and Checked · How an Expiration Is Scored · How Tape Fit Scores a Strike Against the Chart

Educational reference. Optionscanner is a software tool. It is not a broker-dealer, an investment adviser, or a fiduciary, and nothing on this page is investment advice or a recommendation to buy or sell any security. Options involve risk and are not suitable for every investor; read the Characteristics and Risks of Standardized Options before trading. Examples use hypothetical numbers for illustration only.