How it works

Methodology

Data sources, update schedule, signal families, and known limitations.

Essays

Long-form methodology writeups on specific topics.

Data

Prices and ticker metadata (sector, industry, country) come from Yahoo Finance, for 34,000+ securities across 70+ exchanges. Each exchange's data refreshes after its close; major venues also refresh intraday. Prices arrive split-adjusted from the source, and a nightly validation pass re-checks recent bars and recomputes affected signals when late corrections land. Sub-unit quote currencies (British pence, South African cents) are normalised where calculations need it.

Signals

21 signals across three families — trend, mean-reversion, and pattern — computed daily for the full universe. The family tag on every signal drives the Explorer's "By family" split and is the practical guide for composition in Daily Reports: stacking signals from the same family produces correlated evidence, not confirmation. Definitions and per-signal statistics are in the signal reference.

Backtests

Every historical trigger is measured from the next trading day's open over 1d / 5d / 20d / 60d / 252d horizons, on a global universe filtered to market cap ≥ $100M and price ≥ $1. Mean-based statistics are winsorized at the 1st/99th percentiles so data errors cannot dominate; significance uses Newey-West (HAC) errors plus a 200-iteration random-date permutation null. That null is baseline-centered per ticker, so it tests the trigger's timing rather than universe selection — but centering does not zero it (the null settles at the skew of each ticker's own alpha distribution, so read observed minus null, not either level), and it leaves era selection intact: real triggers cluster in particular market conditions while the random dates spread evenly across each ticker's history. Results are split by per-stock regime — trending = ADX(14) ≥ 25, high-vol = 20-day realized volatility ≥ 20% — and by sub-period (2015–19, 2020–22, 2023+). Each signal page states the run's window.

Benchmark

The primary benchmark is the S&P 500 Equal Weight. Triggered tickers are counted once each — an equal-weight construction — so a cap-weighted benchmark would flatter or punish signals for reasons that have nothing to do with the trigger. Cap-weighted S&P 500 and MSCI World appear as alternate views. The same long benchmark is used for both directions: for bearish triggers, negative alpha means the signal was right (the flagged stock underperformed).

Results — every signal, both directions

The full picture in one table — every signal, both directions, from the May–August 2026 global run. Reading guide: bullish works when α is positive, bearish when α is negative; p_perm is the random-date permutation test (≤0.05 beats random, ≥0.95 worse than random); with 36 sides tested at once, a few clearances are luck. Sub-20bps alpha is below realistic costs. Per-signal detail behind every row in the signal reference.

Every α figure here is measured the same way: hold the stock long after the trigger and subtract the benchmark's return over the same window — no sign flip for bearish signals. A bearish signal is doing its job when that long-α is negative.

Signal Dir Triggers α 20d α 60d Hit % p_perm Reading
bearish_trend_breakout bullish 699,289 +0.46% +0.60% 45.4% 0.005 beats random
bollinger bearish 1,340,526 +0.17% +0.58% 45.9% 0.995 worse than random (wrong-sign α 20d)
bollinger bullish 1,141,196 +0.09% +0.30% 46.3% 0.005 beats random
bullish_trend_breakdown bearish 383,286 -0.02% +0.01% 47.8% 0.005 beats random
cci bearish 2,055,769 +0.15% +0.47% 46.1% 1.000 worse than random (wrong-sign α 20d)
cci bullish 1,975,518 -0.16% +0.07% 45.1% 1.000 worse than random (wrong-sign α 20d)
double_bottom_breakdown bearish 110,750 +0.57% +0.48% 49.5% 1.000 worse than random (wrong-sign α 20d)
double_top_breakout bullish 109,934 -0.49% +0.01% 42.9% 1.000 worse than random (wrong-sign α 20d)
failed_double_bottom bullish 77,180 -0.34% -0.59% 43.9% 1.000 worse than random (wrong-sign α 20d)
failed_double_top bearish 72,982 +0.53% +0.37% 47.4% 1.000 worse than random (wrong-sign α 20d)
fresh_52w_high_low bearish 190,795 -0.12% -0.14% 46.0% 0.995 worse than random
fresh_52w_high_low bullish 252,149 +0.56% +1.54% 47.0% 0.005 beats random
hh_hl_streak bearish 1,373,240 +0.04% +0.27% 46.2% 0.010 beats random (wrong-sign α 20d)
hh_hl_streak bullish 1,330,266 +0.25% +0.54% 46.8% 0.005 beats random
hh_hl_structure bearish 259,100 +0.13% +0.28% 46.6% 1.000 worse than random (wrong-sign α 20d)
hh_hl_structure bullish 291,214 -0.33% -0.03% 44.5% 1.000 worse than random (wrong-sign α 20d)
ma_crossover bearish 114,830 -0.05% +0.24% 45.9% 0.015 beats random
ma_crossover bullish 114,205 +0.20% +0.16% 45.4% 0.005 beats random
macd bearish 1,619,865 +0.01% +0.34% 45.9% 0.005 beats random (wrong-sign α 20d)
macd bullish 1,623,285 +0.04% +0.38% 45.7% 0.945 inside null
new_52w_high_low bearish 931,164 +0.39% +0.79% 47.2% 1.000 worse than random (wrong-sign α 20d)
new_52w_high_low bullish 1,342,448 +0.52% +1.60% 46.8% 0.005 beats random
new_high_low bearish 3,648,033 +0.08% +0.20% 46.3% 1.000 worse than random (wrong-sign α 20d)
new_high_low bullish 4,096,873 +0.13% +0.41% 45.5% 0.507 inside null
rsi bearish 681,434 +0.47% +1.05% 46.7% 1.000 worse than random (wrong-sign α 20d)
rsi bullish 512,614 +0.25% +0.22% 47.4% 0.005 beats random
stochastics bearish 2,004,572 +0.23% +0.51% 46.8% 1.000 worse than random (wrong-sign α 20d)
stochastics bullish 2,109,657 -0.06% +0.19% 45.5% 1.000 worse than random (wrong-sign α 20d)
volume_breakout bearish 1,208,134 +0.23% +0.54% 46.3% 1.000 worse than random (wrong-sign α 20d)
volume_breakout bullish 1,859,223 +0.28% +0.83% 45.1% 0.005 beats random
vwap_cross bearish 2,548,884 +0.00% +0.27% 45.7% 0.005 beats random (wrong-sign α 20d)
vwap_cross bullish 2,550,434 -0.00% +0.27% 45.5% 1.000 worse than random (wrong-sign α 20d)
weekly_change bearish 1,520,392 +1.59% +2.49% 49.6% 1.000 worse than random (wrong-sign α 20d)
weekly_change bullish 2,143,741 +0.56% +1.56% 44.3% 0.831 inside null
williams_r bearish 2,763,882 +0.15% +0.40% 46.3% 1.000 worse than random (wrong-sign α 20d)
williams_r bullish 2,759,115 -0.12% +0.17% 45.3% 1.000 worse than random (wrong-sign α 20d)

Rendered at request time from the same per-signal backtest files the signal pages use, so the two can never disagree (each signal's window starts where its own price history does, between 1988-03-14 and 1996-12-16 — every signal page states its own; all windows end 2026-08-14, global universe, computed 2026-08-14). Combined signals (new_high_low and friends) take their bullish side from the high split and bearish from the low split, same as their pages.

“Wrong-sign α 20d” is a separate tradability check on the α 20d column, evaluated on every row whatever its p_perm verdict says: it marks the rows where that long-α points the wrong way for the direction — positive on a bearish signal, negative on a bullish one — so taking the signal's own side would have lost to the benchmark over the window. It is not a statement about p_perm, which scores a different quantity: each ticker's lift over its own baseline alpha rather than the raw mean printed in the α column. The two can disagree in both directions, so a row can clear the permutation test and still carry the flag, or fail it while the α column points the right way. The reading turns amber only where a passing verdict and a wrong-sign α coincide.

Signal pairs

Beyond single signals, same-day co-fires of two signals are backtested separately on four universes — US, Europe, Hong Kong, and China A-shares, each filtered to ADV ≥ $5M, price ≥ $5 and market cap ≥ $100M, each measured against its own regional benchmark. The cut that produces the published lists is Bonferroni significance on the full 2016–2026 sample, corrected across the whole grid of 549 sensible pairs × 5 horizons (2,745 hypotheses). That test is two-sided — it asks only whether the co-fire's α is reliably different from zero, in either direction — so a pair can survive by reliably underperforming, and 39 of the 199 survivors do (negative full-sample α). The same run also splits the sample — 2016–22 train, 2023+ held out — and every row whose held-out window produced at least 20 co-fires carries its held-out α, trigger count and permutation p, so you can see which survivors also held up out of sample and which did not; several did not. Rows below that minimum show a dash in the test columns — too few held-out observations to compute an out-of-sample figure, which is not the same as never co-firing again. Pair α keeps the long convention used everywhere in these docs: hold the stock long after the co-fire and subtract the benchmark — no shorting assumed, no sign flip for bearish legs. Survivors at the 20-day horizon: US (NYSE / NASDAQ / AMEX) 18 (vs ^SPXEW); Europe 20 (vs ^STOXX); Hong Kong 23 (vs ^HSI); China A-shares 138 (vs 83188.HK). Each signal page lists its own survivors under “Measured pairings” in the signal reference. The survivor set is mostly same-direction co-fires (147 of 199) — two signals agreeing, which is closer to one piece of evidence counted twice than to two independent confirmations. A smaller dip-buying cluster puts a bullish oscillator beside a ≥10% down week (7 of 199) — mechanically a “buy the crash that is already being bought” screen. China A-share survivors carry the largest α figures but skew small-cap, where costs and liquidity claim a large share of any measured edge.

CHRT indexes

The CHRT tree indexes are equal-weighted with daily rebalancing and periodic eligibility review, with minimum-price filtering and daily-return caps to keep single-name data glitches from distorting a group. Aggregate nodes carry Investable and Liquid variants that restrict constituents by size and traded value.

Divergence flags

The Explorer's divergence flags are backtested, not decorative. A thin-rally flag (group at a one-year price high while its 10-day breadth runs negative) has been followed by below-control group returns; a hidden-base flag (breadth building while price sits low) by above-control returns. Events vs matched controls, group-level alpha, permutation-tested:

Flag Events Horizon Event α Control α Event hit % Perm p (2-sided)
thin_rally 1,112 5d -0.14% +0.01% 46.0% 0.0095
thin_rally 1,112 21d -0.51% -0.02% 41.9% 0.0005
thin_rally 1,112 63d -0.89% -0.38% 44.4% 0.0360
hidden_base 1,934 5d +0.07% -0.08% 51.1% 0.0165
hidden_base 1,934 21d +0.17% -0.23% 49.9% 0.0010
hidden_base 1,934 63d +0.30% -0.23% 47.3% 0.0160

Group-level events on the geography+sector tree levels, event window through 2026-01-15. Historical tendency, not a prediction.

Regime markers

The regime page tracks 4 breadth conditions that carried a measured forward edge — episode-based (consecutive fires more than 5 days apart split episodes), trading-day horizons, S&P 500 forward returns:

Marker Episodes (2016–2026) Fwd 21td Fwd 63td
Baseline (all days) +1.2% +3.5%
Breadth washout (<20% of S&P above 200-DMA) 10 +4.8% +8.2%
Hindenburg Omen (global universe) 22 -1.9% +3.4%
90% down-volume day (S&P) 83 +1.7% +5.6%
90% up-volume day (S&P) 81 +1.4% +4.9%

These figures are the same numbers the regime monitor itself serves — one source of truth, so docs and monitor cannot diverge. Historical tendencies, not predictions.

The Saturday report's commentary uses a separate scenario model measured on weekly data — 569 weeks, 2015–2026, baseline forward returns +0.3% (1 week) and +1.1% (4 weeks). Its strongest measured scenarios: breadth washout +3.5%/4w (p<0.001); broken trend with intact momentum +3.4%/4w (p<0.01); a global Hindenburg week -2.3%/4w (p=0.05); a 90% down-volume day +2.1%/4w (p=0.05). Basis note: these are calendar-week figures and differ numerically from the episode-based table above (washout +3.5%/4w weekly vs +4.8%/21td episode-based) — different clocks, same phenomena, both stated so they cannot be mistaken for a contradiction.

Caveats

The universe reflects today's active tickers, so delisted names are under-represented — survivorship bias flatters absolute returns. Backtest figures assume zero transaction costs. Equal-weight averages over many small names overweight what a large portfolio could not actually hold. Every figure in these docs is a historical tendency, not a prediction and not a recommendation.