Vol-of-Vol Index
Find the stocks whose volatility itself will not sit still: not just high, but swinging around from day to day over the past month. Each liquid US name gets a score for how much its implied and its realized volatility have varied, built so the number compares directly across tickers of any size or vol level.
Isolate the unstable tail.
min_iv_vov_rank=0.9 returns the day's most vol-unstable decile, which is the only part of the distribution the published study found usable.
Screen for calm instead.
Low iv_vov and hv_vov find names whose vol regime has held steady, for strategies that quietly assume one.
Trace what is driving a score.
iv_mean_21 and iv_std_21 give the level and the swing behind every iv_vov, so a high reading can be checked rather than trusted.
Which stocks look like their volatility is turning erratic, and which have been steady? Show me the unstable ones and tell me how often that has actually come before a big move.
Your agent turns that into the trailing-month variation of each name's implied and realized vol, ranks it across the universe that day, and reports honestly that the settled history supports only the extreme end.
Not how high volatility is. How steady it is.
Volatility measures how much a stock moves. Vol-of-vol measures how much that measurement itself has been moving. For each ticker and trading day, this dataset takes the last 21 observations (roughly one month) of the name's own implied volatility and its realized volatility, and computes the coefficient of variation for each: the standard deviation of the window divided by its mean. iv_vov is the implied version, hv_vov the realized one.
Dividing by the mean is what makes the score portable. A raw standard deviation of volatility would just be larger wherever volatility is larger, so high-vol names would top every list by construction. The ratio strips the level out and leaves a plain number with no units, which means an iv_vov of 0.20 describes the same degree of instability on a small biotech as on a mega cap. High means the name's vol level has been churning; low means the regime has held.
Each row includes:
- iv_vov and hv_vov, the instability scores for implied and realized vol over the trailing 21 observations.
- The mean and standard deviation behind each score: iv_mean_21, iv_std_21, hv_mean_21, and hv_std_21.
- The name's current implied and realized vol levels, carried across from the source series.
- n_obs_vov, the observation count in the window, which reads 21 once the name is warm.
- Daily cross-sectional percentile and z-score fields for both scores.
- A settlement flag separating today's provisional value from the fixed close-of-day number.
This is a tail flag, not a factor. Across the full universe the correlation with forward volatility is just 0.05 and non-monotonic. At the extreme it works: the top decile realizes 61% vol and 11% maximum single-day moves, against roughly 8% elsewhere.
The extreme decile is where this one earns its keep.
The published study on this dataset is the most qualified of the set, and it is reported that way. Across 280,105 settled rows, the correlation between vol-of-vol and forward realized volatility is 0.05, and sorting the universe into deciles does not produce a monotonic pattern. That rules out the obvious use: this is not a cross-sectional factor, and ranking the whole market by iv_vov will not sort forward volatility.
What survives is the tail, and the tail is worth having. The top decile realizes 61% volatility over the following period and 11% maximum single-day moves, against roughly 8% elsewhere. That makes the dataset a screen for where the next violent move is more likely to land, and a filter for the opposite case: strategies that depend on a stable vol regime, such as calendar spreads or short premium held through the month, fail loudest in names whose vol has been churning. Used as a veto on other screens rather than as an entry signal, it does work the other two volatility datasets cannot.
- Isolate the tail with min_iv_vov_rank=0.9 instead of sorting the full universe by iv_vov.
- Filter the other way for regime-dependent trades: cap max_iv_vov before putting on a position that needs vol to sit still.
- Compare iv_vov against hv_vov; implied churning while realized is steady is repricing, not movement.
- Use it as a veto on short-premium candidates from IV/HV Premium rather than as a standalone entry.
- Check n_obs_vov is 21 and trace iv_mean_21 and iv_std_21 before acting on any single score.
A 21-observation window on the same vol series, then frozen.
The inputs are the same daily implied and realized vol series that feeds the IV/HV Premium dataset: at-the-money implied vol from the listed expiry nearest 30 calendar days, and 30 trading days of close-to-close realized vol, both annualized, over the same point-in-time liquid US-equity universe. Nothing is re-solved here. Each score is computed from a strict window of the last 21 observations for that ticker, so the first month of any name's history is absent while the window warms up, and n_obs_vov reports the count behind every row. Daily cross-sectional percentiles and z-scores are then computed across that day's universe, which is how one dimensionless score becomes a ranking.
Today's row is live. Through the session it refreshes roughly every 30 minutes between 09:30 and 16:00 ET carrying is_final = 0, marking a provisional value that can still move. After the close, around 16:30 ET, the settled value is written with is_final = 1, and from that point the date is fixed and never retroactively altered. Every past date is always 1. By default the endpoint returns the latest value per date and ticker, which during the session is today's provisional number; pass only_final=true for settled rows only. Exactly one row per date and ticker is guaranteed.
The score, and the two numbers underneath it.
The headline fields below are a subset. Every field, with exact types and semantics, is documented in the API reference.
| Field | Type | What it tells you |
|---|---|---|
| date | string | Trading date the window was measured to |
| ticker | string | Underlying symbol |
| iv_vov | float | Instability of implied vol over the trailing 21 observations; dimensionless |
| hv_vov | float | The same score for realized vol; the comparison against iv_vov separates repricing from movement |
| iv_mean_21 | float | Average implied vol across the window; the denominator of iv_vov |
| iv_std_21 | float | Standard deviation of implied vol across the window; the numerator of iv_vov |
| iv | float | Latest annualized implied vol, carried across from the source series |
| hv | float | Latest annualized 30-trading-day realized vol, carried across from the source series |
| n_obs_vov | integer | Observations in the window; reads 21 once the name is warm |
| iv_vov_cs_ranked | float | Where this name's implied vol-of-vol sits across the day's universe, 0 to 1; the tail-screening field |
| iv_vov_cs_z | float | The same reading as a z-score; hv_vov_cs_ranked and hv_vov_cs_z do the same for realized |
| is_final | integer | 0 for today's provisional intraday value, 1 for a settled row. Every past date is 1 |
One call ranks the day by volatility instability.
One key works across the REST API, the hosted MCP server, and this dashboard. Every response is JSON with a { count, data } envelope.
import requests
url = "https://api.alphanume.com/v1/vol-of-vol"
params = {
"min_iv_vov_rank": 0.9,
"only_final": "true",
"api_key": "alp_abc123"
}
r = requests.get(url, params=params)
print(r.json())curl "https://api.alphanume.com/v1/vol-of-vol?min_iv_vov_rank=0.9&only_final=true&api_key=alp_abc123"{
"count": 1,
"data": [
{
"date": "2026-06-12",
"ticker": "AAPL",
"iv": 0.1795,
"iv_vov": 0.084,
"iv_mean_21": 0.1822,
"iv_std_21": 0.0153,
"hv": 0.2333,
"hv_vov": 0.121,
"hv_mean_21": 0.2210,
"hv_std_21": 0.0267,
"n_obs_vov": 21,
"notional_volume": 8410000000,
"iv_vov_cs_ranked": 0.41,
"iv_vov_cs_z": -0.22,
"hv_vov_cs_ranked": 0.73,
"hv_vov_cs_z": 0.64,
"is_final": 1,
"last_updated": "2026-06-12 16:31:22"
}
]
}What this data does not claim.
- The middle of the distribution carries no reliable ordering. A name at the 60th percentile is not meaningfully more unstable than one at the 40th, which is why the screening fields exist and raw sorting does not help.
- The first month of every ticker's history is missing while the 21-observation window warms up, and n_obs_vov below 21 marks a window that is not yet full.
- The score has no level and no direction in it. A name whose vol has sat steadily at 80% scores low, and a name flipping between 15% and 25% scores high.
- iv and hv on these rows are the latest values carried across from the source series, not recomputed here, so they are a reference rather than the input to the score on that row.
- Rows carrying is_final = 0 are today's provisional intraday value and can move before the close. Pull with only_final=true for research.
Asked by researchers, answered plainly.
Why is vol-of-vol measured as a coefficient of variation?
Because the alternative does not compare across names. The standard deviation of a name's volatility scales with how volatile that name is, so a raw measure would rank the highest-vol stocks at the top every day regardless of whether their vol was actually unstable. Dividing by the mean removes the level and leaves a unitless proportion, which is what makes one threshold work across the whole universe.
What is the difference between high volatility and high vol-of-vol?
A stock parked at 80% implied vol for a month is highly volatile and perfectly stable: its vol-of-vol is low. A stock whose implied vol ran 15%, then 25%, then 18%, then 30% is not especially volatile in level terms but its vol-of-vol is high. The first is a known quantity you can price. The second is a name whose pricing assumptions keep breaking.
Why does a ticker's vol-of-vol history start about a month late?
The score needs 21 observations of that name's own vol before it means anything, so nothing is served until the window fills. A ticker that entered the universe on the first of the month simply has no rows until roughly the end of it. n_obs_vov on every row lets you confirm the window is full rather than assuming it.
Can implied vol-of-vol and realized vol-of-vol disagree?
Often, and the disagreement is the interesting part. iv_vov high with hv_vov low means the options market keeps repricing expectations while the stock's actual behavior has not changed, which tends to cluster around scheduled catalysts and news flow. The reverse, realized churning while implied sits still, means the market is treating recent erratic movement as noise, which is a different and usually shorter-lived condition.
Available with Pro. Enterprise for teams.
New REST API and MCP access requires Pro or Enterprise. Public dashboard previews are separate from a subscription. Pro includes the available historical record, current updates, REST, MCP, dashboard exports, and every standard dataset as it launches. Explore the dashboard preview before subscribing; its existing limits still apply.