Cboe Global Markets
Cboe index data — The VIX and its family, as daily CSVs from the exchange that computes them
When you need the volatility index from the source that computes it, with the full history since 1990, or its siblings (VIX9D, VIX3M, VVIX, SKEW) to read the term structure.
Reach for it when…
When you need the volatility index from the source that computes it, with the full history since 1990, or its siblings (VIX9D, VIX3M, VVIX, SKEW) to read the term structure.
Not for: Option chains and implied vols by strike (a broker or a paid feed), realised volatility (compute it from prices), anything intraday.
Units, revisions, traps
Units. Annualised implied volatility in percent — a VIX of 20 means the S&P 500 is priced to move about 20% over a year, or about 1.3% a day (20 ÷ √252).
Revisions. Not revised. The methodology changed in 2003 and 2014; the pre-2003 history is a back-cast under the newer method.
- Dates in the CSV are MM/DD/YYYY — parse with a format string.
- VIX is a level, not a return: compare regimes (below 15, 15–25, above 30), do not difference it.
- Spot VIX is not tradable; the futures curve (contango or backwardation) is the second thing to read.
Classic mistake: Treating VIX 30 as 'the market will fall 30%'.
Three recipes
- Recipe 1 · VIX since 1990, with regimes
- Recipe 2 · The term structure: 9-day, 30-day, 3-month
- Recipe 3 · VIX against the S&P 500's realised volatility
Each recipe: Python · Excel · Sheets, with how to read the result. Python recipes run under pandas; recipe 1 is re-run by the weekly check where the source allows it.
How to use it in your own work
Copy the snippet, change the series id, read the result the way the footer says. Replace YOUR_…_KEY with your own key where one is needed.
Recipe 1VIX since 1990, with regimes
import pandas as pd
u = "https://cdn.cboe.com/api/global/us_indices/daily_prices/VIX_History.csv"
df = pd.read_csv(u, parse_dates=["DATE"], date_format="%m/%d/%Y").set_index("DATE")
vix = df["CLOSE"]
print(vix.tail(), "\nabove 30 on", (vix > 30).sum(), "days of", len(vix))- Data → From Web → the CSV URL → Load; format the DATE column.
=IMPORTDATA("https://cdn.cboe.com/api/global/us_indices/daily_prices/VIX_History.csv")Recipe 2The term structure: 9-day, 30-day, 3-month
import pandas as pd
base = "https://cdn.cboe.com/api/global/us_indices/daily_prices/"
parts = {k: pd.read_csv(base + f + ".csv", parse_dates=["DATE"], date_format="%m/%d/%Y").set_index("DATE")["CLOSE"] for k, f in
{"9d": "VIX9D_History", "30d": "VIX_History", "3m": "VIX3M_History"}.items()}
ts = pd.DataFrame(parts).dropna()
ts["inverted"] = ts["9d"] > ts["3m"]
print(ts.tail())- Three From Web queries (VIX9D_History.csv, VIX_History.csv, VIX3M_History.csv) merged on DATE.
- Three =IMPORTDATA calls and a VLOOKUP on the date.
Recipe 3VIX against the S&P 500's realised volatility
# implied (VIX) vs realised (21-day, annualised) using Stooq for the index
import pandas as pd, numpy as np
vix = pd.read_csv("https://cdn.cboe.com/api/global/us_indices/daily_prices/VIX_History.csv", parse_dates=["DATE"], date_format="%m/%d/%Y").set_index("DATE")["CLOSE"]
spx = pd.read_csv("https://stooq.com/q/d/l/?s=%5Espx&i=d", parse_dates=["Date"]).set_index("Date")["Close"]
rv = np.log(spx).diff().rolling(21).std() * np.sqrt(252) * 100
print(pd.DataFrame({"VIX": vix, "realised": rv}).dropna().tail())- VIX CSV plus an index price CSV; a 21-day STDEV of log returns × SQRT(252) × 100.
- Same two IMPORTDATA calls and a rolling STDEV column.
Series → question map
The ids we use from Cboe index data, each with the question it answers. The catalog's compare view reads the concept tags behind these rows.
| Series | Answers | Region | Concept |
|---|---|---|---|
| VIX_History | How scared is the market? | United States | vix |
| VIX9D_History | Is short-dated fear spiking? | United States | vix |
| VIX3M_History | Is the vol curve inverted? | United States | vix |
| VVIX_History | How volatile is the VIX itself? | United States | vix |
Compare with
Same question, different source: Stooq, CFTC Commitments of Traders, FRED. The compare view lines up coverage, frequency, history and access side by side and lists what the combination makes possible.
Open compare: Cboe index data · Stooq · CFTC Commitments of Traders →
Questions readers ask
Can I use Cboe's VIX CSV in a product?
Personal and research use is free; publishing or redistributing the values needs a Cboe data licence. Link to the page rather than reposting the file.
Does FRED have the VIX?
Yes, VIXCLS, one day behind — convenient when you already pull from FRED.
Why is the pre-2003 VIX different?
It was recomputed under the 2003 methodology (S&P 500 options, all strikes). The original 1990s VIX (now VXO) used S&P 100 at-the-money options.
Educational only — we explain, we never advise · snippet licence: public domain · corrections to [email protected], fixed within a day and logged in the changelog.