DashboardThree-Axis ProbesCrypto Shared Data PoolThe orthogonality probe — plain-English guide

finding · findings/evolution/shared_data/orthogonality_probe.md

The orthogonality probe — does a new feature actually tell us anything new?

A small read-only tool that checks, on real market data, whether a candidate trading-signal feature is genuinely novel — or just a near-copy of something we already track. It does this across many symbols, sensitivity settings, and time windows, so a feature only earns a "novel" verdict if it holds up everywhere, not in one lucky stretch.

In plain English. Imagine you're building a panel of dashboard gauges for a car. Before you bolt on a new gauge, you want to know: does it show me something the existing gauges don't? A speedometer and an odometer measure different things — useful. But a second speedometer in km/h next to one in mph is redundant. This probe is the redundancy check: it compares a proposed new feature against everything already on the panel and reports how much fresh information it really adds — measured on actual price bars, in many different market conditions.

What is this?

This page is a plain-English guide to orthogonality_probe.py — a Python script that lives in the shared data layer. "Orthogonality" is just a fancy word for independence: two features are orthogonal if they don't move in lockstep, so each carries its own information. The probe measures that independence.

It is the Axis-1 engine of a three-axis system. Axis-1 answers one question only: is this candidate feature different enough from the ones we already have? (The other two axes — covered by sibling probes — check whether a feature is free of hand-tuned knobs, and whether it behaves the same no matter how it's implemented.)

What it replaced

How it works

The probe walks a grid of cells. One cell = one combination of (symbol, threshold, time-slice):

For each cell, on the real bars in that window, it computes two things:

Every candidate from the CANDIDATE_REGISTRY is computed per cell and dropped into the comparison matrix, so each candidate gets a regime-robust verdict across all slices — a judgment that holds across bull markets, bear markets, and quiet ranges — instead of a single-window snapshot that might just be luck. At the end, the probe writes a per-candidate cross-slice summary: pass-rate, median and worst (max) |ρ|, and which cell was the worst. That summary is the result you evaluate.

Which data it looks at

The list of symbols, thresholds, and windows isn't invented by the probe — it's locked in a separate single-source-of-truth document (pre-spec.md). The probe simply mirrors that scope in code; it never redefines it. Locking the scope up front (a "pre-registration") is what stops anyone quietly cherry-picking favorable windows after seeing the results.

The safety rails

Read-only — it can never change the data

SELECT-only via the local clickhouse-client. No INSERT/ALTER/DELETE/DROP/OPTIMIZE. Designed to run on bigblack. Single-core math (BLAS) by default, to stay polite on a shared host.

In plain terms: the probe can read the database but is structurally forbidden from writing, deleting, or reshaping anything. It also keeps a light footprint so it doesn't hog the shared machine. And it never stores raw bar values — only summary statistics — so nothing sensitive leaks into its output files.

Convergence floors — don't trust a number computed on too little data

A "floor" is a minimum sample size below which a statistic isn't trustworthy. The probe enforces two:

FloorValueWhat it means in plain words
LOOKBACK_COUNT200The rolling window a candidate needs to compute itself. Below 200 bars the window can't even fill, so the whole cell is skipped.
FLOOR_10001000Below 1,000 bars the fancier dependence metrics (h_norm, Chatterjee ξ, CODEC/FOCI, HSIC, MIC) become unreliable or undefined (NaN). Plain Spearman is still valid down to a floor of 100. Each cell reports meets_floor_1000, and the cross-slice summary only aggregates cells that clear it.

Key numbers

21
active time-slices (2021+)
6
crypto symbols in panel
200
min bars per cell (LOOKBACK)
1000
FLOOR_1000 reliability cutoff
40–200×
faster Spearman shortcut
2021-01-01
earliest BTC/ETH bar date
26
total bars in broken LTC@100
0
raw bar values stored

How to add a candidate, and run it

Adding a new candidate feature is one line in build_candidate_registry():

("bar_xyz", lambda x: my_fn(x)),   # x is a 1-D float window (df['close'], length 200) -> float

In words: you give it a name and a small function that takes a 200-long window of prices and returns a single number. The probe handles the rest.

Running it on bigblack (read-only):

# one-cell sanity check (default BTCUSDT@250/slice01)
python orthogonality_probe.py --smoke

# baseline matrix only — no antropy needed
python orthogonality_probe.py --smoke --no-candidates

# full grid, all candidates, all 21 slices
python orthogonality_probe.py

# restrict
python orthogonality_probe.py --symbols BTCUSDT,ETHUSDT --slices slice01,slice14

Use the spike virtual-environment (it has the antropy / sklearn libraries pre-installed): ~/venvs/orthogonal-features-phase2-spike/bin/python.

Outputs land in a local results/ folder (git-ignored, lives only on bigblack): per_cell_verdicts.jsonl plus candidate_robustness_summary.json. Again — only summary statistics, never raw bars.

What's deliberately left out (for now)

This probe handles only the pairwise question: "is candidate A redundant with feature B, one pair at a time?" The deeper conditional-dependence question — "does the candidate add anything given the whole rest of the panel together?" — is a known next step, called CODEC/FOCI (the top pick for that "Tier A2" job). It would plug in exactly where the Spearman matrix is built, inside run_one_cell(), but it is intentionally not wired in yet. That work is tracked in the audit's METRIC-EVALUATION-PROTOCOL document.

Bottom line. The orthogonality probe is the read-only, scope-locked gate that decides — on real bars across 21 windows and 6 crypto symbols, in every market regime — whether a proposed feature is genuinely new or just a redundant echo of what we already measure. Only candidates that clear it everywhere earn a "novel" verdict.