DashboardThree-Axis ProbesCrypto Shared Data PoolThe forex data-availability probe

finding · findings/evolution/shared_data/forex-availability-probe.md

The forex data-availability probe: "is the EURUSD data really there, and exactly what should we grab?"

A quick, look-but-don't-touch inventory check that confirmed our euro/dollar (EURUSD) forex price data actually exists on the research server, then pinned down the precise 42-item shopping list of data fields a future analysis should pull. It has since been shelved — forex is out of scope for now — but the homework is saved so nobody has to re-do it.

In plain English. Before building anything on top of a dataset, you first walk into the warehouse and check two things: is the box of goods actually on the shelf, and which specific items inside the box do we want. This probe did exactly that for foreign-exchange (forex) data — the euro-vs-dollar exchange rate. It confirmed the data is there in full (over 7 million records, no holes), then wrote down a tidy 42-item picking list and deliberately left out the things that would either contaminate the analysis or just waste space. Then the whole forex idea got parked, so this note is the saved receipt for whenever someone restarts it.

What is this?

One term, defined once. dbps = "decimal basis points," the unit for how big a price move triggers a new bar. 1 dbps = 0.001%. So 5 dbps = 0.005% — a very small move, which makes sense for forex where the euro/dollar rate barely budges compared to crypto. A small threshold means many bars get created, giving a fine-grained view of price action.

Why it matters

What the probe found (A2: does the data exist?)

Two simple look-only queries were run. The first just listed the tables in the fxview_cache database and confirmed forex_bars is present (22 tables total). The second counted the actual EURUSD records at the 5 dbps setting:

7.24M
Total EURUSD bars on the server
5.50M
Bars inside the research window
2018→2026
Coverage span (Jan 2018 → May 2026)
5 dbps
Bar trigger size (0.005%)

A bonus fix: the column names were wrong in the code

The fetching code had been guessing two column names. The probe revealed the real names, which happen to match the crypto table's conventions exactly — so no special renaming logic is needed:

What the code assumedActual name on the server
symbol_normalizedsymbol  same as crypto
threshold_dbpsthreshold_decimal_bps  same as crypto

What the probe decided (A3: which columns to take?)

The table has 201 columns — far richer than the crypto equivalent (~50 columns). The probe sorted every column into a category and applied one clear rule:

Include columns that are populated and are genuine, non-forward-looking feature candidates (raw ingredients for analysis). Exclude labels, not-yet-implemented columns, pre-derived rankings, bookkeeping metadata, and empty placeholders.

The single most important exclusion is the 32 "label" columns — these are forward-looking (they describe what happened in the future relative to each bar). Including them in an analysis that's meant to find patterns would be leakage: like grading your own exam with the answer key visible. They're excluded by design.

The 201 columns, sorted

Category~CountKept?Why
Core: time, OHLC, identifiers8subsetDrop redundant IDs, keep the essentials
Quote: bid / ask prices8subsetKeep bid_close, ask_close
Spread: gap between buy & sell price9subsetKeep close, mean, variance
Quote activity (counts, duration)3subsetKeep quote_count, duration_us
Session flags + label5subsetKeep session_label (London / NY etc.)
Intra-bar features (within one bar)9all 9Genuine ingredients
Lookback features (recent-history window)10all 10Genuine ingredients
Active microstructure (volatility, liquidity, etc.)~40 activetop 10Best volatility / liquidity / jump signals
Forward-looking labels32excludedWould leak the future into the analysis
Deferred / always-empty features7excludedNULL by design — no data in them
Pre-computed rankings (quintiles, etc.)~40excludedCan be re-derived from base columns later
Governance / provenance metadata~10excludedBookkeeping, not analysis input
Gap-detection placeholders2excludedHardcoded empty

Key numbers

201
Total columns in the forex table
169
Non-label candidate columns
42
Columns actually selected (v1)
32
Forward-looking labels excluded

Why 42 — and not all 169?

What it means for scope

Bottom line. The euro/dollar forex data is confirmed present and complete (5.5M clean bars in-window), and the exact 42-column "what to fetch" list is locked with future-leaking labels excluded by design — all saved on ice so that whenever forex comes back into scope, the team can pick up exactly where this left off without re-checking the warehouse.