Alphanume

Insights

Retrieve Historical IV Rank for Backtests

Alphanume Team · July 23, 2026

Retrieve historical IV Rank for backtests with fixed date filters and only_final=true, then keep rank, percentile, the trailing-year band, and settlement status together in the research panel.

Alphanume IV/HV Rank places each ticker's current implied and realized volatility inside its own strict trailing 252-observation history. The endpoint GET /v1/iv-rank returns the current values, 52-week ranks and percentiles, trailing highs, lows, medians, daily cross-sectional context, liquidity reference, and settlement fields.

For a historical upper-decile screen, query min_iv_rank=90 with only_final=true. That means the current IV sits in the top 10% of its own high-low band. It does not mean the ticker ranks in the top 10% of the day's universe, and it does not mean options are expected to fall in value.

Rank and percentile answer different questions

Measure

Definition

Sensitivity

iv_rank

Position between the trailing-year IV low and high, scaled 0 to 100

One extreme high or low changes the whole band

iv_percentile

Share of trailing observations below current IV, scaled 0 to 100

Uses the full empirical distribution

iv_rank_cs_ranked

Cross-sectional percentile of IV Rank on that date, scaled 0 to 1

Compares names with the day's universe

iv_rank_cs_z

Cross-sectional z-score of IV Rank

Sensitive to the day's cross-sectional shape

Rank follows (iv - iv_52w_low) / (iv_52w_high - iv_52w_low) * 100. Percentile asks how many of the 252 trailing observations were below today. They diverge after an isolated volatility spike because the old extreme can keep the range wide while most ordinary observations remain below the current value.

A ticker is absent until the source has a full 252-observation window. Recent listings and newly eligible names are missing rather than partially ranked, so the served universe changes through time.

Pull settled upper-band observations

Today's row refreshes through the session with is_final=0 and settles after the close around 4:30 PM New York time with is_final=1. Every past date is final. The default route returns the latest row per date and ticker, so a current-day research job must request final rows explicitly.

import os
import requests
import pandas as pd

response = requests.get(
    "https://api.alphanume.com/v1/iv-rank",
    headers={"X-API-Key": os.environ["ALPHANUME_API_KEY"]},
    params={
        "date_gte": "2024-01-01",
        "date_lte": "2025-12-31",
        "min_iv_rank": 90,
        "only_final": "true",
    },
    timeout=30,
)
response.raise_for_status()
rows = pd.DataFrame(response.json()["data"])

assert rows["is_final"].eq(1).all()
assert rows["iv_rank"].ge(90).all()
assert not rows.duplicated(["date", "ticker"]).any()

The route does not paginate, and results arrive by date descending then ticker ascending. Save the response count and raw JSON before joining forward outcomes. Free access covers a trailing 20-session delayed window, so a multi-year request requires historical access.

Keep the as-of screen separate from outcomes

Panel field

Available at screen time

Use

iv, iv_rank, iv_percentile

Yes on the settled observation

Define the name-relative IV state

hv, hv_rank, hv_percentile

Yes

Describe the realized-volatility context

n_obs_52w

Yes

Confirm the strict warm window

notional_volume

Yes

Liquidity reference, not an execution-cost estimate

forward option P&L

No

Attach later from a separately specified strategy

Freeze the screen before loading future volatility or option returns. Then define whether the test measures one-week IV change, one-month IV change, delta-hedged option P&L, or another outcome. These are different hypotheses, and a high rank does not choose among them.

Compare iv_rank with hv_rank and the absolute IV level. A quiet stock at rank 95 can still have lower implied volatility than a biotech at rank 20. Name-relative position is context, not a market-wide price comparison.

High rank is not a sell instruction
  • Catalyst risk. Earnings, trials, court decisions, and corporate events can justify a high IV reading.
  • Range distortion. One extreme observation can compress later ranks even when percentile stays high.
  • Outcome mismatch. Falling IV does not guarantee a profitable short-option trade after realized movement, skew, spreads, and hedging.
  • Universe changes. The 252-observation warm-up excludes recent names and can alter cross-sectional coverage.
  • Intraday leakage. A provisional row can change before settlement and should not enter a close-based historical screen.

The Alphanume proof page publishes the settled IV Rank mean-reversion study and its sample. That evidence concerns subsequent IV behavior across historical rows. It does not turn every high-rank row into a profitable options sale or remove the need for execution costs and event controls.

Reproduce one settled cohort

Pull one year with min_iv_rank=90 and only_final=true. Export raw rows, date-level counts, rank-versus-percentile summary, and tickers missing from the warm universe. Attach one predefined forward IV-change outcome only after the cohort is saved, and report scheduled catalysts separately.

Explore the screen on the IV Rank page and reproduce every field and filter from the IV Rank documentation.