โ€บNavigation
Dashboard โ€บ Three-Axis Probes โ€บ Crypto Shared Data Pool โ€บ The 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.