Half the lake's symbols cross a split
Found 2026-09-03, checking trainer#50 against our own data Status OPEN — the bars are unadjusted, as delivered Relevant to trainer#50, which found this first on a smaller sample
What we saw
trainer#50 reports Databento's ohlcv-1d is unadjusted and found 2 of 8
symbols contaminated over 400 sessions. Run against the 125 symbols now in
the lake, over four years:
symbols in lake 125
symbols with >=1 split-like jump 60 (48%)
total jumps 148
jumps beyond 5x (near-certain splits) 54
The largest, by close-to-close ratio:
RDGT 2026-04-08 0.0233 -> 3.46 x148.5
XTIA 2025-01-10 0.05 -> 7.04 x140.8
WETO 2026-08-03 0.0505 -> 6.63 x131.3
WBUY 2025-05-08 0.088 -> 9.12 x103.6
XPON 2024-10-09 0.03 -> 2.91 x97.0
...
BHVN 2022-10-04 151.8 -> 8.30 x0.055 (a forward split / spinoff)
RDGT 2026-03-24 2.95 -> 0.1375 x0.047
48%, not 25%. The rate is far higher here than trainer#50's sample because this desk trades small-caps and movers, and that universe reverse-splits constantly to hold a listing. It is a property of what we trade, not of the sample size.
Several are symbols the scorer has already produced numbers for: WCT (x46.4 on 2026-03-06), LIDR (x24.7 on 2023-12-27), NCPL (x56.9 on 2024-08-02), DAIC (x31.9 on 2026-06-01).
Why it matters — and precisely how much
Being exact about the blast radius, because it is narrower than the headline:
The scorer is largely insulated today. It reads tbbo inside one ride's
window — hours, occasionally a couple of days — and does not read daily bars at
all. A split only corrupts a score if it falls inside a ride's window, which
is rare, and a 40× discontinuity mid-ride would almost certainly trip the entry
gate or produce an obviously absurd R.
The lake is contaminated for anything reading long windows. Relative
strength, ATR, SMA distance, gap statistics, 20/60/120-day returns — every one
of those crosses split dates on half our symbols. trainer#50 measured
base_rs_60 for CRWD at −69.6%, entirely manufactured. That is what this
service is building the store for.
So: not urgent for scoring, blocking for the trainer, and the lake is the shared surface.
What we did
Pulled them. 106 corporate actions across 59 of 125 symbols now sit at
market-history/parquet/schema=splits/data.parquet, beside the raw bars.
src/splits.ts carries the arithmetic; bin/pull-splits.ts --verify reconciles.
Of the 148 observed jumps, 57 are real corporate actions and 91 are real moves. Clean splits leave a residual near x1.0 — BIAF's 30:1 gives x1.011, ASST's 5:1 gives x0.961 — which is what validates the factor arithmetic. AEHL 2025-04-04 is the instructive one: a 40:1 split AND a genuine 78% move on the same session, which is why matching is by DATE, not by magnitude. GPRO has 0 actions, exactly as trainer#50's fixture requires.
The bars stay raw. The lake layout already specifies the right shape — store bars unadjusted with a separate factors table, and apply at read — which matches trainer#50's own recommendation to keep the raw close alongside the adjusted series. The raw prices we have are correct as what printed; what is missing is the factors.
Worth stating why the obvious shortcut is wrong, since it will be tempting at 48%: you cannot detect splits by move size. trainer#50 makes the point with GPRO, which tripped a naive detector three times and has no splits — a $0.60 stock doubling on news is exactly what the movers lane exists to find. The detector above is a census, not a fix; every one of its 148 hits needs confirming against real corporate-action data before anything is adjusted.
Still open
- Pull the splits reference. Massive's
/v3/reference/splitsanswers it and the key is already on the box (MASSIVE_API_KEYin/opt/tradingdesk/.env). Store factors beside the bars in the lake as their own dataset. - Confirm the 148 candidates against that reference, and record which are real actions and which are real moves. GPRO is the fixture that proves a fix did not overreach.
- Dividends are a separate question — negligible at 5 sessions, measurable at 120 on a payer.
- Decide whether the scorer should refuse a ride that spans a split until factors exist. Currently it would score it, and the entry gate is the only thing likely to catch it.