DashboardThree-Axis ProbesCrypto Shared Data PoolHow the data is sliced — and why

finding · findings/evolution/shared_data/slicing-methodology.md

How the data is sliced — and why

A guided tour of how the shared crypto market-data pool is cut into ~441 testable pieces — across time, across coins, and across "how big a price move counts as a bar" — and the plain-English reasoning behind every cut.

In plain English. Imagine you want to know whether a measurement tool is reliable. You wouldn't test it once — you'd test it on lots of different samples and check the answer stays the same. That's exactly what this page describes: we chop the crypto price history into a grid of independent samples along three directions — when (21 two-month time windows), which coin (6 cryptocurrencies), and how sensitive the bar is (4 price-move thresholds). Every combination is one test cell. If a research verdict survives across hundreds of these cells, it's trustworthy; if it only holds in a few, it's a fluke.

What is this?

The shared data pool is the central data layer that every research "probe" reads from. Rather than test a hypothesis on one blob of data, we slice the available history into a clean grid of cells. Each cell is one self-contained sample. Slicing along three independent ("orthogonal" — meaning they don't interfere with each other) directions lets us ask three separate reliability questions at once.

3
slicing axes (time · symbol · threshold)
441
total cells (438 populated)
21
active time windows (K)
6
crypto symbols

The three slicing dimensions

As of 2026-05-30 the pool is crypto-only (forex was removed — see below). The data lives in ClickHouse (a fast analytical database) on the bigblack server, and is read read-only, on demand — there is no intermediate file-export step.

The cross-product is 21 (symbol, threshold) combinations × 21 time slices = 441 cells, of which 438 actually contain data.

What's a "threshold" in dbps? A bar is closed whenever the price moves a fixed percentage away from where the bar opened. The threshold is measured in dbps (decimal basis points): 1 dbps = 0.001%, so 250 dbps = 0.25%. A lower threshold (100 dbps) snaps off many small bars; a higher threshold (750 dbps) waits for a bigger move, so it produces far fewer bars.

Why three axes?

Each axis answers a different "would this verdict hold up?" question:

Varying the verdict across this much real, varied data is our complete substitute for synthetic-data calibration — the project's policy is to never use made-up data, so instead we lean on the diversity of real data.

Why ~21 time windows?

The schedule originally defined 24 windows, but the three 2020 windows (slice22/23/24) were dropped because BTC/ETH bars don't exist before 2021 — those cells would be empty or ragged. So the active count is K = 21.

The catch — "effective" sample size. The 21 slices aren't fully independent: adjacent windows in the same calendar quarter usually sit inside the same market regime. So the truly independent count is closer to ~7 regime epochs, not 21. Robustness is therefore read per epoch, not per raw slice.

Where K=24 came from

The 24-fold number is inherited from Terry's walk-forward optimization (WFO — a backtesting method that repeatedly trains on a past window and tests on the next), which uses 24 folds as its working standard. His own note records:

"Doubled folds from 12 to 24 ... TAMRS-lite wins 5/6 metrics ... its win is robust across 10, 12, 24 folds on three different data sources."

Matching that K keeps this audit aligned with his cross-audit convention.

The statistics behind K=24

When you average many per-slice numbers into one summary, the uncertainty (standard error) shrinks roughly as 1/√K — i.e. more slices = a steadier average, with diminishing returns. The table shows that K=24 sits right at the "sweet spot" where adding more slices barely helps:

K (number of slices)Standard-error multiplier
(vs K=10)
Reliability of the lower quartile
101.00 (baseline)crude — position 3 of 10
200.71better — position 5-6 of 20
240.65robust — position 6-7 of 24
300.58strong — position 8 of 30
500.45diminishing returns from here

At the active K=21 the multiplier is ~0.69 vs K=24's 0.65 — a negligible precision loss. Going to K=30 buys only a marginal gain; K=50 buys almost nothing.

Does the calendar even fit?

24 windows × 2 months = 48 months of data needed. The available history is ~78 months (2020-04 → 2026-02 ≈ 6.5 years), so the schedule uses 62% of the calendar.

ConstraintStatus
Calendar coverage48 / 78 months = 62% of available calendar in use
Adjacent-slice gapExactly 1 calendar month. Every 3rd month of each quarter (Mar / Jun / Sep / Dec) is skipped by design. Example: one slice ends Nov 30 and the next starts Jan 1, skipping December.
Regime-overlap riskModerate — a 1-month gap is shorter than many crypto regimes, so adjacent same-quarter slices often share a macro regime. No-overlap is guaranteed; regime-independence is NOT. Verdicts that need independence should treat the slices as ~12-16 effective regime samples.
Earliest slice fits all symbolsThe earliest scheduled slice (slice24, starting 2020-04-01) falls after all 6 default symbols were listed.

Why not push K higher (30, 50)?

K=24 is the upper bound before you'd have to sacrifice something:

Why 2-month windows (not 1, not 3+)?

This is a bar-density trade-off: each window must contain enough bars for the statistics to converge, even at the sparsest threshold and in the quietest months. Here's roughly how many bars a window yields for BTC at each threshold:

ThresholdApprox bars/day (BTC)1 month2 months3 months
100 dbps500–3,00015k–90k30k–180k45k–270k
250 dbps150–8004.5k–24k9k–48k13.5k–72k
500 dbps50–2001.5k–6k3k–12k4.5k–18k
750 dbps20–1000.6k–3k1.2k–6k1.8k–9k

Now compare against the minimum sample size (N) each measurement tool needs to give a stable answer. These tools measure how strongly two things relate — from simple linear correlation up to multi-variable information measures:

MetricWhat it measures (plain words)N needed
Pearson r, Spearman ρsstraight-line / rank correlation between two variables≥ 100
Chatterjee ξna modern correlation that catches non-linear dependence≥ 1,000
HSIC / HSICAggkernel-based "any kind of dependence" test≥ 1,000
dCordistance correlation (non-linear)≥ 500
MICmaximal information coefficient≥ 1,000
CODEC / FOCIconditional-dependence / feature selection≥ 1,000
O-information (triples)shared information among three variables≥ 2,000

Putting the two together at the sparsest threshold (750 dbps), the window choice falls out cleanly:

Window750 dbps worst caseVerdict
1 month~600 bars❌ below the Chatterjee floor in quiet months
2 months~1,200 bars✅ clears Chatterjee; marginal for O-information
3 months~1,800 bars✅ comfortable — but uses 50% more calendar
2 months is the smallest window that's safe at all four crypto thresholds while keeping calendar consumption reasonable.

Why these 6 symbols?

The six coins were chosen to span market "caps" (sizes) and categories, while staying inside the symbols that have full data coverage:

SymbolTrade-layer effective_startIncluded?Reason
BTCUSDT2018-01-16enabled, live-stream, full 4-threshold (large-cap)
ETHUSDT2018-01-16enabled, live-stream; thresholds [100, 250] only
BNBUSDT2018-01-16full 4-threshold, mid-cap diversity
LTCUSDT2018-01-16full 4-threshold, alt-cap diversity
ADAUSDTlisting 2018-04-17full 4-threshold; already in prior robustness work
XRPUSDTlisting 2018-05-04full 4-threshold, payment-token category
Two start dates, don't be fooled. The 2018 dates above are the trade-layer start (when raw trades exist). But at the bar layer (what the probe actually reads), every default symbol starts 2021-01-01 — which is exactly why the 2020 slices were dropped. The 2018 dates are kept only as historical rationale for the original symbol pick.

Why not more symbols (e.g. 16)?

Going from 6 → 16 crypto symbols would add ~900 more database fetches (~15 min), ~3–7 GB more disk on bigblack, and stronger cross-symbol evidence (16 coins agreeing is more credible than 6). That's catalogued as Option C in the expansion options doc. The default is deliberately the minimal scope; expanding is a single pre-spec amendment away.

Why was forex removed?

Version 1 of the pool included EURUSD at 5 dbps as a cross-asset-class anchor. Version 2 removed forex entirely (operator directive, 2026-05-30) — the layer is crypto-only "for now." The forex availability probe and the reintroduction catalogue are preserved in the archived forex-availability-probe.md and scope-expansion-options.md for a later comeback.

Why threshold "tiers" (full vs spearman_only)?

Because bar density falls as the threshold rises, the sparsest threshold (750 dbps) routinely drops below the 1,000-bar floor the demanding metrics need. So thresholds are tiered by which metrics they can support:

ThresholdTier2-month bars (worst → median)Conditional metrics (h_norm / Chatterjee / CODEC)
100full14k → 130kreliable
250full2.6k → 20kreliable
500full0.7k → 5kreliable (rare sub-floor cell flagged)
750spearman_only0.24k → 2.5kunreliable — BTC/BNB@750 miss the floor in ~half the slices

So at 750 dbps, the simple Spearman rank correlation (which only needs ~100 points) stays valid, but the heavier conditional metrics (needing ≥1,000) are excluded wherever a cell misses the floor. The alternative — a special 3-month window just for 750 dbps — was rejected because it would break the clean, uniform 2-month / non-overlapping grid. Tiering keeps the grid tidy and is honest about which metrics each cell supports.

The rules that govern window selection

Each of the 24 scheduled windows was chosen to land in a distinct market-regime context. The governing principles:

What we inherit from Terry's WFO conventions — and what we don't

We adopt

  • The 24-fold standard (same K, same name).
  • Per-fold ISO boundary timestamps (slice_start_iso, slice_end_iso).
  • The no_overlap_proof assertion in the fetcher.
  • Per-fold telemetry JSON (a manifest.json record per cell).
  • Venue-time-authoritative ordering (close_time_us is the key; ingestion time is observability-only).
  • A hash-locked pre-spec (the pre-spec hash records the data-definition version).

We depart from

  • Train/test split per fold — his job is strategy backtesting (needs an out-of-sample test); ours is descriptive metric evaluation, so no split is needed.
  • Recent-data-weighted test window — his job is live deployment (recency matters); ours is regime variety (history matters).
  • 4-week training window — his job is parameter tuning; ours is metric stability.

Key numbers — the locked v2 scope

DecisionValueJustification
K (active slices)21 (24 scheduled − 3 for 2020)Precision sweet spot; 2020 dropped (no BTC/ETH bars). ~7 effective regime epochs.
Window size2 calendar monthsSmallest window bar-density-safe to 500 dbps; 750 tiered spearman_only.
Calendar span2021-01 → 2026-02Span where all 6 crypto symbols have bar-layer coverage.
Crypto symbols6: BTC, ETH, BNB, LTC, ADA, XRP (USDT)Cross-cap variety.
Crypto thresholds[100, 250, 500, 750] per symbolETH [100, 250]; LTC drops 100 (broken).
Threshold tiers100/250/500 = full; 750 = spearman_only750 below the 1,000-bar conditional-metric floor.
Forexremoved (v2)crypto-only for now; see Changelog.

Total cells = 441 (438 populated). There is no Parquet export step — the probe reads each cell read-only from ClickHouse on demand. Expansion paths (including forex reintroduction) stay parked in scope-expansion-options.md; escalating scope is a pre-spec version bump plus a probe-constant update.

Bottom line. The data is cut into a clean 441-cell grid — 21 two-month windows × 6 coins × up to 4 sensitivity thresholds — precisely sized so every cell holds enough bars to trust the statistics, no two windows overlap, and a research verdict only "counts" if it survives across time, coins, and thresholds.