The crash week. Every contract in it.
SPY and NVDA, 16–20 March 2020 — the week the market went vertical — full end-of-day chain, every strike, every expiry: bid/ask with sizes, volume, open interest, IV and greeks, and the underlying print. 68,250 rows, 36 fields, 4.6 MB, no email, no account. The same pipeline and the same schema as a paid order — so what you check here is what you get at scale.
One zip, everything in it
closebell-sample-2020-03-16.zip — 4.6 MB. Unpacks to 17.2 MB of CSV + Parquet plus the manifest, the quality report and the verify script. No trial period, no sign-up, no "contact sales".
SHA256 29380cad2da4e58bf9f8006d99c2180378af83c7d0babcc107840b95a40e3ea4
closebell-sample-2020-03-16.zip
Download the sample
What's inside
| File | What it is |
|---|---|
data/sample/SPY/2020-03-16.csv … 2020-03-20.csv | 57,728 SPY contracts, one file per session (~2.5 MB each) |
data/sample/NVDA/2020-03-16.csv … 2020-03-20.csv | 10,522 NVDA contracts, one file per session (~440 KB each) |
data/sample/spy-2020-03-16_2020-03-20.parquet | the SPY week in one Parquet file (2.5 MB) |
data/sample/nvda-2020-03-16_2020-03-20.parquet | the NVDA week in one Parquet file (455 KB) |
data/sample/SHA256SUMS | SHA-256 for every data file |
catalog/sample-manifest.json | row counts, sizes, hashes, the exact column list |
catalog/quality.json | measured quality: quote coverage, zero-bid share, put-call parity by day |
pipeline/verify.py | the acceptance checks, runnable in one line |
36 columns, fixed order: the contract, the quote with sizes and timestamp,
volume and open interest, OHLC where traded, IV and the full greek set, the underlying close, and the
provenance columns (source, ingest_utc). Every field is documented in the
field dictionary.
Real rows, verbatim
From 2020-03-19, the day NVDA closed at 212.97 and SPY at 240.51. Nothing
rounded, nothing restated:
| contract | exp | type | strike | bid | ask | IV | delta | time |
|---|---|---|---|---|---|---|---|---|
| SPY200320C00050000 | 2020-03-20 | call | 50.00 | 190.06 | 190.80 | 0.0149 | +1.0000 | 16:00:00 |
| SPY200320P00050000 | 2020-03-20 | put | 50.00 | 0.00 | 0.01 | 9.4000 | −0.0003 | 16:00:00 |
| NVDA200619C00440000 | 2020-06-19 | call | 440.00 | 0.12 | 0.31 | 0.5905 | +0.0108 | 16:00:00 |
| NVDA200619P00440000 | 2020-06-19 | put | 440.00 | 224.50 | 229.50 | 0.5807 | −0.9904 | 16:00:00 |
| NVDA200918C00450000 | 2020-09-18 | call | 450.00 | 0.10 | 0.47 | 0.4441 | +0.0133 | 16:00:00 |
That 9.40 IV on the 50-strike SPY put is
honest: it is a dead 0.01-ask tail contract, and the zero-bid share of the sample is in the quality report
(5.3% SPY / 10.2% NVDA) instead of being quietly cleaned out of the file.
Verify it before you trust it
# hashes for every data file cd closebell-sample-2020-03-16/data/sample sha256sum -c SHA256SUMS # the full acceptance suite — exits non-zero on any hard failure uv run --with duckdb python pipeline/verify.py
What the script checks: every SHA-256 against the manifest; the header against the declared schema; duplicate contract-days; crossed quotes (bid ≥ ask); that every row carries an underlying print; put-call parity on matched call/put pairs; and that a split re-lists at the adjusted strike. It is the same suite a paid delivery runs, so the bar you're testing is the bar you're buying.
Load it in three lines
pandas
import pandas as pd
df = pd.read_csv("data/sample/SPY/2020-03-19.csv")
df[(df.strike == 240.00) & (df.type == "call")][
["contract","bid","ask","iv","delta"]]
duckdb
import duckdb
duckdb.sql("""
select contract, strike, bid, ask, iv, delta
from 'data/sample/spy-*.parquet'
where quote_date = '2020-03-19'
and strike between 230 and 250
""").df()
Before you backtest it
- The quote is a mark, not a fill.
quote_timeis16:00:00ET: the last consolidated top of book at or before the close. A real 15:45 fill is a priced option, not a checkbox. - Zero-bid rows are real. 5.3% (SPY) / 10.2% (NVDA) of the sample are dead tail contracts — listed, not filled. They are in the file and the report; you decide how to treat them.
- Parity is a measured floor. On 2020-03-19 the median put-call parity residual is 0.66% of spot for SPY (95.2% of pairs within 1% on 03-20). "0.00%" on a file like this would mean the quotes are not real closes.
- Strikes are as listed on each session. These are pre-split NVDA dollars (the 10:1 split is 2024-06-10); the adjusted re-listing and the mapping rule are in the split post.
Any other pair, any other week, same day.
Send two names and a window and you get the same extract format — or buy what you need below.