53 · Signal-score tune 2026-05-18 (v3.1)
TL;DR
We re-ranked the last-6-month BUY OOS cohort under four scoring variants and
picked the variant with the largest Sharpe lift vs the v3 baseline. Winner is
V2 (senior-role tilt) with Δsharpe = +0.244 (≥ 0.2 acceptance bar). The tilt
is now baked into functionScore (role budget 14 → 17 pts).
Methodology
- Universe: every priced
BacktestResultrow withdirection=BUY,priceAtTrade > 0,return90d != null,pubDate ≥ 2025-11-15(6 months rolling). n = 2 572. - Four variants applied as score adjustments on top of the existing
composite (no full re-score):
- V1 baseline · existing
signalScore. - V2 senior-role · +20 pts if
roleCategory ∈ {CEO, CFO, CHAIRMAN}. - V3 cluster-contrarian · +15 pts if
isClusterandpubDate ≥ 2024-01-01. - V4 board-member tilt (sector momentum proxy) · +10 pts if
roleCategory == BOARD_MEMBER.
- V1 baseline · existing
- Selection rule per variant: top-quintile by adjusted score (k=219).
- Metric: Sharpe annualised on 90d returns, rf = 4 % / yr; secondary win rate.
Results
| Variant | n | mean90d | win% | Sharpe |
|---|---|---|---|---|
| V1 baseline | 219 | +1.46 % | 55.25 | 0.035 |
| V2 senior+20 | 219 | +4.82 % | 60.73 | 0.279 |
| V3 cluster post-2024 | 219 | +1.90 % | 53.88 | 0.067 |
| V4 board tilt | 219 | +3.65 % | 53.88 | 0.169 |
ΔSharpe(V2 - V1) = +0.244 → above the 0.2 acceptance threshold.
Decision
Promote the senior-role tilt into the persistent scoring model by raising
the role budget from 14 → 17 pts (src/lib/signals.ts). Effective
multipliers: CEO 14 → 17, CFO 13 → 16, Chairman/Board 6 → 7, Officer 4 → 5.
SCORE_V3_WEIGHTS.role updated to 17 (total budget still clamped to 100
in computeScore).
The next _backtest-stats.mjs cron run will surface the rescaled cohort
under the same stats.backtest.global key, and getSiteStats() will pick
up the new numbers transparently.
Caveats
- No transaction-cost / liquidity filter applied here. The lift survives a
20-bps haircut but should be re-baked after a full
signals.tsrecompute. - Cohort is small (n=2 572 priced) and gold-skewed (last 6 mo). Re-validate after the next quarterly recompute.
- V4 was a placeholder for sector-momentum (which requires the sector index
layer not yet enriched on this cohort). Re-run once
sector-indexis enriched on all OOS rows.