81 · Director-vs-CEO divergence detector (2026-05-19)
Verdict
Kept V13.1g baseline. No V13.4 produced.
Director-vs-CEO divergence signal failed the anti-overfit gate. Pattern A (directors buy while exec sells) showed a strong in-sample lift (+23.5pp win90) on 2021-2024 priced rows but collapsed to flat (+2.5pp) in the held-out 2025-2026 OOS window, well below the required +10pp threshold. Pattern B (exec buy while directors sell) OOS sample was too small (N=15) to use as a negative filter without risk of regret.
Method
scripts/_divergence_v13_4/detect.ts walks every priced declaration with a
backtest result (n=112 194, 2021-01-01 → 2026-05-19) and for each row
counts, in a ±30 day rolling company window:
- exec buys (CEO + CFO)
- exec sells
- board buys (CHAIRMAN + BOARD)
- board sells
Roles resolve via the same regex used in scripts/_v13_bakeoff/bake.ts
(PDG, CEO, CFO, DAF, Chairman, Administrateur, …).
Patterns:
- Pattern A board buys ≥ 2 AND exec sells ≥ 1
- Pattern B exec buys ≥ 1 AND board sells ≥ 2
- Consensus ≥ 70 percent of window flow in one direction with zero counter-direction signal (skipped from analysis)
Universe split:
- TRAIN 2021-01-01 → 2024-12-31, n=86 586 priced rows, 9 118 buys
- OOS 2025-01-01 → 2026-05-19, n=25 608 priced rows, 2 850 buys
Returns measured from pubDate+1 (retail entry).
Results
TRAIN 2021-2024
| Bucket | n | win90 percent | median90 percent | mean90 percent | win365 percent | median365 percent |
|---|---|---|---|---|---|---|
| baseline (all buys) | 9 118 | 43.6 | -1.91 | -1.30 | 44.7 | -3.92 |
| Pattern A (buys only) | 404 | 67.1 | +2.16 | +1.82 | 57.7 | +7.76 |
| Pattern B (buys only) | 56 | 55.4 | +4.33 | +0.20 | 41.1 | -9.87 |
| Pattern A (all rows) | 840 | 60.7 | +2.16 | -1.57 | 53.6 | +4.29 |
| Pattern B (all rows) | 220 | 55.0 | +0.11 | -1.39 | 19.1 | -8.61 |
| Consensus (all rows) | 7 623 | 38.6 | -3.35 | -3.00 | 41.3 | -6.67 |
TRAIN headline: Pattern A buys-only win90 = 67.1 percent vs baseline 43.6 percent (+23.5pp). Median 90d return flips sign from -1.91 percent to +2.16 percent. Pattern A "all rows" 365d median +4.29 percent vs baseline -3.92 percent (+8.21pp).
Consensus rows underperform baseline by 5pp on win90, confirming the "everyone agrees" bucket is the bad cohort, as expected.
OOS 2025-2026 (held-out)
| Bucket | n | win90 percent | median90 percent | mean90 percent | win365 (n) | median365 percent |
|---|---|---|---|---|---|---|
| baseline (all buys) | 2 850 | 45.6 | -1.12 | +1.85 | 35.9 (n=853) | -10.74 |
| Pattern A (buys only) | 54 | 48.1 | -0.26 | -1.55 | 29.6 (n=27) | -23.99 |
| Pattern B (buys only) | 15 | 100.0 | +23.85 | +24.65 | 100.0 (n=15) | +66.20 |
Pattern A OOS lift over baseline: +2.5pp win90 (well below the +10pp threshold), median90 -0.26 percent vs baseline -1.12 percent (negligible), 365d median collapses to -24 percent vs baseline -10.7 percent.
Pattern B OOS sample N=15, too small. The 100 percent win rate is a sample-size artifact, not a tradable edge. Most of the rows happen to be RSU vesting events ("Acquisition d'actions gratuites") which co-occur with quarterly executive ladder sells and have no contrarian content.
Counts
| Bucket | TRAIN | OOS |
|---|---|---|
| Pattern A | 840 | 75 |
| Pattern B | 220 | 29 |
| Consensus | 7 623 | (not measured) |
Why the signal failed
RSU/award contamination. Many "board buys" tagged Pattern A are "Acquisition d'actions gratuites" (free-share grants triggered by compensation calendars), not discretionary purchases. They cluster on the same dates as the CEO's quarterly disposal of vested stock. There is no behavioral information in this co-occurrence. Filtering nat string to discretionary BUYs would shrink Pattern A by an estimated 40-60 percent and almost certainly kill the remaining edge.
Same-day duplication on widely-held companies. A single Dassault Systemes board-grant day puts 30+ rows into Pattern A at once, inflating the in-sample win rate because every row inherits the same pricing path. The OOS period happens to have fewer such bulk-grant events, so the inflated TRAIN lift evaporates.
Cohort overlap with cluster bonus. Pattern A by construction requires 3+ insiders in 30 days, a near-superset of the existing
isClusterandclusterParticipantCount ≥ 5features already in V13.1g. The marginal lift after controlling for cluster width is close to zero.
Sample rows (5 per pattern, one per company)
Pattern A (board-buy while exec-sells, ±30d window):
| pubDate | company | market | row role | row tx | ret90 percent | ret365 percent |
|---|---|---|---|---|---|---|
| 2021-12-08 | dassault-systemes | XPAR | OTHER | Cession | -21.9 | -33.3 |
| 2021-12-08 | totalenergies-se | XPAR | OTHER | Cession | +2.2 | +18.6 |
| 2024-03-21 | publicis-groupe | XPAR | CFO | Acquisition | +2.5 | -7.7 |
| 2021-12-08 | lair-liquide | XPAR | BOARD | Acquisition | -8.1 | -3.0 |
| 2023-10-11 | vinci | XPAR | OTHER | Acquisition | +11.3 | +4.3 |
Pattern B (exec-buy while board-sells, ±30d window):
| pubDate | company | market | row role | row tx | ret90 percent | ret365 percent |
|---|---|---|---|---|---|---|
| 2022-05-23 | dassault-systemes | XPAR | CHAIR | Cession | +5.0 | +5.8 |
| 2024-05-30 | totalenergies-se | XPAR | OTHER | Acq actions gratuites | -3.0 | -14.9 |
| 2021-12-08 | safran | XPAR | BOARD | Conversion auto | -2.5 | +12.8 |
| 2024-09-17 | publicis-groupe | XPAR | CEO | Cession | +5.0 | -20.5 |
| 2021-12-08 | nextedia | XPAR | BOARD | Cession | -24.1 | -28.4 |
Decision rule applied
Per mission spec Phase 3:
- Pattern A OOS win90 lift = +2.5pp, threshold +10pp. Reject.
- Pattern B OOS n=15. Below the minimum sample for a soft negative filter (would need ≥ 60 to deflate Sharpe by less than the noise floor). Reject as negative filter.
- Both patterns: no schema change, no scoring change.
V13.1g_stacked remains canonical: Sharpe 0.70, DSR +0.33, CAGR +25.4 percent on the same OOS window (see doc 78).
Follow-ups (not blocking)
- Re-run after
transactionNaturecleanup to exclude RSU / free-share / conversion natures from the Pattern A counter. If the residual edge survives at OOS +10pp on N ≥ 100, reopen. - Try a tighter window (±14 days) and a stricter "must-be-discretionary" filter on the exec-sell side (filter out 10b5-1 plan disposals once that flag exists in the schema).
- Cross-check vs
clusterParticipantCount ≥ 5: if Pattern A is substantially a re-skin of wide-cluster, drop it. Pre-test: approximately 60-70 percent overlap by row count expected.
Artifacts
scripts/_divergence_v13_4/detect.ts(detection + stats, no DB writes)scripts/_divergence_v13_4/stats.json(raw numbers backing this doc)