Pennant population behavior — Baseline detection, 2007–2026¶
Read-only population-distribution analysis of every bull pennant the production detector emitted under Baseline parameters (pennant 5–15 bars, flagpole 1–10 bars, retrace ≤ 38.2 %, magnitude ≥ 12 %, ATR multiple ≥ 4×, volume ratio ≥ 1.5×, EMA-55 trend filter on). No backtest is performed, no strategy is proposed, and no detection runs were re-executed. Two independent categorizations are presented side-by-side: Part A applies a fixed 8-bucket hypothesis-driven schema; Part B lets unsupervised clustering choose its own partitioning.
Data sources:
- Pennant/ab_test/baseline_events.parquet (15,534 detections)
- Pennant/ab_test/baseline_outcomes.parquet (15,528 with outcomes;
6 dropped for no forward data)
- Pennant/analysis/baseline_trajectories.parquet (15,528 anchor +
30-trading-day forward close trajectories pulled fresh from
Postgres prices_daily)
- Postgres tickers for sector mapping; market_context for the
SPY-200SMA regime split.
All percentage returns are anchor-relative, computed as
(close[i]/anchor_close − 1) × 100, mirroring
uriel.outcomes.profiler._profile_one_event and the Phase 11a A/B
harness.
1. Headline statistics¶
| Metric | Value |
|---|---|
| Total pennants in population | 15,528 |
| Date range | 2007-02-15 → 2026-05-07 |
| Unique tickers with ≥ 1 detection | 2,413 |
MFE distribution¶
| mean | median | P25 | P75 | P90 | P95 | |
|---|---|---|---|---|---|---|
| MFE % | 13.92 | 7.50 | 2.67 | 16.01 | 30.87 | 46.26 |
MAE distribution¶
| mean | median | P25 | P75 | P10 | P5 | |
|---|---|---|---|---|---|---|
| MAE % | -9.54 | -6.59 | -13.64 | -2.23 | -23.21 | -31.00 |
Hit rates — % of population reaching MFE ≥ threshold within 30d¶
| ≥ +5 % | ≥ +10 % | ≥ +15 % | ≥ +20 % | ≥ +30 % | ≥ +50 % |
|---|---|---|---|---|---|
| 61.5 % | 40.5 % | 27.0 % | 18.9 % | 10.5 % | 4.3 % |
Loss rates — % of population reaching MAE ≤ threshold within 30d¶
| ≤ -5 % | ≤ -7 % | ≤ -10 % | ≤ -15 % | ≤ -20 % |
|---|---|---|---|---|
| 58.5 % | 47.9 % | 35.9 % | 21.7 % | 13.3 % |
Days-to-MFE-peak¶
| mean | median | P10 | P25 | P75 | P90 |
|---|---|---|---|---|---|
| 15.7 | 16 | 2 | 5 | 26 | 30 |
Days-to-MAE-trough¶
| mean | median | P10 | P25 | P75 | P90 |
|---|---|---|---|---|---|
| 14.8 | 14 | 1 | 5 | 25 | 29 |
The MFE and MAE distributions are striking in their near-symmetry on every percentile: ~62 % of patterns reach a +5 % peak; ~59 % reach a -5 % trough. ~41 % reach +10 %; ~36 % reach -10 %. The median peak (+7.5 %) and the median trough (-6.6 %) are within a percentage point of each other. Time-to-peak / time-to-trough are both centered around day 14–16 with wide spread — the typical pennant is not a fast resolution event.
Charts: ../../charts/Pennant/pennant_population_mfe_distribution.png,
../../charts/Pennant/pennant_population_mae_distribution.png,
../../charts/Pennant/pennant_population_days_to_peak.png.
Part A — Hypothesis-driven categorization (9 buckets)¶
Schema¶
Buckets are matched in order; lowest-numbered match wins.
- Sharp pop-up: MFE ≥ 15 % within 10 days; MAE never reaches -7 %.
- Slow pop-up: MFE ≥ 15 % in days 11–30; MAE never reaches -7 %.
- Pop then drop: MFE ≥ 15 % first, then MAE reaches -10 % within window (mfe_day < mae_day).
- Drop then recover: MAE ≤ -10 % first, then MFE reaches +10 % (mae_day < mfe_day).
- Sharp drop: MAE ≤ -15 % within 10 days; MFE never reaches +10 %.
- Slow drop: MAE ≤ -10 % in days 11–30; MFE never reaches +10 %.
- Chop / sideways: neither MFE +10 % nor MAE -10 % reached in 30 days.
- Stop-out then recover: MAE ≤ -7 % first, then MFE reaches +10 % (mae_day < mfe_day).
- Modest mover (catch-all): anything not matching 1–8. Empirically composed of (a) MFE in [10 %, 15 %) with shallow MAE, and (b) MFE in [10 %, 15 %) with MAE ≤ -10 % where the temporal order didn't fit categories 3 or 8.
The 9th bucket was added during execution after the original 8 left 2,109 patterns (13.6 %) unmatched — a structural gap in the schema around modest-magnitude moves. El Don approved the addition over the three alternative remedies (loosen Chop, lower the pop-up MFE threshold, leave "Unmatched" as-is). With bucket 9 in place, every pennant is categorized.
A.1 — Headline distribution¶
| Category | Count | % of pop | Median MFE | Median MAE | Median days-to-resolution |
|---|---|---|---|---|---|
| 1 Sharp pop-up | 244 | 1.6 % | +24.6 % | -0.9 % | 3 |
| 2 Slow pop-up | 2,781 | 17.9 % | +25.6 % | -1.1 % | 3 |
| 3 Pop then drop | 365 | 2.4 % | +21.2 % | -20.0 % | 8 |
| 4 Drop then recover | 567 | 3.6 % | +22.5 % | -14.0 % | 9 |
| 5 Sharp drop | 192 | 1.2 % | +1.3 % | -21.8 % | 3 |
| 6 Slow drop | 3,934 | 25.3 % | +1.5 % | -17.5 % | 3 |
| 7 Chop / sideways | 4,901 | 31.6 % | +4.9 % | -4.8 % | 8 |
| 8 Stop-out then recover | 435 | 2.8 % | +20.4 % | -8.3 % | 7 |
| 9 Modest mover (catch-all) | 2,109 | 13.6 % | +12.1 % | -3.5 % | 5 |
Pop-up family (1+2+9 winners portion): ~33 % of the population ends with a meaningful upside excursion. Of those, only 1.6 % are genuine sharp pop-ups (15 %+ within 10 days, no significant drawdown) — about 1 in 64.
Drop family (5+6+3): ~29 % see a meaningful downside excursion. 6 Slow drop alone is 25 % of the entire population — the single largest specific-pattern bucket. 3 Pop then drop (the worst case for any momentum strategy) is small at 2.4 %.
Chop (7): the largest bucket at 31.6 %. Pennants whose forward window resolves without either side reaching ±10 %.
Recovery patterns (4 + 8): combined ~6.5 %. These are patterns that hit a stop and bounced back — a strategy signal that "the trailing stop fired into a recovery".
A.2 — Magnitude histograms (up-categories)¶
For categories 1, 2, 4, and 8 (the up-resolving cohort), the distribution of realized MFE within each category:
| Category | n | mean MFE | P25 | P50 | P75 | P95 |
|---|---|---|---|---|---|---|
| 1 Sharp pop-up | 244 | 37.7 % | 18.5 % | 24.6 % | 36.3 % | 107.3 % |
| 2 Slow pop-up | 2,781 | 37.6 % | 19.2 % | 25.6 % | 40.1 % | 94.6 % |
| 4 Drop then recover | 567 | 36.0 % | 15.0 % | 22.5 % | 37.9 % | 107.3 % |
| 8 Stop-out then recover | 435 | 36.6 % | 13.6 % | 20.4 % | 32.6 % | 109.8 % |
The four up-categories have median MFE in the 20–26 % range and nearly identical mean MFE (~36–38 %) — once a pennant has qualified as "up-resolving" by any path, the magnitude distribution of the win is similar regardless of which path it took. P95 tail values sit at ~95–110 % in all four up-categories.
A.3 — Magnitude histograms (down-categories)¶
For categories 3, 5, and 6 (down-resolving cohort), distribution of realized MAE:
| Category | n | mean MAE | P25 | P50 | P75 | P5 |
|---|---|---|---|---|---|---|
| 3 Pop then drop | 365 | -23.6 % | -28.7 % | -20.0 % | -14.3 % | -50.3 % |
| 5 Sharp drop | 192 | -24.4 % | -28.8 % | -21.8 % | -17.3 % | -43.4 % |
| 6 Slow drop | 3,934 | -21.2 % | -25.3 % | -17.5 % | -13.3 % | -43.3 % |
Downside categories have median MAE in the -17 to -22 % range. Sharp drops are deeper but rarer: median -21.8 % vs slow drops' -17.5 %. P5 tail values are clustered around -43 to -50 % across the three downside categories — meaningful but not as extreme as the upside P95 tail (~95–110 %).
A.4 — Timing histograms¶
Days-to-MFE-peak by up-category and days-to-MAE-trough by down-category:
| Category | Median day to extreme | P25 | P75 |
|---|---|---|---|
| 1 Sharp pop-up | 8 (mfe_day) | 6 | 9 |
| 2 Slow pop-up | 26 (mfe_day) | 20 | 29 |
| 4 Drop then recover | 26 (mfe_day) | 21 | 29 |
| 8 Stop-out then recover | 27 (mfe_day) | 21 | 29 |
| 3 Pop then drop | 26 (mae_day) | 21 | 29 |
| 5 Sharp drop | 8 (mae_day) | 5 | 9 |
| 6 Slow drop | 25 (mae_day) | 19 | 29 |
Categories 1 and 5 are definitionally fast (≤ 10 days); 2 and 6 are definitionally slow (11–30 days), and indeed median around day 25–26. The non-trivial finding is that within the "definition allows fast OR slow" categories 4 and 8, the actual time-to-peak skews late (median 26–27 days) — patterns that recover from an early stop-out tend to do so near the end of the window, not in the middle. The downside Category 3 (Pop then drop) has its trough median at day 26 as well — once the pennant has peaked positively, the eventual deeper drop tends to land near the window's end.
A.5 — Per-year breakdown¶
Counts of each category by year (see analysis/partA_a5.parquet
for the full table):
| Year | Total | Sharp pop | Slow pop | Pop→drop | Drop→rec | Sharp drop | Slow drop | Chop | Stop→rec | Modest |
|---|---|---|---|---|---|---|---|---|---|---|
| 2007 | 400 | 1 | 84 | 6 | 9 | 2 | 103 | 132 | 10 | 53 |
| 2008 | 226 | 1 | 17 | 4 | 6 | 11 | 101 | 54 | 7 | 25 |
| 2009 | 702 | 14 | 153 | 20 | 58 | 10 | 141 | 160 | 40 | 106 |
| 2010 | 619 | 10 | 156 | 12 | 19 | 15 | 149 | 154 | 13 | 91 |
| 2011 | 471 | 8 | 65 | 7 | 12 | 6 | 146 | 148 | 16 | 63 |
| 2012 | 564 | 8 | 87 | 11 | 10 | 5 | 107 | 238 | 10 | 88 |
| 2013 | 875 | 13 | 187 | 4 | 18 | 8 | 136 | 349 | 27 | 133 |
| 2014 | 498 | 5 | 67 | 8 | 13 | 8 | 126 | 198 | 11 | 62 |
| 2015 | 533 | 5 | 57 | 13 | 7 | 6 | 147 | 222 | 8 | 68 |
| 2016 | 806 | 11 | 118 | 12 | 19 | 8 | 134 | 359 | 13 | 132 |
| 2017 | 871 | 6 | 153 | 14 | 26 | 4 | 152 | 347 | 24 | 145 |
| 2018 | 719 | 9 | 116 | 8 | 20 | 11 | 183 | 253 | 9 | 110 |
| 2019 | 748 | 7 | 94 | 9 | 5 | 9 | 178 | 329 | 10 | 107 |
| 2020 | 1,168 | 24 | 352 | 33 | 78 | 10 | 226 | 229 | 58 | 158 |
| 2021 | 1,336 | 25 | 248 | 43 | 54 | 16 | 329 | 413 | 43 | 165 |
| 2022 | 533 | 5 | 70 | 12 | 18 | 6 | 208 | 149 | 8 | 57 |
| 2023 | 1,024 | 12 | 154 | 34 | 30 | 10 | 356 | 277 | 31 | 120 |
| 2024 | 1,780 | 33 | 268 | 51 | 80 | 20 | 546 | 514 | 41 | 227 |
| 2025 | 1,232 | 32 | 282 | 56 | 68 | 17 | 314 | 269 | 40 | 154 |
| 2026 | 423 | 15 | 53 | 8 | 17 | 10 | 152 | 107 | 16 | 45 |
2020 stands out — the only year where Chop is not the largest or second-largest category. The vol regime drove patterns to resolve in one direction or the other rather than chop. 2024 is the busiest year by raw count (1,780 pennants), driven primarily by slow drops (546) — consistent with that year's choppy individual- ticker action despite the index uptrend.
Stacked-bar chart: ../../charts/Pennant/pennant_population_outcome_distribution_partA.png.
Part B — Data-driven categorization (k-means)¶
B.1 — Choice of k¶
K-means clustering on 5 features per pennant: MFE %, MAE %, days-to-MFE, days-to-MAE, endpoint return at 30 days. Features standardized to zero-mean / unit-variance. Each feature winsorized to its [1st, 99th] percentile before fitting, so a handful of penny-stock pops (MFE up to +1,795 %) don't form their own 2-element cluster. 84 events with truncated forward windows (endpoint_30d unavailable) excluded — k-means fit on n = 15,444.
Sweep k = 4, 5, 6, 7, 8. Within-cluster inertia and percentage improvement vs k-1:
| k | Inertia | % improvement |
|---|---|---|
| 4 | 24,694 | — |
| 5 | 21,511 | 12.9 % |
| 6 | 19,177 | 10.9 % |
| 7 | 17,081 | 10.9 % |
| 8 | 15,478 | 9.4 % |
After winsorization the elbow is shallow — every step from k = 4 onward yields roughly equivalent marginal inertia reduction (9.4–12.9 %). There is no decisive bend. Strict application of the "first step below 20 %" rule picks k = 4.
Manual override to k = 5, justified as follows. At k = 4, all positive-outcome patterns lump into a single "winners" cluster (centroid MFE +14 %, 46 % of population). At k = 5, that lump splits into: - Modest late-peaking winners (centroid MFE +10 %, MAE -5 %, peak late) — 37 % of population - Strong late-peaking winners (centroid MFE +34 %, MAE -3 %, peak late) — 12 % of population
And preserves the small "huge winners" cluster (centroid MFE +93 %, 2.8 %) intact. That tri-modal decomposition of the upside is the biggest interpretive lift in the range. k = 6 onward starts sub-dividing drop populations further, which adds little new narrative value. Choosing k = 5.
Elbow chart: ../../charts/Pennant/pennant_population_partB_elbow.png.
B.2 — Cluster summary¶
| Cluster | Count | % | MFE centroid | MAE centroid | mfe_day | mae_day | endpoint_30d | Plain-English name |
|---|---|---|---|---|---|---|---|---|
| 0 | 5,690 | 36.8 % | +10.2 % | -4.7 % | 23.6 | 7.9 | +6.0 % | Late modest winners — early shallow dip, slow drift to a modest peak near day 24, ends slightly positive |
| 1 | 1,841 | 11.9 % | +4.3 % | -31.2 % | 4.4 | 23.9 | -24.9 % | Sharp early disasters — fast small peak day 4, then collapses, ends deeply negative |
| 2 | 439 | 2.8 % | +92.6 % | -3.8 % | 23.8 | 4.5 | +67.6 % | Huge winners — small early dip, explosive run to ~+93 %, ends near +68 % |
| 3 | 1,887 | 12.2 % | +34.0 % | -2.7 % | 24.5 | 4.5 | +25.8 % | Strong late winners — modest early dip, run to ~+34 %, ends near +26 % |
| 4 | 5,587 | 36.2 % | +5.5 % | -10.0 % | 7.9 | 23.3 | -5.7 % | Slow drifters — small early pop, slow grind down to ~-10 % trough, ends slightly negative |
The clean tri-modal upside story is 2.8 % huge winners + 12.2 % strong winners + 36.8 % late modest winners = 51.8 % of patterns ending net positive. The downside is bimodal: 11.9 % sharp disasters + 36.2 % slow drifters = 48.1 % ending net negative. Endpoint-positive and endpoint-negative populations are within a percentage point of equal size — consistent with the MFE/MAE symmetry seen in Section 1.
B.3 — Magnitude and timing per cluster¶
Distribution of realized MFE/MAE within each cluster (from the underlying data, not just centroids):
| Cluster | MFE P25 | MFE P75 | MAE P25 | MAE P75 | mfe_day P25 | mfe_day P75 |
|---|---|---|---|---|---|---|
| 0 Late modest winners | 5.7 % | 14.2 % | -6.9 % | -1.1 % | 20 | 29 |
| 1 Sharp early disasters | -0.8 % | 6.0 % | -37.1 % | -23.9 % | 1 | 6 |
| 2 Huge winners | 74.7 % | 134.8 % | -7.3 % | +1.8 % | 20 | 29 |
| 3 Strong late winners | 24.9 % | 41.4 % | -4.9 % | +0.7 % | 21 | 29 |
| 4 Slow drifters | 1.1 % | 7.4 % | -14.2 % | -5.9 % | 3 | 12 |
The temporal signatures separate cleanly: clusters 0/2/3 peak late (P75 day 29), clusters 1/4 peak early (P75 day 6 and day 12 respectively). Cluster 1 (disasters) peaks at day 1–6 with a P75 MFE of only +6 %, then bleeds for the rest of the window. Note the MAE P75 values for clusters 2 and 3 are positive (+1.8 %, +0.7 %), meaning at least a quarter of patterns in those clusters never went below the anchor close at any forward day — pure uptrends.
B.4 — Per-year cluster distribution¶
| Year | Total | 0 Late-mod | 1 Sharp dis | 2 Huge | 3 Strong | 4 Drifter |
|---|---|---|---|---|---|---|
| 2007 | 400 | 156 | 35 | 5 | 58 | 146 |
| 2008 | 226 | 60 | 51 | 3 | 6 | 106 |
| 2009 | 702 | 303 | 80 | 31 | 109 | 179 |
| 2010 | 619 | 213 | 68 | 18 | 99 | 221 |
| 2011 | 471 | 182 | 51 | 8 | 37 | 193 |
| 2012 | 564 | 270 | 44 | 11 | 44 | 195 |
| 2013 | 875 | 426 | 38 | 12 | 132 | 267 |
| 2014 | 498 | 178 | 51 | 7 | 49 | 213 |
| 2015 | 533 | 188 | 53 | 5 | 39 | 248 |
| 2016 | 806 | 357 | 54 | 14 | 76 | 305 |
| 2017 | 871 | 386 | 52 | 20 | 105 | 308 |
| 2018 | 719 | 260 | 64 | 11 | 76 | 308 |
| 2019 | 748 | 336 | 77 | 15 | 47 | 273 |
| 2020 | 1,168 | 411 | 167 | 81 | 240 | 269 |
| 2021 | 1,336 | 496 | 176 | 60 | 172 | 432 |
| 2022 | 533 | 148 | 110 | 5 | 44 | 226 |
| 2023 | 1,024 | 329 | 191 | 13 | 111 | 380 |
| 2024 | 1,780 | 516 | 202 | 55 | 196 | 811 |
| 2025 | 1,232 | 371 | 225 | 59 | 217 | 360 |
| 2026 | 339 | 104 | 52 | 6 | 30 | 147 |
2008 and 2022 share a signature — disproportionate disaster share (51/226 = 23 %; 110/533 = 21 %), almost no huge winners (3 and 5 respectively). 2020 and 2009 share the opposite signature — heavy strong/huge winners as everything ripped off the crisis lows. 2024 is the modal year — slow drifters dominate (811/1,780 = 46 %).
Stacked-bar chart: ../../charts/Pennant/pennant_population_outcome_distribution_partB.png.
3. Time-to-reversal analysis¶
For each pennant we have the day of peak (mfe_day) and trough (mae_day) and the endpoint return at day 30. From these we compute two derived quantities:
- Give-back from peak (for up-resolving patterns, MFE > 0):
100 × (mfe_pct − endpoint_30d) / mfe_pct. Zero means the endpoint = peak (no give-back); 100 means the endpoint = anchor (all of the move evaporated); > 100 means the endpoint went negative despite a positive peak. Values clipped to [0, 200] for the summary. - Recovery from trough (for down-resolving patterns, MAE < 0):
100 × (mae_pct − endpoint_30d) / mae_pct. Zero means the endpoint = trough (no recovery); 100 means the endpoint = anchor (full recovery); > 100 means the endpoint went positive despite a negative trough.
Note: this uses endpoint_30d as the post-peak/trough reference. A fully trajectory-based reversal-depth analysis would also need the minimum close after the peak (or maximum after the trough), but the endpoint version is the cleanest one-number summary for trailing-stop decisions.
3.1 — Up-resolving give-back¶
n = 13,950 patterns with MFE > 0.
| Statistic | Value |
|---|---|
| Mean give-back % | 92.9 |
| Median give-back % | 68.4 |
| P10 | 0.0 |
| P25 | 17.8 |
| P75 | 200 (capped) |
| P90 | 200 (capped) |
The typical winner gives back ~68 % of its peak gain by day 30. P25 = 17.8 % means a quarter of winners retain at least 82 % of their peak; P75 capped at 200 means at least 25 % of winners end net negative despite hitting a positive peak (give-back > 100 %). The distribution is broad and heavy in the tails — pennants are not, on average, sustained-trend patterns.
3.2 — Down-resolving recovery¶
n = 13,838 patterns with MAE < 0.
| Statistic | Value |
|---|---|
| Mean recovery % | 103.3 |
| Median recovery % | 88.4 |
| P10 | 0.7 |
| P25 | 23.1 |
| P75 | 200 (capped) |
| P90 | 200 (capped) |
The typical loser recovers ~88 % of its decline by day 30. Half of losers recover almost all of their trough; at least 25 % recover more than the trough (end net positive). The symmetry with §3.1 is striking and reinforces that the median pennant move in either direction is mostly noise that mean-reverts inside 30 trading days.
3.3 — Median trajectories by outcome cohort¶
For three cohorts (each pennant assigned to exactly one based on its realized MFE/MAE):
- Top quartile of MFE (mfe_pct ≥ P75 = 16.0 %): n = 3,862
- Bottom quartile of MAE (mae_pct ≤ P25 = -13.6 %): n = 3,861
- Chop / sideways (mfe < 10 % and mae > -10 %): n = 4,858
For each cohort we compute the median of dN across the cohort for
each forward day N = 1…30, producing a "typical shape" trajectory.
The median top-quartile trajectory rises monotonically and ends at +18.6 % at day 30. The median bottom-quartile trajectory falls monotonically and ends at -15.3 % at day 30. The chop median oscillates within a ±2 % band and ends at +0.6 %. The three cohort medians are nearly mirror images of each other on the time axis — once the pennant has "decided" which way to resolve, the median trajectory in that direction is smooth, and the endpoint gap between top-quartile and bottom-quartile cohorts is ~34 percentage points.
Chart: ../../charts/Pennant/pennant_population_trajectory_typical_shapes.png.
4. Frequency by sector and regime¶
4.1 — Sector breakdown¶
| Sector | n | Mean MFE | Mean MAE | % hit +15 | % hit +10 | % hit -10 |
|---|---|---|---|---|---|---|
| Healthcare | 3,204 | 19.2 % | -12.3 % | 37.8 % | 50.6 % | 45.3 % |
| Technology | 2,693 | 13.8 % | -9.5 % | 27.4 % | 41.6 % | 36.2 % |
| Industrials | 2,538 | 11.7 % | -8.7 % | 21.9 % | 35.7 % | 33.0 % |
| Financial Services | 2,067 | 9.7 % | -8.7 % | 19.0 % | 32.4 % | 33.7 % |
| Consumer Cyclical | 1,916 | 13.0 % | -8.3 % | 24.0 % | 37.5 % | 31.4 % |
| Consumer Defensive | 744 | 9.6 % | -7.0 % | 18.4 % | 32.8 % | 27.3 % |
| Energy | 676 | 17.9 % | -10.7 % | 36.0 % | 49.4 % | 39.6 % |
| Basic Materials | 672 | 17.2 % | -10.1 % | 29.5 % | 41.2 % | 39.1 % |
| Communication Services | 589 | 12.4 % | -8.3 % | 27.8 % | 44.8 % | 29.7 % |
| Real Estate | 327 | 11.7 % | -7.1 % | 24.5 % | 33.3 % | 23.2 % |
| Utilities | 102 | 9.9 % | -7.4 % | 11.8 % | 22.6 % | 23.5 % |
Healthcare is the most active sector by volume (3,204 pennants, 20.6 % of the population) and the highest-variance on both sides — mean MFE 19.2 % is the highest in the table, mean MAE -12.3 % is also the deepest. Energy and Basic Materials follow the same high-variance profile. Utilities are the opposite: smallest cohort, smallest mean MFE, smallest mean MAE. Heavier-tail sectors (Healthcare, Energy, Basic Materials) carry both the upside and downside risk; defensive sectors (Utilities, Consumer Defensive) produce calmer pennants.
4.2 — Regime split (SPY 200-SMA)¶
| Regime | n | Mean MFE | Median MFE | Mean MAE | Median MAE | % hit +15 | % hit -10 |
|---|---|---|---|---|---|---|---|
| Bull (SPY > 200-SMA) | 14,197 | 14.10 % | 7.53 % | -9.35 % | -6.42 % | 27.2 % | 35.1 % |
| Bear (SPY < 200-SMA) | 1,331 | 12.02 % | 6.91 % | -11.67 % | -8.79 % | 24.6 % | 44.6 % |
The bear-regime cohort is 8.6 % of the population — pennants are emitted less often when SPY is below its 200-SMA but are still common. Bear-regime pennants are slightly worse on every dimension but the differences are modest: -2 pp lower hit-rate at +15 %, +9.5 pp higher loss-rate at -10 %, and the median MAE is ~2.4 pp deeper. The mean MFE difference (-2 pp) is also small. The pennant detector's edge is not regime-stable in expectation, but the regime hit isn't catastrophic either — bear-regime pennants still have a ~25 % shot at +15 % MFE.
Chart: ../../charts/Pennant/pennant_population_regime_split.png.
4.3 — Cross-regime category distribution (Part A)¶
| Category | Bear regime | Bull regime |
|---|---|---|
| 1 Sharp pop-up | 1.4 % | 1.6 % |
| 2 Slow pop-up | 15.6 % | 18.1 % |
| 3 Pop then drop | 2.3 % | 2.4 % |
| 4 Drop then recover | 3.7 % | 3.7 % |
| 5 Sharp drop | 2.0 % | 1.2 % |
| 6 Slow drop | 32.0 % | 24.7 % |
| 7 Chop / sideways | 26.6 % | 32.0 % |
| 8 Stop-out then recover | 3.3 % | 2.8 % |
| 9 Modest mover | 13.2 % | 13.6 % |
The biggest single regime delta is in Slow drop and Chop — in bear regimes, slow drops are 7.3 pp more common and chop is 5.4 pp less common. The bear regime pushes patterns toward resolution in the downside direction. The sharp-pop-up share is essentially unchanged (1.4 vs 1.6 %), and the strong-winner family (1+2+9) is about 2 pp lower in bear regimes. Compositionally, the bear regime trades chop for slow drops, but the rest of the distribution is stable.
5. Plain-English interpretation¶
The population is balanced and weakly noisy. Across 15,528 bull pennants over 19 years, the median forward 30-day peak is +7.5 % and the median trough is -6.6 %. The hit-rate curve and the loss-rate curve are within a percentage point of each other at every meaningful threshold. About a third of pennants chop sideways, about a third end the window net positive, about a third end net negative. From this aggregate alone, the unconditional pennant detector is producing a near-symmetric distribution of outcomes — the detector's edge, if any, has to come from either size-conditional selection (skew of the tails) or trade mechanics (asymmetric exit rules), not from the unconditional mean.
The biggest surprise is the give-back / recovery symmetry. The median winner retains only 32 % of its peak by day 30; the median loser recovers 88 % of its trough by day 30. Whichever side a pennant resolves to, the typical path is to retrace most of that move before the window ends. This has substantial implications for exit-rule design (which is out of scope for this report) but it also says something about the underlying pattern: pennants are not sustained-trend continuation patterns; they are bursts that often fade. Strategies that exit at or near the peak (rather than holding to day 30) are paying for a real phenomenon. Conversely, hard stops that get hit and then watch the position recover are also paying for a real phenomenon.
Two natural cohort decompositions converge on the same story. Part A's hypothesis-driven 9-bucket schema and Part B's data-driven 5-cluster partition produce different breakdowns but the underlying narrative is consistent: there is a small head of big winners (Part A: ~1.6 % Sharp pop-up + Part B: 2.8 % Huge winners + 12.2 % Strong winners), a large body of modest movers that mean-revert (Part A: ~32 % Chop + 13.6 % Modest mover + parts of Slow pop-up; Part B: 36.8 % Late modest winners + 36.2 % Slow drifters), and a left tail of disasters (Part A: ~3.6 % Sharp / Pop-then-drop / Sharp drop; Part B: 11.9 % Sharp early disasters). The data-driven view sees the disaster cohort as larger because it includes patterns the hypothesis schema would label as Slow drop; the hypothesis-driven view splits the disasters across categories 3, 5, and 6 by their trajectory shape rather than by their magnitude.
Regime sensitivity is modest, not stark. Bear-regime pennants are slightly worse on every dimension, but the slope is gentle — the +15 % hit-rate falls from 27.2 % (bull) to 24.6 % (bear); the -10 % loss-rate rises from 35.1 % to 44.6 %. The biggest categorical change is a 7.3 pp swing from Chop to Slow drop in bear regimes. This argues against a hard regime gate: blocking pennant entries when SPY < 200-SMA would skip roughly 9 % of the population in exchange for a small reduction in loss rate. (The Phase 7 study quantified this same effect at the level of a strategy and concluded the gate's value is in execution risk rather than close-to-close P&L; the population-level data here is consistent with that interpretation.)
The detector is sector-skewed but not fatally so. Healthcare alone is 21 % of the population and carries the highest variance on both sides. Technology, Industrials, and Financial Services together cover another 47 %. Utilities and Real Estate are small shares with the calmest distributions. Strategy designers will want to know that a Healthcare-heavy book carries materially higher tail risk on both sides than a Utility/Defensive book; sector-conditional sizing or selection is a research lever this report doesn't take a position on.
End of report. Companion artifacts in Pennant/analysis/:
section1.json, partA_a1.parquet, partA_a5.parquet,
partB_centroids.parquet, partB_elbow.parquet,
section3_up.parquet, section3_dn.parquet,
section3_medians.npz, section4_sector.parquet,
section4_regime_split.parquet, section4_cross.parquet,
df_with_categories.parquet. Reproducer scripts:
analysis/01_pull_trajectories.py, analysis/02_analyze.py.