The $9 Kalshi Microstructure Tryout contains the July 18 and July 19 write partitions from the $199 full tape. This walkthrough shows how to verify your ZIP, inspect recorded spreads and depth, and compare taker flow with later recorded prices. It describes this release's observations; it does not establish a trading strategy, causal response or profitable result.
Download the versioned analysis script, then run it against your tryout ZIP. It reads the Parquet payload directly, verifies the pinned manifest and every shipped member, and writes report.json, CSV tables, matching Markdown tables and optional PNG charts. It does not require the older, absent SOURCE_MANIFEST.json or TRYOUT_STATS.json files.
What's in this release
The payload was fully re-counted against release tryout-2026-07-18_2026-07-19-reviewed-20261003. Each Parquet file's scanned row count agrees with its footer and the pinned manifest; trade IDs are unique.
| Payload recount | Rows |
|---|---|
| Order-book depth | 21,520,801 |
| Unique trade prints | 746,902 |
The depth rows contain 40 ticker families and 1,848 distinct tickers. Trade prints were recorded in these families:
| Recorded trade family | Prints |
|---|---|
KXMLBGAME |
596,392 |
KXWNBAGAME |
150,097 |
KXNFLGAME |
401 |
KXNCAAFGAME |
12 |
These are recorded print families, not a claim that other families did not trade on the exchange. Family prefixes identify markets; they do not independently verify event-to-season mapping or complete sport coverage. The small NFL and college-football samples do not support a sport-level trading conclusion.
Three clocks you must keep separate
The filenames identify write partitions. The depth timestamp records an observation; trade created_time is exchange time; trade capture_ts is retrieval time. They do not have identical bounds:
| Clock (UTC, displayed to milliseconds) | Earliest | Latest |
|---|---|---|
| Depth observation | 2026-07-17T23:59:42.416+00:00 | 2026-07-19T23:59:06.938+00:00 |
| Trade exchange | 2026-07-18T00:00:00.062+00:00 | 2026-07-19T23:59:59.940+00:00 |
| Trade retrieval | 2026-07-18T00:00:02.138+00:00 | 2026-09-12T19:47:07.148+00:00 |
In particular, some July exchange-time prints were retrieved much later. The embedded game_state and score_diff fields describe retrieval-time context, not the game state when a trade occurred. This script does not turn score-label changes into scoring events, tag a book using those labels at exchange time, or estimate repricing after a score. That would require a separately verified event-time score timeline.
The recorded retrieval-minus-exchange offset has a median of 49.8s and a 95th percentile of 121.2s; 4 rows have small negative offsets (the minimum is -0.013s). These are clock differences in the file, not execution latency or precise exchange-to-recorder latency guarantees.
Example 1 — inspect a market's spread and depth
The script selects the MLB game ticker with the most recorded prints, rather than the largest contract volume. Here it is KXMLBGAME-26JUL182008SFSEA-SF, with 20,173 prints and 1,289 two-sided level-0 snapshots. If print counts tie, ticker order breaks the tie reproducibly.
| Snapshot UTC date | Two-sided snapshots | Median spread | Median level-0 depth (contracts) |
|---|---|---|---|
| 2026-07-18 | 1,019 | 1c | 774,994.0 |
| 2026-07-19 | 270 | 1c | 143,394.5 |
Across this ticker's usable snapshots, the median spread is 1c, the mean is 1.02c, and the maximum is 4c. Level-0 depth means recorded best-bid size plus best-ask size, not the whole book or guaranteed executable size. The daily depth difference is a description of observations grouped by UTC date; it is not a pregame/live comparison.
The generated price chart places snapshot mids on their observation clock and print prices on their exchange clock. It does not attach inferred score events to either series. Use the exported selected_ticker_books.csv to inspect individual snapshots before designing a more specific research question.
Example 2 — measure changes between usable book observations
Depth is polled rather than streamed. For all MLB game tickers, compare each usable two-sided observation with the previous usable observation of that ticker, only when they are at most 120s apart:
| Consecutive usable MLB book observations | Value |
|---|---|
| Pairs at most 120s apart | 100,676 |
| Longer-gap pairs excluded | 99 |
| Both best quotes unchanged | 90.4% |
| Median absolute mid-price change | 0.0c |
| Absolute mid-price change at least 1c | 8.2% |
“Unchanged” means the recorded best bid and best ask match. It does not mean no trades occurred, the feed was stale, or the entire book stayed unchanged. Longer gaps are excluded; one-sided observations cannot supply a midpoint. These changes describe consecutive usable recorded books, not score-response speed or every intervening exchange update.
Here is the separate global observation cadence and market-selection summary:
| Recorded depth cadence / market selection | Value |
|---|---|
| Global observation timestamps | 4,013 |
| Median interval | 43.1s |
| Largest interval | 77.3s |
| Global gaps longer than 120s | 0 |
| Median tickers at a timestamp | 150 |
| Minimum tickers at a timestamp | 138 |
A short global interval does not guarantee a particular ticker was captured throughout that interval. The recorder selected a subset of markets and capped depth at 20 levels per side; absence from the payload does not prove absence from the exchange.
Example 3 — compare taker flow with the next recorded price window
For MLB game tickers, put prints into UTC 15-minute bins using created_time. Contract counts retain their fractional values. Signed imbalance is (YES-taker contracts − NO-taker contracts) / total contracts; NO-heavy means below −0.3, YES-heavy means above +0.3, and Balanced includes both boundaries.
Pair only bins exactly one interval apart, requiring at least 5 prints in each bin and positive contract volume. A missing bin is not silently replaced by the next nonempty bin. Exclude any bin whose latest exchange timestamp has conflicting print prices, since its last price is ambiguous. This run excludes 17 ambiguous endpoint bins and retains 1,368 pairs across 84 tickers.
The outcome is the last recorded YES print price in the next bin minus the last recorded YES print price in the current bin. It is not a return available at a specified fill price.
| Signed taker-contract imbalance | Window pairs | Mean next-window last-print move | Median move |
|---|---|---|---|
| NO-heavy | 58 | -0.26c | 0c |
| Balanced | 180 | +0.35c | 0c |
| YES-heavy | 1,130 | -0.08c | 0c |
The descriptive Pearson correlation is r = -0.0136. These means and correlation summarize this slice. Repeated tickers and overlapping window pairs are dependent observations, so no independent-observation confidence intervals are reported. The table does not establish predictability, absence of predictability, or profitability. A strategy study would need a longer sample, a dependence-aware validation design, realistic fills and fees.
Payload self-checks and limits
| Payload self-check | Result |
|---|---|
| Depth price range | 1–99c |
| Depth level range | 0–19 |
| Negative/nonfinite depth sizes | 0 |
| Negative/nonfinite trade counts | 0 |
| Fractional trade-count rows | 444,360 |
| YES + NO price differs from 100c | 0 |
| Two-sided level-0 snapshots | 553,843 |
| One-sided level-0 snapshots | 47,845 |
| Crossed / locked level-0 books | 0 / 0 |
Historical depth sizes in this release were integer-truncated at capture; lost fractions cannot be reconstructed. Trade counts were rebuilt from the raw capture and preserve fractions. A clean bounds/hash check verifies the shipped bytes and selected field constraints; it does not establish completeness, precise quantities that were never retained, or future data quality.
SCHEMA.md documents these clock and precision limits. The shipped COVERAGE.md also contains full-tape figures and windows, so use this guide's recount for the tryout slice rather than applying the full-tape totals to it. The manifest's nested coverage_summary.review_status still says awaiting_review, while its top-level status and release_review say reviewed; the pins below identify the exact bytes used, including that metadata inconsistency.
Reproduce this version
Install pandas, numpy and pyarrow in your own Python environment; add matplotlib if you want the optional charts. No network access or extraction is needed during analysis. The depth scan uses batches rather than loading every depth row into one dataframe.
python3 first_insight_kalshi_tryout.py --zip /path/to/kalshi_micro_tryout.zip --outdir first_insight_outputs
The script accepts the pinned manifest and member contents. A buyer watermark in the ZIP comment can change the whole-ZIP hash without changing those contents. Use --require-canonical-zip only for the unmodified publisher ZIP used for this walkthrough.
Publisher ZIP SHA-256:
5e590cac70c821030f87bbd57d9a4560a072c67a46f9ed37ffd4aca1ed0bfc7c
Manifest SHA-256:
0f5cb6194e13d96b01dccdc62d7787ae650c291924e2457a48aa73078c6614e3
Schema SHA-256:
78caa56548a60d5dd599d6bddbe2c7cd41c1fa26e5fc5072022d58a99dff494d
Analysis script SHA-256:
6f2af7d54e075fe45525e2f4fa7fa89c7f19804278da92d48f4af4dbf64df744
The script's guide_tables.md reproduces the tables in this post from report.json. The publisher reran the pinned ZIP and checked those tables, prose figures and the script cache key against the resulting report. Runtime depends on your machine; optional charts do not affect the tabular results.
Try it yourself: download this script version, then get the $9 tryout. If its recorded structure and limitations fit your research, review the $199 full tape and its broader coverage disclosures before buying.