Experiments / expB_artifact_baselines
expB_artifact_baselines
Artifact baselines: null distributions of bounce, staleness, non-synchronous lead-lag
View benchmark implementation (benchmark.py) →
Figures
Generated server-side from the latest committed results.json — never hand-typed.
Hypothesis
Hypothesis — expB_artifact_baselines#
Pre-specified 2026-08-12, before any real-data measurement. Detectors passed the §8.1 synthetic gate first (11 tests, benchmarks/synthetic/).
Hypothesis
The three mechanical artifacts identified in expA are MEASURABLE and
MATERIAL in this dataset at 1-minute resolution:
(i) bid-ask bounce produces negative AC1 in 1min returns, larger for
less liquid names (Roll-implied relative spread as the null level);
(ii) illiquid names are stale on a large fraction of RTH minutes;
(iii) LOCF-gridding makes SPY spuriously "lead" stale tickers at +1 min,
with the artifact magnitude increasing in staleness.
Falsification criterion
The experiment fails if the nulls are unusable as baselines: bounce AC1
indistinguishable from 0 across the liquidity spectrum (|median AC1| CI
covering 0 for the bottom-liquidity tercile), or no monotone relation
between staleness and the +1min SPY cross-correlation (Spearman rho <= 0
across tickers).
Artifact null(s)
This experiment BUILDS the artifact nulls; its own null is the synthetic
ground truth (§8.1 gate) — detectors verified to read 0 on random walks.
Method
Universe (pre-specified): LIQUID = {AAPL MSFT NVDA AMZN GOOGL META TSLA
JPM XOM UNH} + {SPY QQQ}; RANDOM = 30 tickers drawn from the full 1min
stock ticker list with numpy seed 42 (deterministic given the cached
list). Window: 2024-01-02 → 2024-04-01, RTH only (09:30 ≤ t < 16:00),
adjustment adj_split, all data via hf_client (cached).
Per ticker: staleness ratio on the 390-min RTH grid; trade-to-trade 1min
log-return AC1 with moving-block bootstrap CI (block = 1 day, n=300,
seed=42); Roll implied relative spread; VR(5), VR(30).
Cross: lagged xcorr (±3 min, NaN-aware, day-boundary safe) of LOCF-grid
returns vs SPY; SPX-vs-SPY as the index-staleness case.
This is a DESCRIPTIVE measurement of artifact levels, not an anomaly
claim: no OOS split; every number is Level 0 by construction.
Result
Run 20260812T055602Z (47 requests, 795 185 rows, 0 retries). 31/42
tickers had enough data (>=30 days, >=2000 returns); 11 dropped, listed
in results.json. Median by staleness tercile (staleness | AC1 | Roll rel
spread | VR30 | SPY-leads-+1min):
fresh 0.000 | -0.009 | 1.4 bp | 0.972 | +0.005
mid 0.107 | -0.051 | 3.8 bp | 0.901 | +0.047
stale 0.691 | -0.232 | 17.0 bp | 0.547 | +0.021
Spearman(staleness, SPY-leads-+1) = +0.43 (> 0: monotone). Extreme case
RITM.B: staleness 0.90, AC1 -0.253, VR30 0.35. Mega-caps: AC1 CI covers
0 and the Roll estimator is undefined (positive autocov) — no measurable
bounce at the top. SPX-vs-SPY: corr 0.965 at lag 0 and +0.065 with SPY
leading by 1 min (index prints lag the tradable ETF).
Interpretation
Both falsification criteria FAILED to trigger: the nulls are usable.
Headline: an uncorrected VR/AC1 scan on mid/low-liquidity names is
DOMINATED by artifacts — VR30 of 0.55 and AC1 of -0.23 arise with no
economic mean reversion whatsoever. All numbers Level 0 (descriptive
null levels), as pre-specified. Magnitudes recorded in
research/artifact_taxonomy.md.
Next experiment
expC (reversion scan) consumes these nulls: any reversion claim must
exceed the bounce null for its liquidity bucket. Phase 1 literature
sweep proceeds in parallel.Analysis
Analysis — expB_artifact_baselines#
Run: results/expB_artifact_baselines/20260812T055602Z/results.json
(hardware manifest embedded; 47 network requests, 795 185 rows, protocol
pre-specified in hypothesis.md; detectors passed the §8.1 synthetic gate —
11 tests — before touching this data).
The measured artifact nulls (Q1 2024, RTH 1min, 31 tickers)#
| Staleness tercile | median staleness | median AC1 | Roll rel. spread | VR(30) | SPY leads +1min |
|---|---|---|---|---|---|
| fresh | 0.000 | −0.009 | 1.4 bp | 0.972 | +0.005 |
| mid | 0.107 | −0.051 | 3.8 bp | 0.901 | +0.047 |
| stale | 0.691 | −0.232 | 17.0 bp | 0.547 | +0.021 |
- Bounce/staleness dominate naive reversion metrics. With zero planted economics, illiquid names show VR(30) = 0.55 and AC1 = −0.23 (extreme: RITM.B, 90 % stale minutes, VR30 = 0.35). Any reversion scan that does not clear these levels for its liquidity bucket is measuring market plumbing.
- Mega-caps show no measurable bounce at 1min: AAPL/SPY/NVDA AC1 CIs cover 0 and the Roll estimator is undefined (positive lag-1 autocov) — the bounce null is liquidity-dependent, not universal.
- The stale-price lead-lag artifact is real and monotone: SPY spuriously "leads" tickers by +1 min in proportion to their staleness (Spearman = +0.43). It peaks in the mid tercile (+0.047): the stalest names trade so rarely that even LOCF correlation collapses — the artifact is worst where it is least obvious.
- SPX-vs-SPY: contemporaneous corr 0.965, and a +0.065 cross-correlation with SPY leading by 1 minute. An "ETF price discovery leads the index" finding is manufactured by index print staleness — measured here so Q2 hypotheses must beat it.
Limitations#
Level 0 by construction (descriptive nulls; single quarter; one venue's bar convention). 11/42 tickers dropped for insufficient data — the null for ultra-illiquid names is therefore understated. Q1-2024-specific levels; expC should re-measure per period rather than reuse these constants blindly.
Verdict#
Complete — nulls established and usable. Both pre-specified
falsification criteria failed to trigger. Numbers are recorded in
research/artifact_taxonomy.md; expC (reversion scan) must report every
effect net of the bucket-matched bounce null, and expD must run the
synchronized-vs-raw timestamp comparison this experiment quantified.
README
expB_artifact_baselines#
Artifact baselines: null distributions of bounce, staleness, non-synchronous lead-lag
Status: completed 2026-08-12 — see analysis.md; null magnitudes recorded in research/artifact_taxonomy.md.
Result runs
- 20260812T055602Z / results.json 20.4 KiB